22# undef _POSIX_C_SOURCE
30#define PY_SSIZE_T_CLEAN 1
34#ifndef LINK_ALL_STATIC
36#elif defined(__GNUC__)
37# define EXPCL_PYPANDA __attribute__((weak))
39# define EXPCL_PYPANDA extern inline
46# define Py_RETURN_NONE return Py_INCREF(Py_None), Py_None
50# define Py_RETURN_TRUE return Py_INCREF(Py_True), Py_True
53#ifndef Py_RETURN_FALSE
54# define Py_RETURN_FALSE return Py_INCREF(Py_False), Py_False
60#if PY_VERSION_HEX < 0x02050000
61typedef int Py_ssize_t;
62# define PyInt_FromSsize_t PyInt_FromLong
63# define PyInt_AsSsize_t PyInt_AsLong
69# define Py_TYPE(ob) (((PyObject*)(ob))->ob_type)
74#ifndef PyVarObject_HEAD_INIT
75 #define PyVarObject_HEAD_INIT(type, size) \
76 PyObject_HEAD_INIT(type) size,
81#if PY_VERSION_HEX < 0x03020000
82# define PyErr_NewExceptionWithDoc(name, doc, base, dict) \
83 PyErr_NewException(name, base, dict)
89#ifndef Py_TPFLAGS_CHECKTYPES
90# define Py_TPFLAGS_CHECKTYPES 0
94#if PY_MAJOR_VERSION >= 3
95# define nb_nonzero nb_bool
96# define nb_divide nb_true_divide
97# define nb_inplace_divide nb_inplace_true_divide
99# define PyLongOrInt_Check(x) PyLong_Check(x)
100# define PyLongOrInt_AS_LONG PyLong_AS_LONG
101# define PyInt_Check PyLong_Check
102# define PyInt_AsLong PyLong_AsLong
103# define PyInt_AS_LONG PyLong_AS_LONG
104# define PyLongOrInt_AsSize_t PyLong_AsSize_t
106# define PyLongOrInt_Check(x) (PyInt_Check(x) || PyLong_Check(x))
108# define PyLongOrInt_AS_LONG PyInt_AsLong
110EXPCL_PYPANDA
size_t PyLongOrInt_AsSize_t(PyObject *);
114#if PY_MAJOR_VERSION >= 3
115# define FMTCHAR_BYTES "y"
117# define FMTCHAR_BYTES "s"
122#if PY_VERSION_HEX < 0x03020000
123typedef long Py_hash_t;
128#if PY_MAJOR_VERSION >= 3
130# if PY_VERSION_HEX < 0x03030300
131# undef _PyErr_OCCURRED
132# define _PyErr_OCCURRED() (PyThreadState_GET()->curexc_type)
136# if PY_VERSION_HEX < 0x03030000
137# define PyUnicode_AsUTF8 _PyUnicode_AsString
138# define PyUnicode_AsUTF8AndSize _PyUnicode_AsStringAndSize
143#if PY_VERSION_HEX < 0x03040000
144#define PyGILState_Check() (PyGILState_GetThisThreadState() == _PyThreadState_Current)
149#if PY_VERSION_HEX < 0x03080000 && !defined(_PyObject_CallNoArg)
150INLINE PyObject *_PyObject_CallNoArg(PyObject *func) {
151 static PyObject *empty_tuple = PyTuple_New(0);
152 return PyObject_Call(func, empty_tuple,
nullptr);
154# define _PyObject_CallNoArg _PyObject_CallNoArg
157#if PY_VERSION_HEX < 0x03080000 && !defined(_PyObject_FastCall)
158INLINE PyObject *_PyObject_FastCall(PyObject *func, PyObject **args, Py_ssize_t nargs) {
159 PyObject *tuple = PyTuple_New(nargs);
160 for (Py_ssize_t i = 0; i < nargs; ++i) {
161 PyTuple_SET_ITEM(tuple, i, args[i]);
164 PyObject *result = PyObject_Call(func, tuple,
nullptr);
168# define _PyObject_FastCall _PyObject_FastCall
172#ifndef HAVE_LONG_LONG
173# define PyLong_FromLongLong(x) PyLong_FromLong((long) (x))
174# define PyLong_FromUnsignedLongLong(x) PyLong_FromUnsignedLong((unsigned long) (x))
175# define PyLong_AsLongLong(x) PyLong_AsLong(x)
176# define PyLong_AsUnsignedLongLong(x) PyLong_AsUnsignedLong(x)
177# define PyLong_AsUnsignedLongLongMask(x) PyLong_AsUnsignedLongMask(x)
178# define PyLong_AsLongLongAndOverflow(x) PyLong_AsLongAndOverflow(x)
183#ifndef PyDict_GET_SIZE
184# define PyDict_GET_SIZE(mp) (((PyDictObject *)mp)->ma_used)
187#ifndef Py_RETURN_RICHCOMPARE
188# define Py_RETURN_RICHCOMPARE(val1, val2, op) \
192 case Py_EQ: if ((val1) == (val2)) Py_RETURN_TRUE; Py_RETURN_FALSE; \
193 case Py_NE: if ((val1) != (val2)) Py_RETURN_TRUE; Py_RETURN_FALSE; \
194 case Py_LT: if ((val1) < (val2)) Py_RETURN_TRUE; Py_RETURN_FALSE; \
195 case Py_GT: if ((val1) > (val2)) Py_RETURN_TRUE; Py_RETURN_FALSE; \
196 case Py_LE: if ((val1) <= (val2)) Py_RETURN_TRUE; Py_RETURN_FALSE; \
197 case Py_GE: if ((val1) >= (val2)) Py_RETURN_TRUE; Py_RETURN_FALSE; \
203#if PY_VERSION_HEX < 0x03080000
204INLINE PyObject *_PyLong_Rshift(PyObject *a,
size_t shiftby) {
205 PyObject *b = PyLong_FromLong(shiftby);
206 PyObject *result = PyNumber_Rshift(a, b);
210INLINE PyObject *_PyLong_Lshift(PyObject *a,
size_t shiftby) {
211 PyObject *b = PyLong_FromLong(shiftby);
212 PyObject *result = PyNumber_Lshift(a, b);
220#ifndef PyCFunction_CheckExact
221# define PyCFunction_CheckExact(op) (Py_TYPE(op) == &PyCFunction_Type)
224#if PY_VERSION_HEX < 0x03090000
225INLINE EXPCL_PYPANDA PyObject *PyObject_CallNoArgs(PyObject *func) {
226 return _PyObject_CallNoArg(func);
229INLINE PyObject *PyObject_CallOneArg(PyObject *callable, PyObject *arg) {
230#if PY_VERSION_HEX >= 0x03060000
231 return _PyObject_FastCall(callable, &arg, 1);
233 return PyObject_CallFunctionObjArgs(callable, arg,
nullptr);
237INLINE PyObject *PyObject_CallMethodNoArgs(PyObject *obj, PyObject *name) {
238 return PyObject_CallMethodObjArgs(obj, name,
nullptr);
241INLINE PyObject *PyObject_CallMethodOneArg(PyObject *obj, PyObject *name, PyObject *arg) {
242 return PyObject_CallMethodObjArgs(obj, name, arg,
nullptr);
248#if PY_VERSION_HEX < 0x030C0000
249# define PyLong_IsNonNegative(value) (Py_SIZE((value)) >= 0)
251INLINE
bool PyLong_IsNonNegative(PyObject *value) {
253 long longval = PyLong_AsLongAndOverflow(value, &overflow);
254 return overflow == 1 || longval >= 0;
263#ifndef _PyErr_OCCURRED
264# define _PyErr_OCCURRED() PyErr_Occurred()