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
This commit is contained in:
Petr Viktorin 2022-02-25 09:25:54 +01:00 committed by GitHub
parent 98c3bea4d1
commit 2c228a7b8f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 11 additions and 6 deletions

View file

@ -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);
};

View file

@ -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;

View file

@ -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``.

View file

@ -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;

View file

@ -38,6 +38,8 @@
#include "Python.h"
#include "pycore_import.h"
#include <stdbool.h>
/* Includes for frozen modules: */
/* End includes */

View file

@ -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: