Commit 5f2df88b authored by Victor Stinner's avatar Victor Stinner Committed by GitHub

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
parent fd3a91cb
/* File automatically generated by Parser/asdl_c.py. */ /* 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" #include "asdl.h"
#undef Yield /* undefine macro conflicting with winbase.h */
typedef struct _mod *mod_ty; typedef struct _mod *mod_ty;
typedef struct _stmt *stmt_ty; typedef struct _stmt *stmt_ty;
...@@ -607,3 +615,8 @@ withitem_ty _Py_withitem(expr_ty context_expr, expr_ty optional_vars, PyArena ...@@ -607,3 +615,8 @@ withitem_ty _Py_withitem(expr_ty context_expr, expr_ty optional_vars, PyArena
PyObject* PyAST_mod2obj(mod_ty t); PyObject* PyAST_mod2obj(mod_ty t);
mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode); mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode);
int PyAST_Check(PyObject* obj); int PyAST_Check(PyObject* obj);
#ifdef __cplusplus
}
#endif
#endif /* !Py_PYTHON_AST_H */
...@@ -4,6 +4,9 @@ ...@@ -4,6 +4,9 @@
extern "C" { extern "C" {
#endif #endif
#include "Python-ast.h" /* mod_ty */
#include "node.h" /* node */
PyAPI_FUNC(int) PyAST_Validate(mod_ty); PyAPI_FUNC(int) PyAST_Validate(mod_ty);
PyAPI_FUNC(mod_ty) PyAST_FromNode( PyAPI_FUNC(mod_ty) PyAST_FromNode(
const node *n, const node *n,
......
/* Parser-tokenizer link interface */ /* Parser-tokenizer link interface */
#ifndef Py_LIMITED_API #ifndef Py_LIMITED_API
#ifndef Py_PARSETOK_H #ifndef Py_PARSETOK_H
#define Py_PARSETOK_H #define Py_PARSETOK_H
...@@ -7,6 +7,9 @@ ...@@ -7,6 +7,9 @@
extern "C" { extern "C" {
#endif #endif
#include "grammar.h" /* grammar */
#include "node.h" /* node */
typedef struct { typedef struct {
int error; int error;
#ifndef PGEN #ifndef PGEN
......
#ifndef Py_LIMITED_API #ifndef Py_LIMITED_API
#ifndef Py_SYMTABLE_H #ifndef Py_SYMTABLE_H
#define Py_SYMTABLE_H #define Py_SYMTABLE_H
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
#include "Python-ast.h" /* mod_ty */
/* XXX(ncoghlan): This is a weird mix of public names and interpreter internal /* XXX(ncoghlan): This is a weird mix of public names and interpreter internal
* names. * names.
*/ */
...@@ -115,4 +116,4 @@ PyAPI_FUNC(void) PySymtable_Free(struct symtable *); ...@@ -115,4 +116,4 @@ PyAPI_FUNC(void) PySymtable_Free(struct symtable *);
} }
#endif #endif
#endif /* !Py_SYMTABLE_H */ #endif /* !Py_SYMTABLE_H */
#endif /* Py_LIMITED_API */ #endif /* !Py_LIMITED_API */
...@@ -32,15 +32,14 @@ ...@@ -32,15 +32,14 @@
#include "Python.h" /* general Python API */ #include "Python.h" /* general Python API */
#include "Python-ast.h" /* mod_ty */ #include "Python-ast.h" /* mod_ty */
#include "ast.h"
#include "graminit.h" /* symbols defined in the grammar */ #include "graminit.h" /* symbols defined in the grammar */
#include "node.h" /* internal parser structure */ #include "node.h" /* internal parser structure */
#include "errcode.h" /* error codes for PyNode_*() */ #include "errcode.h" /* error codes for PyNode_*() */
#include "token.h" /* token definitions */ #include "token.h" /* token definitions */
/* ISTERMINAL() / ISNONTERMINAL() */
#include "grammar.h" #include "grammar.h"
#include "parsetok.h" #include "parsetok.h"
/* ISTERMINAL() / ISNONTERMINAL() */
#undef Yield
#include "ast.h"
extern grammar _PyParser_Grammar; /* From graminit.c */ extern grammar _PyParser_Grammar; /* From graminit.c */
......
...@@ -1239,7 +1239,16 @@ def main(srcfile, dump_module=False): ...@@ -1239,7 +1239,16 @@ def main(srcfile, dump_module=False):
if H_FILE: if H_FILE:
with open(H_FILE, "w") as f: with open(H_FILE, "w") as f:
f.write(auto_gen_msg) 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), c = ChainOfVisitors(TypeDefVisitor(f),
StructVisitor(f), StructVisitor(f),
PrototypeVisitor(f), PrototypeVisitor(f),
...@@ -1248,6 +1257,11 @@ def main(srcfile, dump_module=False): ...@@ -1248,6 +1257,11 @@ def main(srcfile, dump_module=False):
f.write("PyObject* PyAST_mod2obj(mod_ty t);\n") f.write("PyObject* PyAST_mod2obj(mod_ty t);\n")
f.write("mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode);\n") f.write("mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode);\n")
f.write("int PyAST_Check(PyObject* obj);\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: if C_FILE:
with open(C_FILE, "w") as f: with open(C_FILE, "w") as f:
......
/* AST Optimizer */ /* AST Optimizer */
#include "Python.h" #include "Python.h"
#include "Python-ast.h" #include "Python-ast.h"
#include "node.h"
#include "ast.h" #include "ast.h"
......
/* Built-in functions */ /* Built-in functions */
#include "Python.h" #include "Python.h"
#include "Python-ast.h"
#include "pycore_state.h"
#include "node.h"
#include "code.h"
#include "asdl.h"
#include "ast.h"
#include <ctype.h> #include <ctype.h>
#include "ast.h"
#include "pycore_state.h"
_Py_IDENTIFIER(__builtins__); _Py_IDENTIFIER(__builtins__);
_Py_IDENTIFIER(__dict__); _Py_IDENTIFIER(__dict__);
......
...@@ -24,7 +24,6 @@ ...@@ -24,7 +24,6 @@
#include "Python.h" #include "Python.h"
#include "Python-ast.h" #include "Python-ast.h"
#include "node.h"
#include "ast.h" #include "ast.h"
#include "code.h" #include "code.h"
#include "symtable.h" #include "symtable.h"
......
...@@ -3,7 +3,6 @@ ...@@ -3,7 +3,6 @@
#include "Python.h" #include "Python.h"
#include "Python-ast.h" #include "Python-ast.h"
#undef Yield /* undefine macro conflicting with winbase.h */
#include "pycore_hash.h" #include "pycore_hash.h"
#include "pycore_lifecycle.h" #include "pycore_lifecycle.h"
#include "pycore_mem.h" #include "pycore_mem.h"
......
...@@ -3,7 +3,6 @@ ...@@ -3,7 +3,6 @@
#include "Python.h" #include "Python.h"
#include "Python-ast.h" #include "Python-ast.h"
#undef Yield /* undefine macro conflicting with winbase.h */
#include "pycore_context.h" #include "pycore_context.h"
#include "pycore_hamt.h" #include "pycore_hamt.h"
#include "pycore_lifecycle.h" #include "pycore_lifecycle.h"
......
...@@ -11,7 +11,6 @@ ...@@ -11,7 +11,6 @@
#include "Python.h" #include "Python.h"
#include "Python-ast.h" #include "Python-ast.h"
#undef Yield /* undefine macro conflicting with winbase.h */
#include "pycore_state.h" #include "pycore_state.h"
#include "grammar.h" #include "grammar.h"
#include "node.h" #include "node.h"
......
#include "Python.h" #include "Python.h"
#include "pycore_state.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 "symtable.h"
#include "structmember.h" #include "structmember.h"
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment