:file:`!configure`.
(Contributed by Christian Heimes in :gh:`89886`.)
-* C extensions built with the :ref:`limited C API <limited-c-api>`
- on :ref:`Python build in debug mode <debug-build>` no longer support Python
- 3.9 and older. In this configuration, :c:func:`Py_INCREF` and
- :c:func:`Py_DECREF` are now always implemented as opaque function calls,
- but the called functions were added to Python 3.10. Build C extensions
- with a release build of Python or with Python 3.12 and older, to keep support
- for Python 3.9 and older.
- (Contributed by Victor Stinner in :gh:`102304`.)
-
C API Changes
=============
static inline Py_ALWAYS_INLINE void Py_INCREF(PyObject *op)
{
#if defined(Py_REF_DEBUG) && defined(Py_LIMITED_API)
- // Stable ABI for Python built in debug mode
+ // Stable ABI for Python built in debug mode. _Py_IncRef() was added to
+ // Python 3.10.0a7, use Py_IncRef() on older Python versions. Py_IncRef()
+ // accepts NULL whereas _Py_IncRef() doesn't.
+# if Py_LIMITED_API+0 >= 0x030a00A7
_Py_IncRef(op);
+# else
+ Py_IncRef(op);
+# endif
#else
// Non-limited C API and limited C API for Python 3.9 and older access
// directly PyObject.ob_refcnt.
#endif
#if defined(Py_REF_DEBUG) && defined(Py_LIMITED_API)
-// Stable ABI for Python built in debug mode
+// Stable ABI for Python built in debug mode. _Py_DecRef() was added to Python
+// 3.10.0a7, use Py_DecRef() on older Python versions. Py_DecRef() accepts NULL
+// whereas _Py_IncRef() doesn't.
static inline void Py_DECREF(PyObject *op) {
+# if Py_LIMITED_API+0 >= 0x030a00A7
_Py_DecRef(op);
+# else
+ Py_DecRef(op);
+# endif
}
#define Py_DECREF(op) Py_DECREF(_PyObject_CAST(op))