From 24f654ec61b4039301791e906ff77f63cad663ca Mon Sep 17 00:00:00 2001 From: Hai Shi Date: Fri, 19 Mar 2021 01:25:02 +0800 Subject: [PATCH 1/3] Move the non-limited C API of include/compile.h into include/cpython. --- Include/compile.h | 86 +--------------- Include/cpython/compile.h | 99 +++++++++++++++++++ Lib/__future__.py | 2 +- Makefile.pre.in | 1 + .../2021-03-19-01-26-34.bpo-35134.TMWh1i.rst | 3 + PCbuild/pythoncore.vcxproj | 1 + PCbuild/pythoncore.vcxproj.filters | 3 + 7 files changed, 109 insertions(+), 86 deletions(-) create mode 100644 Include/cpython/compile.h create mode 100644 Misc/NEWS.d/next/C API/2021-03-19-01-26-34.bpo-35134.TMWh1i.rst diff --git a/Include/compile.h b/Include/compile.h index 4dd5435ce71a96..bb5adbdab40828 100644 --- a/Include/compile.h +++ b/Include/compile.h @@ -1,102 +1,18 @@ #ifndef Py_COMPILE_H #define Py_COMPILE_H -#ifndef Py_LIMITED_API - #ifdef __cplusplus extern "C" { #endif -/* Public interface */ -#define PyCF_MASK (CO_FUTURE_DIVISION | CO_FUTURE_ABSOLUTE_IMPORT | \ - CO_FUTURE_WITH_STATEMENT | CO_FUTURE_PRINT_FUNCTION | \ - CO_FUTURE_UNICODE_LITERALS | CO_FUTURE_BARRY_AS_BDFL | \ - CO_FUTURE_GENERATOR_STOP | CO_FUTURE_ANNOTATIONS) -#define PyCF_MASK_OBSOLETE (CO_NESTED) - -/* bpo-39562: CO_FUTURE_ and PyCF_ constants must be kept unique. - PyCF_ constants can use bits from 0x0100 to 0x10000. - CO_FUTURE_ constants use bits starting at 0x20000. */ -#define PyCF_SOURCE_IS_UTF8 0x0100 -#define PyCF_DONT_IMPLY_DEDENT 0x0200 -#define PyCF_ONLY_AST 0x0400 -#define PyCF_IGNORE_COOKIE 0x0800 -#define PyCF_TYPE_COMMENTS 0x1000 -#define PyCF_ALLOW_TOP_LEVEL_AWAIT 0x2000 -#define PyCF_COMPILE_MASK (PyCF_ONLY_AST | PyCF_ALLOW_TOP_LEVEL_AWAIT | \ - PyCF_TYPE_COMMENTS | PyCF_DONT_IMPLY_DEDENT) - #ifndef Py_LIMITED_API -typedef struct { - int cf_flags; /* bitmask of CO_xxx flags relevant to future */ - int cf_feature_version; /* minor Python version (PyCF_ONLY_AST) */ -} PyCompilerFlags; - -#define _PyCompilerFlags_INIT \ - (PyCompilerFlags){.cf_flags = 0, .cf_feature_version = PY_MINOR_VERSION} +# include "cpython/compile.h" #endif -/* Future feature support */ - -typedef struct { - int ff_features; /* flags set by future statements */ - int ff_lineno; /* line number of last future statement */ -} PyFutureFeatures; - -#define FUTURE_NESTED_SCOPES "nested_scopes" -#define FUTURE_GENERATORS "generators" -#define FUTURE_DIVISION "division" -#define FUTURE_ABSOLUTE_IMPORT "absolute_import" -#define FUTURE_WITH_STATEMENT "with_statement" -#define FUTURE_PRINT_FUNCTION "print_function" -#define FUTURE_UNICODE_LITERALS "unicode_literals" -#define FUTURE_BARRY_AS_BDFL "barry_as_FLUFL" -#define FUTURE_GENERATOR_STOP "generator_stop" -#define FUTURE_ANNOTATIONS "annotations" - -struct _mod; /* Declare the existence of this type */ -#define PyAST_Compile(mod, s, f, ar) PyAST_CompileEx(mod, s, f, -1, ar) -PyAPI_FUNC(PyCodeObject *) PyAST_CompileEx( - struct _mod *mod, - const char *filename, /* decoded from the filesystem encoding */ - PyCompilerFlags *flags, - int optimize, - PyArena *arena); -PyAPI_FUNC(PyCodeObject *) PyAST_CompileObject( - struct _mod *mod, - PyObject *filename, - PyCompilerFlags *flags, - int optimize, - PyArena *arena); -PyAPI_FUNC(PyFutureFeatures *) PyFuture_FromAST( - struct _mod * mod, - const char *filename /* decoded from the filesystem encoding */ - ); -PyAPI_FUNC(PyFutureFeatures *) PyFuture_FromASTObject( - struct _mod * mod, - PyObject *filename - ); - -/* _Py_Mangle is defined in compile.c */ -PyAPI_FUNC(PyObject*) _Py_Mangle(PyObject *p, PyObject *name); - -#define PY_INVALID_STACK_EFFECT INT_MAX -PyAPI_FUNC(int) PyCompile_OpcodeStackEffect(int opcode, int oparg); -PyAPI_FUNC(int) PyCompile_OpcodeStackEffectWithJump(int opcode, int oparg, int jump); - -typedef struct { - int optimize; - int ff_features; -} _PyASTOptimizeState; - -PyAPI_FUNC(int) _PyAST_Optimize(struct _mod *, PyArena *arena, _PyASTOptimizeState *state); - #ifdef __cplusplus } #endif -#endif /* !Py_LIMITED_API */ - /* These definitions must match corresponding definitions in graminit.h. */ #define Py_single_input 256 #define Py_file_input 257 diff --git a/Include/cpython/compile.h b/Include/cpython/compile.h new file mode 100644 index 00000000000000..aab8a52a92d63e --- /dev/null +++ b/Include/cpython/compile.h @@ -0,0 +1,99 @@ +#ifndef Py_CPYTHON_COMPILE_H +#define Py_CPYTHON_COMPILE_H + +#ifndef Py_LIMITED_API + +#ifdef __cplusplus +extern "C" { +#endif + +/* Public interface */ +#define PyCF_MASK (CO_FUTURE_DIVISION | CO_FUTURE_ABSOLUTE_IMPORT | \ + CO_FUTURE_WITH_STATEMENT | CO_FUTURE_PRINT_FUNCTION | \ + CO_FUTURE_UNICODE_LITERALS | CO_FUTURE_BARRY_AS_BDFL | \ + CO_FUTURE_GENERATOR_STOP | CO_FUTURE_ANNOTATIONS) +#define PyCF_MASK_OBSOLETE (CO_NESTED) + +/* bpo-39562: CO_FUTURE_ and PyCF_ constants must be kept unique. + PyCF_ constants can use bits from 0x0100 to 0x10000. + CO_FUTURE_ constants use bits starting at 0x20000. */ +#define PyCF_SOURCE_IS_UTF8 0x0100 +#define PyCF_DONT_IMPLY_DEDENT 0x0200 +#define PyCF_ONLY_AST 0x0400 +#define PyCF_IGNORE_COOKIE 0x0800 +#define PyCF_TYPE_COMMENTS 0x1000 +#define PyCF_ALLOW_TOP_LEVEL_AWAIT 0x2000 +#define PyCF_COMPILE_MASK (PyCF_ONLY_AST | PyCF_ALLOW_TOP_LEVEL_AWAIT | \ + PyCF_TYPE_COMMENTS | PyCF_DONT_IMPLY_DEDENT) + +#ifndef Py_LIMITED_API +typedef struct { + int cf_flags; /* bitmask of CO_xxx flags relevant to future */ + int cf_feature_version; /* minor Python version (PyCF_ONLY_AST) */ +} PyCompilerFlags; + +#define _PyCompilerFlags_INIT \ + (PyCompilerFlags){.cf_flags = 0, .cf_feature_version = PY_MINOR_VERSION} +#endif + +/* Future feature support */ + +typedef struct { + int ff_features; /* flags set by future statements */ + int ff_lineno; /* line number of last future statement */ +} PyFutureFeatures; + +#define FUTURE_NESTED_SCOPES "nested_scopes" +#define FUTURE_GENERATORS "generators" +#define FUTURE_DIVISION "division" +#define FUTURE_ABSOLUTE_IMPORT "absolute_import" +#define FUTURE_WITH_STATEMENT "with_statement" +#define FUTURE_PRINT_FUNCTION "print_function" +#define FUTURE_UNICODE_LITERALS "unicode_literals" +#define FUTURE_BARRY_AS_BDFL "barry_as_FLUFL" +#define FUTURE_GENERATOR_STOP "generator_stop" +#define FUTURE_ANNOTATIONS "annotations" + +struct _mod; /* Declare the existence of this type */ +#define PyAST_Compile(mod, s, f, ar) PyAST_CompileEx(mod, s, f, -1, ar) +PyAPI_FUNC(PyCodeObject *) PyAST_CompileEx( + struct _mod *mod, + const char *filename, /* decoded from the filesystem encoding */ + PyCompilerFlags *flags, + int optimize, + PyArena *arena); +PyAPI_FUNC(PyCodeObject *) PyAST_CompileObject( + struct _mod *mod, + PyObject *filename, + PyCompilerFlags *flags, + int optimize, + PyArena *arena); +PyAPI_FUNC(PyFutureFeatures *) PyFuture_FromAST( + struct _mod * mod, + const char *filename /* decoded from the filesystem encoding */ + ); +PyAPI_FUNC(PyFutureFeatures *) PyFuture_FromASTObject( + struct _mod * mod, + PyObject *filename + ); + +/* _Py_Mangle is defined in compile.c */ +PyAPI_FUNC(PyObject*) _Py_Mangle(PyObject *p, PyObject *name); + +#define PY_INVALID_STACK_EFFECT INT_MAX +PyAPI_FUNC(int) PyCompile_OpcodeStackEffect(int opcode, int oparg); +PyAPI_FUNC(int) PyCompile_OpcodeStackEffectWithJump(int opcode, int oparg, int jump); + +typedef struct { + int optimize; + int ff_features; +} _PyASTOptimizeState; + +PyAPI_FUNC(int) _PyAST_Optimize(struct _mod *, PyArena *arena, _PyASTOptimizeState *state); + +#ifdef __cplusplus +} +#endif + +#endif /* !Py_LIMITED_API */ +#endif /* !Py_CPYTHON_COMPILE_H */ diff --git a/Lib/__future__.py b/Lib/__future__.py index 0e7b5552343356..326e2b24d1d048 100644 --- a/Lib/__future__.py +++ b/Lib/__future__.py @@ -42,7 +42,7 @@ argument to the builtin function compile() to enable the feature in dynamically compiled code. This flag is stored in the .compiler_flag attribute on _Future instances. These values must match the appropriate -#defines of CO_xxx flags in Include/compile.h. +#defines of CO_xxx flags in Include/cpython/compile.h. No feature line is ever to be deleted from this file. """ diff --git a/Makefile.pre.in b/Makefile.pre.in index 5ad304e30d0229..4a8a857539be90 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1105,6 +1105,7 @@ PYTHON_HEADERS= \ $(srcdir)/Include/cpython/bytesobject.h \ $(srcdir)/Include/cpython/ceval.h \ $(srcdir)/Include/cpython/code.h \ + $(srcdir)/Include/cpython/compile.h \ $(srcdir)/Include/cpython/dictobject.h \ $(srcdir)/Include/cpython/fileobject.h \ $(srcdir)/Include/cpython/fileutils.h \ diff --git a/Misc/NEWS.d/next/C API/2021-03-19-01-26-34.bpo-35134.TMWh1i.rst b/Misc/NEWS.d/next/C API/2021-03-19-01-26-34.bpo-35134.TMWh1i.rst new file mode 100644 index 00000000000000..1f6bb99ff6e952 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2021-03-19-01-26-34.bpo-35134.TMWh1i.rst @@ -0,0 +1,3 @@ +Move the non-limited C API of include/compile.h into the include/cpython +directory. They must not be included directly, as they are already included by +Python.h: :ref:`Include Files `. diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index 37c60af4f74d7e..978d79d0e1b2ea 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -131,6 +131,7 @@ + diff --git a/PCbuild/pythoncore.vcxproj.filters b/PCbuild/pythoncore.vcxproj.filters index 76894079890fd7..18864aa7c611bc 100644 --- a/PCbuild/pythoncore.vcxproj.filters +++ b/PCbuild/pythoncore.vcxproj.filters @@ -393,6 +393,9 @@ Include\cpython + + Include + Include\cpython From c05f16fd65815d6c0665c6bd981c12269bdb13b7 Mon Sep 17 00:00:00 2001 From: Hai Shi Date: Sat, 20 Mar 2021 01:49:18 +0800 Subject: [PATCH 2/3] apply victor's comment --- Include/compile.h | 2 ++ Include/cpython/compile.h | 16 +--------------- .../2021-03-19-01-26-34.bpo-35134.TMWh1i.rst | 3 --- 3 files changed, 3 insertions(+), 18 deletions(-) delete mode 100644 Misc/NEWS.d/next/C API/2021-03-19-01-26-34.bpo-35134.TMWh1i.rst diff --git a/Include/compile.h b/Include/compile.h index bb5adbdab40828..68a1860d853fe6 100644 --- a/Include/compile.h +++ b/Include/compile.h @@ -6,7 +6,9 @@ extern "C" { #endif #ifndef Py_LIMITED_API +# define Py_CPYTHON_COMPILE_H # include "cpython/compile.h" +# undef Py_CPYTHON_COMPILE_H #endif #ifdef __cplusplus diff --git a/Include/cpython/compile.h b/Include/cpython/compile.h index aab8a52a92d63e..47073e49e1c0d3 100644 --- a/Include/cpython/compile.h +++ b/Include/cpython/compile.h @@ -1,10 +1,5 @@ #ifndef Py_CPYTHON_COMPILE_H -#define Py_CPYTHON_COMPILE_H - -#ifndef Py_LIMITED_API - -#ifdef __cplusplus -extern "C" { +# error "this header file must not be included directly" #endif /* Public interface */ @@ -26,7 +21,6 @@ extern "C" { #define PyCF_COMPILE_MASK (PyCF_ONLY_AST | PyCF_ALLOW_TOP_LEVEL_AWAIT | \ PyCF_TYPE_COMMENTS | PyCF_DONT_IMPLY_DEDENT) -#ifndef Py_LIMITED_API typedef struct { int cf_flags; /* bitmask of CO_xxx flags relevant to future */ int cf_feature_version; /* minor Python version (PyCF_ONLY_AST) */ @@ -34,7 +28,6 @@ typedef struct { #define _PyCompilerFlags_INIT \ (PyCompilerFlags){.cf_flags = 0, .cf_feature_version = PY_MINOR_VERSION} -#endif /* Future feature support */ @@ -90,10 +83,3 @@ typedef struct { } _PyASTOptimizeState; PyAPI_FUNC(int) _PyAST_Optimize(struct _mod *, PyArena *arena, _PyASTOptimizeState *state); - -#ifdef __cplusplus -} -#endif - -#endif /* !Py_LIMITED_API */ -#endif /* !Py_CPYTHON_COMPILE_H */ diff --git a/Misc/NEWS.d/next/C API/2021-03-19-01-26-34.bpo-35134.TMWh1i.rst b/Misc/NEWS.d/next/C API/2021-03-19-01-26-34.bpo-35134.TMWh1i.rst deleted file mode 100644 index 1f6bb99ff6e952..00000000000000 --- a/Misc/NEWS.d/next/C API/2021-03-19-01-26-34.bpo-35134.TMWh1i.rst +++ /dev/null @@ -1,3 +0,0 @@ -Move the non-limited C API of include/compile.h into the include/cpython -directory. They must not be included directly, as they are already included by -Python.h: :ref:`Include Files `. From 6db215af9bac3d809c800989759173edc6df16a9 Mon Sep 17 00:00:00 2001 From: Hai Shi Date: Sun, 21 Mar 2021 01:44:20 +0800 Subject: [PATCH 3/3] apply victor's comment --- Include/compile.h | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/Include/compile.h b/Include/compile.h index 68a1860d853fe6..3c5acd7209f763 100644 --- a/Include/compile.h +++ b/Include/compile.h @@ -1,20 +1,9 @@ #ifndef Py_COMPILE_H #define Py_COMPILE_H - #ifdef __cplusplus extern "C" { #endif -#ifndef Py_LIMITED_API -# define Py_CPYTHON_COMPILE_H -# include "cpython/compile.h" -# undef Py_CPYTHON_COMPILE_H -#endif - -#ifdef __cplusplus -} -#endif - /* These definitions must match corresponding definitions in graminit.h. */ #define Py_single_input 256 #define Py_file_input 257 @@ -24,4 +13,13 @@ extern "C" { /* This doesn't need to match anything */ #define Py_fstring_input 800 +#ifndef Py_LIMITED_API +# define Py_CPYTHON_COMPILE_H +# include "cpython/compile.h" +# undef Py_CPYTHON_COMPILE_H +#endif + +#ifdef __cplusplus +} +#endif #endif /* !Py_COMPILE_H */