[Python-checkins] bpo-46748: Don't import <stdbool.h> in public headers (GH-31553)

encukou webhook-mailer at python.org
Fri Feb 25 03:26:08 EST 2022


https://github.com/python/cpython/commit/2c228a7b8f89e9ed8d390370abd771d4993b79d8
commit: 2c228a7b8f89e9ed8d390370abd771d4993b79d8
branch: main
author: Petr Viktorin <encukou at gmail.com>
committer: encukou <encukou at gmail.com>
date: 2022-02-25T09:25:54+01:00
summary:

bpo-46748: Don't import <stdbool.h> in public headers (GH-31553)

<stdbool.h> 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

files:
A Misc/NEWS.d/next/C API/2022-02-24-13-13-16.bpo-46748.aG1zb3.rst
M Include/cpython/import.h
M Include/cpython/pystate.h
M Modules/_testcapimodule.c
M Python/frozen.c
M Tools/freeze/makefreeze.py

diff --git a/Include/cpython/import.h b/Include/cpython/import.h
index c734802ff254b..ef6be689468ee 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 8150d501d418e..248320cceb716 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 <stdbool.h>
-
 
 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 0000000000000..b6b2db1e8ba33
--- /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 ``<stdbool.h>``, leaving code that
+embedd/extends Python free to define ``bool``, ``true`` and ``false``.
diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c
index 0be42f33e23c9..6fa0cced4ecfb 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 <stdbool.h>, see bpo-46748"
+#endif
 
 // Forward declarations
 static struct PyModuleDef _testcapimodule;
diff --git a/Python/frozen.c b/Python/frozen.c
index c5b36f73b4a47..8a2a7243537cc 100644
--- a/Python/frozen.c
+++ b/Python/frozen.c
@@ -38,6 +38,8 @@
 #include "Python.h"
 #include "pycore_import.h"
 
+#include <stdbool.h>
+
 /* Includes for frozen modules: */
 /* End includes */
 
diff --git a/Tools/freeze/makefreeze.py b/Tools/freeze/makefreeze.py
index bc5f8567448bf..c464f4bbb2655 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:



More information about the Python-checkins mailing list