|
|
|
#ifndef GREENLET_CPYTHON_COMPAT_H |
|
#define GREENLET_CPYTHON_COMPAT_H |
|
|
|
|
|
|
|
|
|
|
|
#define PY_SSIZE_T_CLEAN |
|
#include "Python.h" |
|
|
|
|
|
#if PY_VERSION_HEX >= 0x30A00B1 |
|
# define GREENLET_PY310 1 |
|
#else |
|
# define GREENLET_PY310 0 |
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if GREENLET_PY310 && PY_VERSION_HEX < 0x30D0000 |
|
# define GREENLET_USE_CFRAME 1 |
|
#else |
|
# define GREENLET_USE_CFRAME 0 |
|
#endif |
|
|
|
|
|
#if PY_VERSION_HEX >= 0x30B00A4 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# define GREENLET_PY311 1 |
|
#else |
|
# define GREENLET_PY311 0 |
|
#endif |
|
|
|
|
|
#if PY_VERSION_HEX >= 0x30C0000 |
|
# define GREENLET_PY312 1 |
|
#else |
|
# define GREENLET_PY312 0 |
|
#endif |
|
|
|
#if PY_VERSION_HEX >= 0x30D0000 |
|
# define GREENLET_PY313 1 |
|
#else |
|
# define GREENLET_PY313 0 |
|
#endif |
|
|
|
#ifndef Py_SET_REFCNT |
|
|
|
|
|
# define Py_SET_REFCNT(obj, refcnt) Py_REFCNT(obj) = (refcnt) |
|
#endif |
|
|
|
#ifndef _Py_DEC_REFTOTAL |
|
|
|
|
|
|
|
|
|
|
|
# ifdef Py_REF_DEBUG |
|
# if GREENLET_PY312 |
|
# define _Py_DEC_REFTOTAL |
|
# else |
|
# define _Py_DEC_REFTOTAL _Py_RefTotal-- |
|
# endif |
|
# else |
|
# define _Py_DEC_REFTOTAL |
|
# endif |
|
#endif |
|
|
|
#ifndef Py_TPFLAGS_CHECKTYPES |
|
#define Py_TPFLAGS_CHECKTYPES 0 |
|
#endif |
|
#ifndef Py_TPFLAGS_HAVE_INDEX |
|
#define Py_TPFLAGS_HAVE_INDEX 0 |
|
#endif |
|
#ifndef Py_TPFLAGS_HAVE_NEWBUFFER |
|
#define Py_TPFLAGS_HAVE_NEWBUFFER 0 |
|
#endif |
|
|
|
#ifndef Py_TPFLAGS_HAVE_VERSION_TAG |
|
#define Py_TPFLAGS_HAVE_VERSION_TAG 0 |
|
#endif |
|
|
|
#define G_TPFLAGS_DEFAULT Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_VERSION_TAG | Py_TPFLAGS_CHECKTYPES | Py_TPFLAGS_HAVE_NEWBUFFER | Py_TPFLAGS_HAVE_GC |
|
|
|
|
|
#if PY_VERSION_HEX < 0x03090000 |
|
|
|
# define PyObject_GC_IsTracked(o) _PyObject_GC_IS_TRACKED(o) |
|
#endif |
|
|
|
|
|
|
|
#if PY_VERSION_HEX < 0x030B00A2 && !defined(PYPY_VERSION) |
|
static inline void PyThreadState_EnterTracing(PyThreadState *tstate) |
|
{ |
|
tstate->tracing++; |
|
#if PY_VERSION_HEX >= 0x030A00A1 |
|
tstate->cframe->use_tracing = 0; |
|
#else |
|
tstate->use_tracing = 0; |
|
#endif |
|
} |
|
#endif |
|
|
|
|
|
#if PY_VERSION_HEX < 0x030B00A2 && !defined(PYPY_VERSION) |
|
static inline void PyThreadState_LeaveTracing(PyThreadState *tstate) |
|
{ |
|
tstate->tracing--; |
|
int use_tracing = (tstate->c_tracefunc != NULL |
|
|| tstate->c_profilefunc != NULL); |
|
#if PY_VERSION_HEX >= 0x030A00A1 |
|
tstate->cframe->use_tracing = use_tracing; |
|
#else |
|
tstate->use_tracing = use_tracing; |
|
#endif |
|
} |
|
#endif |
|
|
|
#if !defined(Py_C_RECURSION_LIMIT) && defined(C_RECURSION_LIMIT) |
|
# define Py_C_RECURSION_LIMIT C_RECURSION_LIMIT |
|
#endif |
|
|
|
#endif |
|
|