2#ifndef GREENLET_CPYTHON_COMPAT_H
3#define GREENLET_CPYTHON_COMPAT_H
9#define PY_SSIZE_T_CLEAN
13#if PY_VERSION_HEX >= 0x30A00B1
14# define GREENLET_PY310 1
16# define GREENLET_PY310 0
26#if GREENLET_PY310 && PY_VERSION_HEX < 0x30D0000
27# define GREENLET_USE_CFRAME 1
29# define GREENLET_USE_CFRAME 0
33#if PY_VERSION_HEX >= 0x30B00A4
46# define GREENLET_PY311 1
48# define GREENLET_PY311 0
52#if PY_VERSION_HEX >= 0x30C0000
53# define GREENLET_PY312 1
55# define GREENLET_PY312 0
58#if PY_VERSION_HEX >= 0x30D0000
59# define GREENLET_PY313 1
61# define GREENLET_PY313 0
64#if PY_VERSION_HEX >= 0x30E0000
65# define GREENLET_PY314 1
67# define GREENLET_PY314 0
73# define Py_SET_REFCNT(obj, refcnt) Py_REFCNT(obj) = (refcnt)
76#ifdef _Py_DEC_REFTOTAL
77# define GREENLET_Py_DEC_REFTOTAL _Py_DEC_REFTOTAL
86# define GREENLET_Py_DEC_REFTOTAL
88# define GREENLET_Py_DEC_REFTOTAL _Py_RefTotal--
91# define GREENLET_Py_DEC_REFTOTAL
95#ifndef Py_TPFLAGS_CHECKTYPES
96 #define Py_TPFLAGS_CHECKTYPES 0
98#ifndef Py_TPFLAGS_HAVE_INDEX
99 #define Py_TPFLAGS_HAVE_INDEX 0
101#ifndef Py_TPFLAGS_HAVE_NEWBUFFER
102 #define Py_TPFLAGS_HAVE_NEWBUFFER 0
105#ifndef Py_TPFLAGS_HAVE_VERSION_TAG
106 #define Py_TPFLAGS_HAVE_VERSION_TAG 0
109#define G_TPFLAGS_DEFAULT Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_VERSION_TAG | Py_TPFLAGS_CHECKTYPES | Py_TPFLAGS_HAVE_NEWBUFFER | Py_TPFLAGS_HAVE_GC
112#if PY_VERSION_HEX < 0x03090000
114# define PyObject_GC_IsTracked(o) _PyObject_GC_IS_TRACKED(o)
119#if PY_VERSION_HEX < 0x030B00A2 && !defined(PYPY_VERSION)
120static inline void PyThreadState_EnterTracing(PyThreadState *tstate)
123#if PY_VERSION_HEX >= 0x030A00A1
124 tstate->cframe->use_tracing = 0;
126 tstate->use_tracing = 0;
132#if PY_VERSION_HEX < 0x030B00A2 && !defined(PYPY_VERSION)
133static inline void PyThreadState_LeaveTracing(PyThreadState *tstate)
136 int use_tracing = (tstate->c_tracefunc != NULL
137 || tstate->c_profilefunc != NULL);
138#if PY_VERSION_HEX >= 0x030A00A1
139 tstate->cframe->use_tracing = use_tracing;
141 tstate->use_tracing = use_tracing;
146#if !defined(Py_C_RECURSION_LIMIT) && defined(C_RECURSION_LIMIT)
147# define Py_C_RECURSION_LIMIT C_RECURSION_LIMIT