From: Petr Viktorin Date: Fri, 25 Feb 2022 08:25:54 +0000 (+0100) Subject: bpo-46748: Don't import in public headers (GH-31553) X-Git-Tag: v3.11.0a6~95 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=2c228a7b8f89e9ed8d390370abd771d4993b79d8;p=thirdparty%2FPython%2Fcpython.git bpo-46748: Don't import in public headers (GH-31553) is the standard/modern way to define embedd/extends Python free to define bool, true and false, but there are existing applications that use slightly different redefinitions, which fail if the header is included. It's OK to use stdbool outside the public headers, though. https://bugs.python.org/issue46748 --- diff --git a/Include/cpython/import.h b/Include/cpython/import.h index c734802ff254..ef6be689468e 100644 --- a/Include/cpython/import.h +++ b/Include/cpython/import.h @@ -32,7 +32,7 @@ struct _frozen { const char *name; /* ASCII encoded string */ const unsigned char *code; int size; - bool is_package; + int is_package; PyObject *(*get_code)(void); }; diff --git a/Include/cpython/pystate.h b/Include/cpython/pystate.h index 8150d501d418..248320cceb71 100644 --- a/Include/cpython/pystate.h +++ b/Include/cpython/pystate.h @@ -2,8 +2,6 @@ # error "this header file must not be included directly" #endif -#include - PyAPI_FUNC(int) _PyInterpreterState_RequiresIDRef(PyInterpreterState *); PyAPI_FUNC(void) _PyInterpreterState_RequireIDRef(PyInterpreterState *, int); @@ -93,7 +91,7 @@ struct _ts { int _initialized; /* Was this thread state statically allocated? */ - bool _static; + int _static; int recursion_remaining; int recursion_limit; diff --git a/Misc/NEWS.d/next/C API/2022-02-24-13-13-16.bpo-46748.aG1zb3.rst b/Misc/NEWS.d/next/C API/2022-02-24-13-13-16.bpo-46748.aG1zb3.rst new file mode 100644 index 000000000000..b6b2db1e8ba3 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2022-02-24-13-13-16.bpo-46748.aG1zb3.rst @@ -0,0 +1,2 @@ +Python's public headers no longer import ````, leaving code that +embedd/extends Python free to define ``bool``, ``true`` and ``false``. diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index 0be42f33e23c..6fa0cced4ecf 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -40,6 +40,9 @@ # error "_testcapi must test the public Python C API, not CPython internal C API" #endif +#ifdef bool +# error "The public headers should not include , see bpo-46748" +#endif // Forward declarations static struct PyModuleDef _testcapimodule; diff --git a/Python/frozen.c b/Python/frozen.c index c5b36f73b4a4..8a2a7243537c 100644 --- a/Python/frozen.c +++ b/Python/frozen.c @@ -38,6 +38,8 @@ #include "Python.h" #include "pycore_import.h" +#include + /* Includes for frozen modules: */ /* End includes */ diff --git a/Tools/freeze/makefreeze.py b/Tools/freeze/makefreeze.py index bc5f8567448b..c464f4bbb265 100644 --- a/Tools/freeze/makefreeze.py +++ b/Tools/freeze/makefreeze.py @@ -45,9 +45,9 @@ def makefreeze(base, dict, debug=0, entry_point=None, fail_import=()): print("freezing", mod, "...") str = marshal.dumps(m.__code__) size = len(str) - is_package = 'false' + is_package = '0' if m.__path__: - is_package = 'true' + is_package = '1' done.append((mod, mangled, size, is_package)) writecode(outfp, mangled, str) if debug: