17db96d56Sopenharmony_ci#ifndef Py_INTERNAL_SYMTABLE_H 27db96d56Sopenharmony_ci#define Py_INTERNAL_SYMTABLE_H 37db96d56Sopenharmony_ci#ifdef __cplusplus 47db96d56Sopenharmony_ciextern "C" { 57db96d56Sopenharmony_ci#endif 67db96d56Sopenharmony_ci 77db96d56Sopenharmony_ci#ifndef Py_BUILD_CORE 87db96d56Sopenharmony_ci# error "this header requires Py_BUILD_CORE define" 97db96d56Sopenharmony_ci#endif 107db96d56Sopenharmony_ci 117db96d56Sopenharmony_cistruct _mod; // Type defined in pycore_ast.h 127db96d56Sopenharmony_ci 137db96d56Sopenharmony_citypedef enum _block_type { FunctionBlock, ClassBlock, ModuleBlock, AnnotationBlock } 147db96d56Sopenharmony_ci _Py_block_ty; 157db96d56Sopenharmony_ci 167db96d56Sopenharmony_citypedef enum _comprehension_type { 177db96d56Sopenharmony_ci NoComprehension = 0, 187db96d56Sopenharmony_ci ListComprehension = 1, 197db96d56Sopenharmony_ci DictComprehension = 2, 207db96d56Sopenharmony_ci SetComprehension = 3, 217db96d56Sopenharmony_ci GeneratorExpression = 4 } _Py_comprehension_ty; 227db96d56Sopenharmony_ci 237db96d56Sopenharmony_cistruct _symtable_entry; 247db96d56Sopenharmony_ci 257db96d56Sopenharmony_cistruct symtable { 267db96d56Sopenharmony_ci PyObject *st_filename; /* name of file being compiled, 277db96d56Sopenharmony_ci decoded from the filesystem encoding */ 287db96d56Sopenharmony_ci struct _symtable_entry *st_cur; /* current symbol table entry */ 297db96d56Sopenharmony_ci struct _symtable_entry *st_top; /* symbol table entry for module */ 307db96d56Sopenharmony_ci PyObject *st_blocks; /* dict: map AST node addresses 317db96d56Sopenharmony_ci * to symbol table entries */ 327db96d56Sopenharmony_ci PyObject *st_stack; /* list: stack of namespace info */ 337db96d56Sopenharmony_ci PyObject *st_global; /* borrowed ref to st_top->ste_symbols */ 347db96d56Sopenharmony_ci int st_nblocks; /* number of blocks used. kept for 357db96d56Sopenharmony_ci consistency with the corresponding 367db96d56Sopenharmony_ci compiler structure */ 377db96d56Sopenharmony_ci PyObject *st_private; /* name of current class or NULL */ 387db96d56Sopenharmony_ci PyFutureFeatures *st_future; /* module's future features that affect 397db96d56Sopenharmony_ci the symbol table */ 407db96d56Sopenharmony_ci int recursion_depth; /* current recursion depth */ 417db96d56Sopenharmony_ci int recursion_limit; /* recursion limit */ 427db96d56Sopenharmony_ci}; 437db96d56Sopenharmony_ci 447db96d56Sopenharmony_citypedef struct _symtable_entry { 457db96d56Sopenharmony_ci PyObject_HEAD 467db96d56Sopenharmony_ci PyObject *ste_id; /* int: key in ste_table->st_blocks */ 477db96d56Sopenharmony_ci PyObject *ste_symbols; /* dict: variable names to flags */ 487db96d56Sopenharmony_ci PyObject *ste_name; /* string: name of current block */ 497db96d56Sopenharmony_ci PyObject *ste_varnames; /* list of function parameters */ 507db96d56Sopenharmony_ci PyObject *ste_children; /* list of child blocks */ 517db96d56Sopenharmony_ci PyObject *ste_directives;/* locations of global and nonlocal statements */ 527db96d56Sopenharmony_ci _Py_block_ty ste_type; /* module, class or function */ 537db96d56Sopenharmony_ci int ste_nested; /* true if block is nested */ 547db96d56Sopenharmony_ci unsigned ste_free : 1; /* true if block has free variables */ 557db96d56Sopenharmony_ci unsigned ste_child_free : 1; /* true if a child block has free vars, 567db96d56Sopenharmony_ci including free refs to globals */ 577db96d56Sopenharmony_ci unsigned ste_generator : 1; /* true if namespace is a generator */ 587db96d56Sopenharmony_ci unsigned ste_coroutine : 1; /* true if namespace is a coroutine */ 597db96d56Sopenharmony_ci _Py_comprehension_ty ste_comprehension; /* Kind of comprehension (if any) */ 607db96d56Sopenharmony_ci unsigned ste_varargs : 1; /* true if block has varargs */ 617db96d56Sopenharmony_ci unsigned ste_varkeywords : 1; /* true if block has varkeywords */ 627db96d56Sopenharmony_ci unsigned ste_returns_value : 1; /* true if namespace uses return with 637db96d56Sopenharmony_ci an argument */ 647db96d56Sopenharmony_ci unsigned ste_needs_class_closure : 1; /* for class scopes, true if a 657db96d56Sopenharmony_ci closure over __class__ 667db96d56Sopenharmony_ci should be created */ 677db96d56Sopenharmony_ci unsigned ste_comp_iter_target : 1; /* true if visiting comprehension target */ 687db96d56Sopenharmony_ci int ste_comp_iter_expr; /* non-zero if visiting a comprehension range expression */ 697db96d56Sopenharmony_ci int ste_lineno; /* first line of block */ 707db96d56Sopenharmony_ci int ste_col_offset; /* offset of first line of block */ 717db96d56Sopenharmony_ci int ste_end_lineno; /* end line of block */ 727db96d56Sopenharmony_ci int ste_end_col_offset; /* end offset of first line of block */ 737db96d56Sopenharmony_ci int ste_opt_lineno; /* lineno of last exec or import * */ 747db96d56Sopenharmony_ci int ste_opt_col_offset; /* offset of last exec or import * */ 757db96d56Sopenharmony_ci struct symtable *ste_table; 767db96d56Sopenharmony_ci} PySTEntryObject; 777db96d56Sopenharmony_ci 787db96d56Sopenharmony_ciextern PyTypeObject PySTEntry_Type; 797db96d56Sopenharmony_ci 807db96d56Sopenharmony_ci#define PySTEntry_Check(op) Py_IS_TYPE(op, &PySTEntry_Type) 817db96d56Sopenharmony_ci 827db96d56Sopenharmony_ciextern long _PyST_GetSymbol(PySTEntryObject *, PyObject *); 837db96d56Sopenharmony_ciextern int _PyST_GetScope(PySTEntryObject *, PyObject *); 847db96d56Sopenharmony_ci 857db96d56Sopenharmony_ciextern struct symtable* _PySymtable_Build( 867db96d56Sopenharmony_ci struct _mod *mod, 877db96d56Sopenharmony_ci PyObject *filename, 887db96d56Sopenharmony_ci PyFutureFeatures *future); 897db96d56Sopenharmony_ciPyAPI_FUNC(PySTEntryObject *) PySymtable_Lookup(struct symtable *, void *); 907db96d56Sopenharmony_ci 917db96d56Sopenharmony_ciextern void _PySymtable_Free(struct symtable *); 927db96d56Sopenharmony_ci 937db96d56Sopenharmony_ci/* Flags for def-use information */ 947db96d56Sopenharmony_ci 957db96d56Sopenharmony_ci#define DEF_GLOBAL 1 /* global stmt */ 967db96d56Sopenharmony_ci#define DEF_LOCAL 2 /* assignment in code block */ 977db96d56Sopenharmony_ci#define DEF_PARAM 2<<1 /* formal parameter */ 987db96d56Sopenharmony_ci#define DEF_NONLOCAL 2<<2 /* nonlocal stmt */ 997db96d56Sopenharmony_ci#define USE 2<<3 /* name is used */ 1007db96d56Sopenharmony_ci#define DEF_FREE 2<<4 /* name used but not defined in nested block */ 1017db96d56Sopenharmony_ci#define DEF_FREE_CLASS 2<<5 /* free variable from class's method */ 1027db96d56Sopenharmony_ci#define DEF_IMPORT 2<<6 /* assignment occurred via import */ 1037db96d56Sopenharmony_ci#define DEF_ANNOT 2<<7 /* this name is annotated */ 1047db96d56Sopenharmony_ci#define DEF_COMP_ITER 2<<8 /* this name is a comprehension iteration variable */ 1057db96d56Sopenharmony_ci 1067db96d56Sopenharmony_ci#define DEF_BOUND (DEF_LOCAL | DEF_PARAM | DEF_IMPORT) 1077db96d56Sopenharmony_ci 1087db96d56Sopenharmony_ci/* GLOBAL_EXPLICIT and GLOBAL_IMPLICIT are used internally by the symbol 1097db96d56Sopenharmony_ci table. GLOBAL is returned from PyST_GetScope() for either of them. 1107db96d56Sopenharmony_ci It is stored in ste_symbols at bits 12-15. 1117db96d56Sopenharmony_ci*/ 1127db96d56Sopenharmony_ci#define SCOPE_OFFSET 11 1137db96d56Sopenharmony_ci#define SCOPE_MASK (DEF_GLOBAL | DEF_LOCAL | DEF_PARAM | DEF_NONLOCAL) 1147db96d56Sopenharmony_ci 1157db96d56Sopenharmony_ci#define LOCAL 1 1167db96d56Sopenharmony_ci#define GLOBAL_EXPLICIT 2 1177db96d56Sopenharmony_ci#define GLOBAL_IMPLICIT 3 1187db96d56Sopenharmony_ci#define FREE 4 1197db96d56Sopenharmony_ci#define CELL 5 1207db96d56Sopenharmony_ci 1217db96d56Sopenharmony_ci#define GENERATOR 1 1227db96d56Sopenharmony_ci#define GENERATOR_EXPRESSION 2 1237db96d56Sopenharmony_ci 1247db96d56Sopenharmony_ci// Used by symtablemodule.c 1257db96d56Sopenharmony_ciextern struct symtable* _Py_SymtableStringObjectFlags( 1267db96d56Sopenharmony_ci const char *str, 1277db96d56Sopenharmony_ci PyObject *filename, 1287db96d56Sopenharmony_ci int start, 1297db96d56Sopenharmony_ci PyCompilerFlags *flags); 1307db96d56Sopenharmony_ci 1317db96d56Sopenharmony_ci#ifdef __cplusplus 1327db96d56Sopenharmony_ci} 1337db96d56Sopenharmony_ci#endif 1347db96d56Sopenharmony_ci#endif /* !Py_INTERNAL_SYMTABLE_H */ 135