From 6f4a49942bec5bb15b2ebb7ec19fd43c052305a1 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 11 Oct 2023 22:47:54 +0200 Subject: [PATCH] gh-85283: If Py_LIMITED_API is defined, undefine Py_BUILD_CORE (#110725) If the Py_LIMITED_API macro is defined, Py_BUILD_CORE, Py_BUILD_CORE_BUILTIN and Py_BUILD_CORE_MODULE macros are now undefined by Python.h. Only undefine these 3 macros after including "exports.h" which uses them to define PyAPI_FUNC(), PyAPI_DATA() and PyMODINIT_FUNC macros. Remove hacks (undefine manually the 3 Py_BUILD_CORE macros) in Modules/_testcapi/parts.h and Modules/_testclinic_limited.c. --- Doc/whatsnew/3.13.rst | 5 +++++ Include/pyport.h | 13 +++++++++---- .../2023-10-11-17-29-52.gh-issue-85283.OsqIBF.rst | 3 +++ 3 files changed, 17 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2023-10-11-17-29-52.gh-issue-85283.OsqIBF.rst diff --git a/Doc/whatsnew/3.13.rst b/Doc/whatsnew/3.13.rst index bbc1fecf496..b0a0d89c8d9 100644 --- a/Doc/whatsnew/3.13.rst +++ b/Doc/whatsnew/3.13.rst @@ -1075,6 +1075,11 @@ Porting to Python 3.13 :c:func:`!Py_TOLOWER`. (Contributed by Victor Stinner in :gh:`108765`.) +* If the :c:macro:`Py_LIMITED_API` macro is defined, :c:macro:`!Py_BUILD_CORE`, + :c:macro:`!Py_BUILD_CORE_BUILTIN` and :c:macro:`!Py_BUILD_CORE_MODULE` macros + are now undefined by ````. + (Contributed by Victor Stinner in :gh:`85283`.) + Deprecated ---------- diff --git a/Include/pyport.h b/Include/pyport.h index 40d580a870f..d30fcd7f6cb 100644 --- a/Include/pyport.h +++ b/Include/pyport.h @@ -48,10 +48,6 @@ # define Py_BUILD_CORE #endif -#if defined(Py_LIMITED_API) && defined(Py_BUILD_CORE) -# error "Py_LIMITED_API is not compatible with Py_BUILD_CORE" -#endif - /************************************************************************** Symbols and macros to supply platform-independent interfaces to basic @@ -361,6 +357,15 @@ extern "C" { #include "exports.h" +#ifdef Py_LIMITED_API + // The internal C API must not be used with the limited C API: make sure + // that Py_BUILD_CORE macro is not defined in this case. These 3 macros are + // used by exports.h, so only undefine them afterwards. +# undef Py_BUILD_CORE +# undef Py_BUILD_CORE_BUILTIN +# undef Py_BUILD_CORE_MODULE +#endif + /* limits.h constants that may be missing */ #ifndef INT_MAX diff --git a/Misc/NEWS.d/next/C API/2023-10-11-17-29-52.gh-issue-85283.OsqIBF.rst b/Misc/NEWS.d/next/C API/2023-10-11-17-29-52.gh-issue-85283.OsqIBF.rst new file mode 100644 index 00000000000..c89a02985f4 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2023-10-11-17-29-52.gh-issue-85283.OsqIBF.rst @@ -0,0 +1,3 @@ +If the :c:macro:`Py_LIMITED_API` macro is defined, :c:macro:`!Py_BUILD_CORE`, +:c:macro:`!Py_BUILD_CORE_BUILTIN` and :c:macro:`!Py_BUILD_CORE_MODULE` macros +are now undefined by ````. Patch by Victor Stinner.