Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
cpyrt.h
Go to the documentation of this file.
1#ifndef CPYRT_CPYRT_H
2#define CPYRT_CPYRT_H
3
4#ifdef _WIN32
5// Disable warning C4275: non dll-interface class
6#pragma warning(disable : 4275)
7// Disable warning C4251: needs to have dll-interface to be used by clients
8#pragma warning(disable : 4251)
9// Disable warning C4800: 'int' : forcing value to bool
10#pragma warning(disable : 4800)
11// Avoid that pyconfig.h decides using a #pragma what library python library to
12// use
13// #define MS_NO_COREDLL 1
14#endif
15
16// to prevent problems with fpos_t and redefinition warnings
17#if defined(linux)
18
19#include <stdio.h>
20
21#ifdef _POSIX_C_SOURCE
22#undef _POSIX_C_SOURCE
23#endif
24
25#ifdef _FILE_OFFSET_BITS
26#undef _FILE_OFFSET_BITS
27#endif
28
29#ifdef _XOPEN_SOURCE
30#undef _XOPEN_SOURCE
31#endif
32
33#endif // linux
34
35#define PY_SSIZE_T_CLEAN
36#include "Python.h"
37#include <sys/types.h>
38
39namespace cppjit::cpyrt {
40typedef Py_ssize_t dim_t;
41} // namespace cppjit::cpyrt
42
43// like PyUnicode_AsUTF8AndSize, but also accepts bytes
44static inline const char* cpyrt_PyText_AsStringAndSize(PyObject* pystr,
45 Py_ssize_t* size) {
46 const char* cstr = PyUnicode_AsUTF8AndSize(pystr, size);
47 if (!cstr && PyBytes_CheckExact(pystr)) {
48 PyErr_Clear();
49 PyBytes_AsStringAndSize(pystr, (char**)&cstr, size);
50 }
51 return cstr;
52}
53
54#ifdef R__MACOSX
55#if SIZEOF_SIZE_T == SIZEOF_INT
56#if defined(MAC_OS_X_VERSION_10_4)
57#define PY_SSIZE_T_FORMAT "%ld"
58#else
59#define PY_SSIZE_T_FORMAT "%d"
60#endif
61#elif SIZEOF_SIZE_T == SIZEOF_LONG
62#define PY_SSIZE_T_FORMAT "%ld"
63#endif
64#else
65#define PY_SSIZE_T_FORMAT "%zd"
66#endif
67
68#ifndef Py_RETURN_NONE
69#define Py_RETURN_NONE return Py_INCREF(Py_None), Py_None
70#endif
71
72#ifndef Py_RETURN_TRUE
73#define Py_RETURN_TRUE return Py_INCREF(Py_True), Py_True
74#endif
75
76#ifndef Py_RETURN_FALSE
77#define Py_RETURN_FALSE return Py_INCREF(Py_False), Py_False
78#endif
79
80// vector call support
81typedef PyObject* const* cpyrt_PyArgs_t;
83 Py_ssize_t i) {
84 return args[i];
85}
86static inline PyObject* cpyrt_PyArgs_SET_ITEM(cpyrt_PyArgs_t args, Py_ssize_t i,
87 PyObject* item) {
88 return ((PyObject**)args)[i] = item;
89}
90static inline Py_ssize_t cpyrt_PyArgs_GET_SIZE(cpyrt_PyArgs_t, size_t nargsf) {
91 return PyVectorcall_NARGS(nargsf);
92}
93static inline cpyrt_PyArgs_t cpyrt_PyArgs_New(Py_ssize_t N) {
94 return (cpyrt_PyArgs_t)PyMem_Malloc(N * sizeof(PyObject*));
95}
96static inline void cpyrt_PyArgs_DEL(cpyrt_PyArgs_t args) {
97 PyMem_Free((void*)args);
98}
99#define cpyrt_PyObject_Call PyObject_Vectorcall
100inline PyObject* cpyrt_tp_call(PyObject* cb, cpyrt_PyArgs_t args, size_t nargsf,
101 PyObject* kwds) {
102 Py_ssize_t offset = Py_TYPE(cb)->tp_vectorcall_offset;
103 vectorcallfunc func = *(vectorcallfunc*)(((char*)cb) + offset);
104 return func(cb, args, nargsf, kwds);
105}
106
107#ifndef Py_TPFLAGS_HAVE_VECTORCALL
108#define Py_TPFLAGS_HAVE_VECTORCALL _Py_TPFLAGS_HAVE_VECTORCALL
109#endif
110
111// weakref forced strong reference
112#if PY_VERSION_HEX < 0x30d0000
113static inline PyObject* cpyrt_GetWeakRef(PyObject* ref) {
114 PyObject* pyobject = PyWeakref_GetObject(ref);
115 if (!pyobject || pyobject == Py_None)
116 return nullptr;
117 Py_INCREF(pyobject);
118 return pyobject;
119}
120#else
121static inline PyObject* cpyrt_GetWeakRef(PyObject* ref) {
122 PyObject* pyobject = nullptr;
123 if (PyWeakref_GetRef(ref, &pyobject) != -1)
124 return pyobject;
125 return nullptr;
126}
127#endif
128
129// C++ version of the cppjit API
130#include "cppjit_interop.h"
131
132// export macros for our own API
133#include "cpyrt/CommonDefs.h"
134
135// --- reusable PyTypeObject initializer tail -------------------------------
136// Members appended to PyTypeObject in newer CPython releases. Every cpyrt
137// type leaves all of these zero/null-initialized, so they share one tail.
138// To support a future Python version, add one block below and one line to
139// CPYRT_PYTYPE_TAIL.
140
141#if PY_VERSION_HEX >= 0x030c0000
142#define CPYRT_TP_WATCHED , 0 /* tp_watched (>= 3.12) */
143#else
144#define CPYRT_TP_WATCHED
145#endif
146
147#if PY_VERSION_HEX >= 0x030d0000
148#define CPYRT_TP_VERSIONS_USED , 0 /* tp_versions_used(>= 3.13) */
149#else
150#define CPYRT_TP_VERSIONS_USED
151#endif
152
153#if PY_VERSION_HEX >= 0x030f0000
154#define CPYRT_TP_ITERITEM , nullptr /* _tp_iteritem (>= 3.15) */
155#else
156#define CPYRT_TP_ITERITEM
157#endif
158
159#define CPYRT_PYTYPE_TAIL \
160 CPYRT_TP_WATCHED \
161 CPYRT_TP_VERSIONS_USED \
162 CPYRT_TP_ITERITEM
163// --------------------------------------------------------------------------
164
165#endif // !CPYRT_CPYRT_H
_object PyObject
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
#define N
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h offset
static PyObject * cpyrt_PyArgs_SET_ITEM(cpyrt_PyArgs_t args, Py_ssize_t i, PyObject *item)
Definition cpyrt.h:86
static void cpyrt_PyArgs_DEL(cpyrt_PyArgs_t args)
Definition cpyrt.h:96
PyObject *const * cpyrt_PyArgs_t
Definition cpyrt.h:81
static const char * cpyrt_PyText_AsStringAndSize(PyObject *pystr, Py_ssize_t *size)
Definition cpyrt.h:44
static Py_ssize_t cpyrt_PyArgs_GET_SIZE(cpyrt_PyArgs_t, size_t nargsf)
Definition cpyrt.h:90
PyObject * cpyrt_tp_call(PyObject *cb, cpyrt_PyArgs_t args, size_t nargsf, PyObject *kwds)
Definition cpyrt.h:100
static cpyrt_PyArgs_t cpyrt_PyArgs_New(Py_ssize_t N)
Definition cpyrt.h:93
static PyObject * cpyrt_PyArgs_GET_ITEM(cpyrt_PyArgs_t args, Py_ssize_t i)
Definition cpyrt.h:82
static PyObject * cpyrt_GetWeakRef(PyObject *ref)
Definition cpyrt.h:113
Py_ssize_t dim_t
Definition API.h:100