From 485ad40d43ec97b48ad006c1c75b9592936743f7 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 30 Oct 2023 18:09:13 +0100 Subject: [PATCH] gh-111506: Implement Py_SET_REFCNT() as opaque function in limited C API In the limited C API version 3.13. Py_SET_REFCNT() is now implemented as an opaque function call. Add _Py_SetRefcnt() to the stable ABI. --- Include/object.h | 13 +++++++++++-- Misc/stable_abi.toml | 2 ++ Objects/object.c | 8 ++++++++ 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/Include/object.h b/Include/object.h index 6f116ef35a790c6..b4ef3bb5c812af8 100644 --- a/Include/object.h +++ b/Include/object.h @@ -329,7 +329,15 @@ static inline int Py_IS_TYPE(PyObject *ob, PyTypeObject *type) { #endif +// Py_SET_REFCNT() implementation for stable ABI +PyAPI_FUNC(void) _Py_SetRefcnt(PyObject *ob, Py_ssize_t refcnt); + static inline void Py_SET_REFCNT(PyObject *ob, Py_ssize_t refcnt) { +#if defined(Py_LIMITED_API) && Py_LIMITED_API+0 >= 0x030d0000 + // Stable ABI implements Py_SET_REFCNT() as a function call + // on limited C API version 3.13 and newer. + _Py_SetRefcnt(ob, refcnt); +#else // This immortal check is for code that is unaware of immortal objects. // The runtime tracks these objects and we should avoid as much // as possible having extensions inadvertently change the refcnt @@ -337,7 +345,7 @@ static inline void Py_SET_REFCNT(PyObject *ob, Py_ssize_t refcnt) { if (_Py_IsImmortal(ob)) { return; } -#if !defined(Py_NOGIL) +#ifndef Py_NOGIL ob->ob_refcnt = refcnt; #else if (_Py_IsOwnedByCurrentThread(ob)) { @@ -354,7 +362,8 @@ static inline void Py_SET_REFCNT(PyObject *ob, Py_ssize_t refcnt) { ob->ob_ref_local = 0; ob->ob_ref_shared = _Py_REF_SHARED(refcnt, _Py_REF_MERGED); } -#endif +#endif // Py_NOGIL +#endif // Py_LIMITED_API+0 < 0x030d0000 } #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 # define Py_SET_REFCNT(ob, refcnt) Py_SET_REFCNT(_PyObject_CAST(ob), (refcnt)) diff --git a/Misc/stable_abi.toml b/Misc/stable_abi.toml index 0601de20fe0f46b..b00e9034978e46a 100644 --- a/Misc/stable_abi.toml +++ b/Misc/stable_abi.toml @@ -2480,3 +2480,5 @@ added = '3.13' [function.PyUnicode_AsUTF8] added = '3.13' +[function._Py_SetRefcnt] + added = '3.13' diff --git a/Objects/object.c b/Objects/object.c index 35c7e7bf33b1350..1cc3f9146467094 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -2931,3 +2931,11 @@ int Py_IsFalse(PyObject *x) { return Py_Is(x, Py_False); } + + +// Py_SET_REFCNT() implementation for stable ABI +void +_Py_SetRefcnt(PyObject *ob, Py_ssize_t refcnt) +{ + Py_SET_REFCNT(ob, refcnt); +}