From 5f2df88b63e50d23914e97ec778861a52abdeaad Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 12 Nov 2018 00:56:19 +0100 Subject: bpo-35177: Add dependencies between header files (GH-10361) * ast.h now includes Python-ast.h and node.h * parsetok.h now includes node.h and grammar.h * symtable.h now includes Python-ast.h * Modify asdl_c.py to enhance Python-ast.h: * Add #ifndef/#define Py_PYTHON_AST_H to be able to include the header twice * Add "extern { ... }" for C++ * Undefine "Yield" macro conflicting with winbase.h * Remove "#undef Yield" from C files, it's now done in Python-ast.h * Remove now useless includes in C files --- Include/Python-ast.h | 13 +++++++++++++ Include/ast.h | 3 +++ Include/parsetok.h | 5 ++++- Include/symtable.h | 5 +++-- Modules/parsermodule.c | 5 ++--- Parser/asdl_c.py | 16 +++++++++++++++- Python/ast_opt.c | 1 - Python/bltinmodule.c | 11 ++--------- Python/compile.c | 1 - Python/import.c | 1 - Python/pylifecycle.c | 1 - Python/pythonrun.c | 1 - Python/symtable.c | 5 ----- 13 files changed, 42 insertions(+), 26 deletions(-) diff --git a/Include/Python-ast.h b/Include/Python-ast.h index 2913d1d..1b7d9b1 100644 --- a/Include/Python-ast.h +++ b/Include/Python-ast.h @@ -1,7 +1,15 @@ /* File automatically generated by Parser/asdl_c.py. */ +#ifndef Py_PYTHON_AST_H +#define Py_PYTHON_AST_H +#ifdef __cplusplus +extern "C" { +#endif + #include "asdl.h" +#undef Yield /* undefine macro conflicting with winbase.h */ + typedef struct _mod *mod_ty; typedef struct _stmt *stmt_ty; @@ -607,3 +615,8 @@ withitem_ty _Py_withitem(expr_ty context_expr, expr_ty optional_vars, PyArena PyObject* PyAST_mod2obj(mod_ty t); mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode); int PyAST_Check(PyObject* obj); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_PYTHON_AST_H */ diff --git a/Include/ast.h b/Include/ast.h index c824554..f1d7348 100644 --- a/Include/ast.h +++ b/Include/ast.h @@ -4,6 +4,9 @@ extern "C" { #endif +#include "Python-ast.h" /* mod_ty */ +#include "node.h" /* node */ + PyAPI_FUNC(int) PyAST_Validate(mod_ty); PyAPI_FUNC(mod_ty) PyAST_FromNode( const node *n, diff --git a/Include/parsetok.h b/Include/parsetok.h index c9407a3..1217c46 100644 --- a/Include/parsetok.h +++ b/Include/parsetok.h @@ -1,5 +1,5 @@ - /* Parser-tokenizer link interface */ + #ifndef Py_LIMITED_API #ifndef Py_PARSETOK_H #define Py_PARSETOK_H @@ -7,6 +7,9 @@ extern "C" { #endif +#include "grammar.h" /* grammar */ +#include "node.h" /* node */ + typedef struct { int error; #ifndef PGEN diff --git a/Include/symtable.h b/Include/symtable.h index 007f88d..949022b 100644 --- a/Include/symtable.h +++ b/Include/symtable.h @@ -1,11 +1,12 @@ #ifndef Py_LIMITED_API #ifndef Py_SYMTABLE_H #define Py_SYMTABLE_H - #ifdef __cplusplus extern "C" { #endif +#include "Python-ast.h" /* mod_ty */ + /* XXX(ncoghlan): This is a weird mix of public names and interpreter internal * names. */ @@ -115,4 +116,4 @@ PyAPI_FUNC(void) PySymtable_Free(struct symtable *); } #endif #endif /* !Py_SYMTABLE_H */ -#endif /* Py_LIMITED_API */ +#endif /* !Py_LIMITED_API */ diff --git a/Modules/parsermodule.c b/Modules/parsermodule.c index 38e5f75..df239d6 100644 --- a/Modules/parsermodule.c +++ b/Modules/parsermodule.c @@ -32,15 +32,14 @@ #include "Python.h" /* general Python API */ #include "Python-ast.h" /* mod_ty */ +#include "ast.h" #include "graminit.h" /* symbols defined in the grammar */ #include "node.h" /* internal parser structure */ #include "errcode.h" /* error codes for PyNode_*() */ #include "token.h" /* token definitions */ + /* ISTERMINAL() / ISNONTERMINAL() */ #include "grammar.h" #include "parsetok.h" - /* ISTERMINAL() / ISNONTERMINAL() */ -#undef Yield -#include "ast.h" extern grammar _PyParser_Grammar; /* From graminit.c */ diff --git a/Parser/asdl_c.py b/Parser/asdl_c.py index 4c280a9..6a8262c 100644 --- a/Parser/asdl_c.py +++ b/Parser/asdl_c.py @@ -1239,7 +1239,16 @@ def main(srcfile, dump_module=False): if H_FILE: with open(H_FILE, "w") as f: f.write(auto_gen_msg) - f.write('#include "asdl.h"\n\n') + f.write('#ifndef Py_PYTHON_AST_H\n') + f.write('#define Py_PYTHON_AST_H\n') + f.write('#ifdef __cplusplus\n') + f.write('extern "C" {\n') + f.write('#endif\n') + f.write('\n') + f.write('#include "asdl.h"\n') + f.write('\n') + f.write('#undef Yield /* undefine macro conflicting with winbase.h */\n') + f.write('\n') c = ChainOfVisitors(TypeDefVisitor(f), StructVisitor(f), PrototypeVisitor(f), @@ -1248,6 +1257,11 @@ def main(srcfile, dump_module=False): f.write("PyObject* PyAST_mod2obj(mod_ty t);\n") f.write("mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode);\n") f.write("int PyAST_Check(PyObject* obj);\n") + f.write('\n') + f.write('#ifdef __cplusplus\n') + f.write('}\n') + f.write('#endif\n') + f.write('#endif /* !Py_PYTHON_AST_H */\n') if C_FILE: with open(C_FILE, "w") as f: diff --git a/Python/ast_opt.c b/Python/ast_opt.c index 1f9cb77..6f72a7f 100644 --- a/Python/ast_opt.c +++ b/Python/ast_opt.c @@ -1,7 +1,6 @@ /* AST Optimizer */ #include "Python.h" #include "Python-ast.h" -#include "node.h" #include "ast.h" diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index 6c8672a..6781589 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -1,16 +1,9 @@ /* Built-in functions */ #include "Python.h" -#include "Python-ast.h" -#include "pycore_state.h" - -#include "node.h" -#include "code.h" - -#include "asdl.h" -#include "ast.h" - #include +#include "ast.h" +#include "pycore_state.h" _Py_IDENTIFIER(__builtins__); _Py_IDENTIFIER(__dict__); diff --git a/Python/compile.c b/Python/compile.c index 45a8c57..beceeea 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -24,7 +24,6 @@ #include "Python.h" #include "Python-ast.h" -#include "node.h" #include "ast.h" #include "code.h" #include "symtable.h" diff --git a/Python/import.c b/Python/import.c index c0ea968..fcd8851 100644 --- a/Python/import.c +++ b/Python/import.c @@ -3,7 +3,6 @@ #include "Python.h" #include "Python-ast.h" -#undef Yield /* undefine macro conflicting with winbase.h */ #include "pycore_hash.h" #include "pycore_lifecycle.h" #include "pycore_mem.h" diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 4c5cb53..318d7cb 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -3,7 +3,6 @@ #include "Python.h" #include "Python-ast.h" -#undef Yield /* undefine macro conflicting with winbase.h */ #include "pycore_context.h" #include "pycore_hamt.h" #include "pycore_lifecycle.h" diff --git a/Python/pythonrun.c b/Python/pythonrun.c index 2f61aab..2b9f4f0 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -11,7 +11,6 @@ #include "Python.h" #include "Python-ast.h" -#undef Yield /* undefine macro conflicting with winbase.h */ #include "pycore_state.h" #include "grammar.h" #include "node.h" diff --git a/Python/symtable.c b/Python/symtable.c index 48e1515..40f9178 100644 --- a/Python/symtable.c +++ b/Python/symtable.c @@ -1,10 +1,5 @@ #include "Python.h" #include "pycore_state.h" -#ifdef Yield -#undef Yield /* undefine conflicting macro from winbase.h */ -#endif -#include "Python-ast.h" -#include "code.h" #include "symtable.h" #include "structmember.h" -- cgit v0.12