From 54a358a3d0e149484284a7823773d28cb95f4f4e Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 27 Oct 2025 12:59:56 +0100 Subject: [PATCH] gh-140487: Fix Py_RETURN_NOTIMPLEMENTED in limited C API 3.11 (GH-140636) Py_RETURN_NONE, Py_RETURN_TRUE and Py_RETURN_FALSE have already been fixed by commit 9258f3da9175134d03f2c8c7c7eed223802ad945 (issue gh-134989). (cherry picked from commit c6364775236e3c634c3393c7f50fece50611245f) --- Include/object.h | 9 +++++++-- .../C API/2025-10-26-16-45-06.gh-issue-140487.fGOqss.rst | 2 ++ 2 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2025-10-26-16-45-06.gh-issue-140487.fGOqss.rst diff --git a/Include/object.h b/Include/object.h index 0266d25230a2b4..e59f78789844e7 100644 --- a/Include/object.h +++ b/Include/object.h @@ -1130,8 +1130,13 @@ PyAPI_DATA(PyObject) _Py_NotImplementedStruct; /* Don't use this directly */ # define Py_NotImplemented (&_Py_NotImplementedStruct) #endif -/* Macro for returning Py_NotImplemented from a function */ -#define Py_RETURN_NOTIMPLEMENTED return Py_NotImplemented +/* Macro for returning Py_NotImplemented from a function. Only treat + * Py_NotImplemented as immortal in the limited C API 3.12 and newer. */ +#if defined(Py_LIMITED_API) && Py_LIMITED_API+0 < 0x030c0000 +# define Py_RETURN_NOTIMPLEMENTED return Py_NewRef(Py_NotImplemented) +#else +# define Py_RETURN_NOTIMPLEMENTED return Py_NotImplemented +#endif /* Rich comparison opcodes */ #define Py_LT 0 diff --git a/Misc/NEWS.d/next/C API/2025-10-26-16-45-06.gh-issue-140487.fGOqss.rst b/Misc/NEWS.d/next/C API/2025-10-26-16-45-06.gh-issue-140487.fGOqss.rst new file mode 100644 index 00000000000000..16b0d9d4084ba0 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2025-10-26-16-45-06.gh-issue-140487.fGOqss.rst @@ -0,0 +1,2 @@ +Fix :c:macro:`Py_RETURN_NOTIMPLEMENTED` in limited C API 3.11 and older: +don't treat ``Py_NotImplemented`` as immortal. Patch by Victor Stinner.