From 39e5ae960f823611c91d8d651c2f05c3e830a027 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 9 Jun 2023 11:30:41 +0200 Subject: [PATCH 1/2] gh-102304: Fix Py_INCREF() for limited C API 3.9 (#105550) 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. (cherry picked from commit 7ba0fd9f87ad75f8eda8e002c2fc71049b815f33) --- Include/object.h | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/Include/object.h b/Include/object.h index dc5b087db2f467..ad16b72cd42474 100644 --- a/Include/object.h +++ b/Include/object.h @@ -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)) From a9f0a255b6bbc21a0da45ae0bf2455173d22ca44 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 9 Jun 2023 11:56:03 +0200 Subject: [PATCH 2/2] gh-102304: Remove Py_INCREF() doc change (#105552) Py_INCREF() was made compatible again with Python 3.9 and older in the limited API of Python debug mode. (cherry picked from commit 58e4b69f698e6fd0694a58f18679bbe0e7e50e91) --- Doc/whatsnew/3.12.rst | 9 --------- 1 file changed, 9 deletions(-) diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index 18516cb9563f8b..8bc7e8a630e2a6 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -1536,15 +1536,6 @@ Build Changes :file:`!configure`. (Contributed by Christian Heimes in :gh:`89886`.) -* C extensions built with the :ref:`limited C API ` - on :ref:`Python build in debug mode ` 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 =============