]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-102304: Fix Py_INCREF() for limited C API 3.9 (#105550)
authorVictor Stinner <vstinner@python.org>
Fri, 9 Jun 2023 09:30:41 +0000 (11:30 +0200)
committerGitHub <noreply@github.com>
Fri, 9 Jun 2023 09:30:41 +0000 (09:30 +0000)
When Python is built in debug mode (Py_REF_DEBUG macro), Py_INCREF()
and Py_DECREF() of the limited C API 3.9 (and older) now call
Py_IncRef() and Py_DecRef(), since _Py_IncRef() and _Py_DecRef() were
added to Python 3.10.

Include/object.h

index dc5b087db2f467bc443709dc7456d07e894da62a..ad16b72cd42474182c1d985987720c4e187b0f0d 100644 (file)
@@ -611,8 +611,14 @@ PyAPI_FUNC(void) _Py_DecRef(PyObject *);
 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.
@@ -642,9 +648,15 @@ static inline Py_ALWAYS_INLINE void Py_INCREF(PyObject *op)
 #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))