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
43typedef Py_ssize_t (*dict_lookup_func)(PyDictObject*, PyObject*, Py_hash_t,
44 PyObject**);
45
46// for 3.0 support (backwards compatibility, really)
47#define cpyrt_PyText_Check PyUnicode_Check
48#define cpyrt_PyText_CheckExact PyUnicode_CheckExact
49#define cpyrt_PyText_AsString PyUnicode_AsUTF8
50#define cpyrt_PyText_AsStringChecked PyUnicode_AsUTF8
51#define cpyrt_PyText_GetSize PyUnicode_GetSize
52#define cpyrt_PyText_GET_SIZE PyUnicode_GET_LENGTH
53#define cpyrt_PyUnicode_GET_SIZE PyUnicode_GET_LENGTH
54#define cpyrt_PyText_FromFormat PyUnicode_FromFormat
55#define cpyrt_PyText_FromString PyUnicode_FromString
56#define cpyrt_PyText_InternFromString PyUnicode_InternFromString
57#define cpyrt_PyText_Append PyUnicode_Append
58#define cpyrt_PyText_AppendAndDel PyUnicode_AppendAndDel
59#define cpyrt_PyText_FromStringAndSize PyUnicode_FromStringAndSize
60
61#define _cpyrt_PyText_AsStringAndSize PyUnicode_AsUTF8AndSize
62
63static inline const char* cpyrt_PyText_AsStringAndSize(PyObject* pystr,
64 Py_ssize_t* size) {
65 const char* cstr = _cpyrt_PyText_AsStringAndSize(pystr, size);
66 if (!cstr && PyBytes_CheckExact(pystr)) {
67 PyErr_Clear();
68 PyBytes_AsStringAndSize(pystr, (char**)&cstr, size);
69 }
70 return cstr;
71}
72
73#define cpyrt_PyText_Type PyUnicode_Type
74
75#define PyIntObject PyLongObject
76#define PyInt_Check PyLong_Check
77#define PyInt_AsLong PyLong_AsLong
78#define PyInt_AS_LONG PyLong_AsLong
79#define PyInt_AsSsize_t PyLong_AsSsize_t
80#define PyInt_CheckExact PyLong_CheckExact
81#define PyInt_FromLong PyLong_FromLong
82#define PyInt_FromSsize_t PyLong_FromSsize_t
83
84#define PyInt_Type PyLong_Type
85
86#define cpyrt_PyCapsule_New PyCapsule_New
87#define cpyrt_PyCapsule_CheckExact PyCapsule_CheckExact
88#define cpyrt_PyCapsule_GetPointer PyCapsule_GetPointer
89
90#define CPPJIT__long__ "__int__"
91#define CPPJIT__idiv__ "__itruediv__"
92#define CPPJIT__div__ "__truediv__"
93#define CPPJIT__next__ "__next__"
94
95#define Py_TPFLAGS_HAVE_RICHCOMPARE 0
96#define Py_TPFLAGS_CHECKTYPES 0
97
98#define PyClass_Check PyType_Check
99
100#define PyBuffer_Type PyMemoryView_Type
101
102#define cpyrt_PySliceCast PyObject*
103#define PyUnicode_GetSize PyUnicode_GetLength
104
105#define cpyrt_PyUnicode_AsWideChar PyUnicode_AsWideChar
106
107#ifdef R__MACOSX
108#if SIZEOF_SIZE_T == SIZEOF_INT
109#if defined(MAC_OS_X_VERSION_10_4)
110#define PY_SSIZE_T_FORMAT "%ld"
111#else
112#define PY_SSIZE_T_FORMAT "%d"
113#endif
114#elif SIZEOF_SIZE_T == SIZEOF_LONG
115#define PY_SSIZE_T_FORMAT "%ld"
116#endif
117#else
118#define PY_SSIZE_T_FORMAT "%zd"
119#endif
120
121#ifndef Py_RETURN_NONE
122#define Py_RETURN_NONE return Py_INCREF(Py_None), Py_None
123#endif
124
125#ifndef Py_RETURN_TRUE
126#define Py_RETURN_TRUE return Py_INCREF(Py_True), Py_True
127#endif
128
129#ifndef Py_RETURN_FALSE
130#define Py_RETURN_FALSE return Py_INCREF(Py_False), Py_False
131#endif
132
133// vector call support
134#define cpyrt_PyCFunction_Call PyObject_Call
135
136// vector call support
137typedef PyObject* const* cpyrt_PyArgs_t;
139 Py_ssize_t i) {
140 return args[i];
141}
142static inline PyObject* cpyrt_PyArgs_SET_ITEM(cpyrt_PyArgs_t args, Py_ssize_t i,
143 PyObject* item) {
144 return ((PyObject**)args)[i] = item;
145}
146static inline Py_ssize_t cpyrt_PyArgs_GET_SIZE(cpyrt_PyArgs_t, size_t nargsf) {
147 return PyVectorcall_NARGS(nargsf);
148}
149static inline cpyrt_PyArgs_t cpyrt_PyArgs_New(Py_ssize_t N) {
150 return (cpyrt_PyArgs_t)PyMem_Malloc(N * sizeof(PyObject*));
151}
152static inline void cpyrt_PyArgs_DEL(cpyrt_PyArgs_t args) {
153 PyMem_Free((void*)args);
154}
155#define cpyrt_PyObject_Call PyObject_Vectorcall
156inline PyObject* cpyrt_tp_call(PyObject* cb, cpyrt_PyArgs_t args, size_t nargsf,
157 PyObject* kwds) {
158 Py_ssize_t offset = Py_TYPE(cb)->tp_vectorcall_offset;
159 vectorcallfunc func = *(vectorcallfunc*)(((char*)cb) + offset);
160 return func(cb, args, nargsf, kwds);
161}
162
163#ifndef Py_TPFLAGS_HAVE_VECTORCALL
164#define Py_TPFLAGS_HAVE_VECTORCALL _Py_TPFLAGS_HAVE_VECTORCALL
165#endif
166
167// weakref forced strong reference
168#if PY_VERSION_HEX < 0x30d0000
169static inline PyObject* cpyrt_GetWeakRef(PyObject* ref) {
170 PyObject* pyobject = PyWeakref_GetObject(ref);
171 if (!pyobject || pyobject == Py_None)
172 return nullptr;
173 Py_INCREF(pyobject);
174 return pyobject;
175}
176#else
177static inline PyObject* cpyrt_GetWeakRef(PyObject* ref) {
178 PyObject* pyobject = nullptr;
179 if (PyWeakref_GetRef(ref, &pyobject) != -1)
180 return pyobject;
181 return nullptr;
182}
183#endif
184
185// C++ version of the cppjit API
186#include "cppjit_interop.h"
187
188// export macros for our own API
189#include "cpyrt/CommonDefs.h"
190
191// --- reusable PyTypeObject initializer tail -------------------------------
192// Members appended to PyTypeObject in newer CPython releases. Every cpyrt
193// type leaves all of these zero/null-initialized, so they share one tail.
194// To support a future Python version, add one block below and one line to
195// CPYRT_PYTYPE_TAIL.
196
197#if PY_VERSION_HEX >= 0x030c0000
198#define CPYRT_TP_WATCHED , 0 /* tp_watched (>= 3.12) */
199#else
200#define CPYRT_TP_WATCHED
201#endif
202
203#if PY_VERSION_HEX >= 0x030d0000
204#define CPYRT_TP_VERSIONS_USED , 0 /* tp_versions_used(>= 3.13) */
205#else
206#define CPYRT_TP_VERSIONS_USED
207#endif
208
209#if PY_VERSION_HEX >= 0x030f0000
210#define CPYRT_TP_ITERITEM , nullptr /* _tp_iteritem (>= 3.15) */
211#else
212#define CPYRT_TP_ITERITEM
213#endif
214
215#define CPYRT_PYTYPE_TAIL \
216 CPYRT_TP_WATCHED \
217 CPYRT_TP_VERSIONS_USED \
218 CPYRT_TP_ITERITEM
219// --------------------------------------------------------------------------
220
221#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:142
static void cpyrt_PyArgs_DEL(cpyrt_PyArgs_t args)
Definition cpyrt.h:152
Py_ssize_t(* dict_lookup_func)(PyDictObject *, PyObject *, Py_hash_t, PyObject **)
Definition cpyrt.h:43
PyObject *const * cpyrt_PyArgs_t
Definition cpyrt.h:137
static const char * cpyrt_PyText_AsStringAndSize(PyObject *pystr, Py_ssize_t *size)
Definition cpyrt.h:63
static Py_ssize_t cpyrt_PyArgs_GET_SIZE(cpyrt_PyArgs_t, size_t nargsf)
Definition cpyrt.h:146
PyObject * cpyrt_tp_call(PyObject *cb, cpyrt_PyArgs_t args, size_t nargsf, PyObject *kwds)
Definition cpyrt.h:156
static cpyrt_PyArgs_t cpyrt_PyArgs_New(Py_ssize_t N)
Definition cpyrt.h:149
static PyObject * cpyrt_PyArgs_GET_ITEM(cpyrt_PyArgs_t args, Py_ssize_t i)
Definition cpyrt.h:138
#define _cpyrt_PyText_AsStringAndSize
Definition cpyrt.h:61
static PyObject * cpyrt_GetWeakRef(PyObject *ref)
Definition cpyrt.h:169
Py_ssize_t dim_t
Definition API.h:100