symtable.h revision 3e0055f8c65c407e74ce476b8e2b1fb889723514
14b38da664c107bc08768235a66621429beef5444Jeremy Hylton#ifndef Py_SYMTABLE_H 24b38da664c107bc08768235a66621429beef5444Jeremy Hylton#define Py_SYMTABLE_H 34b38da664c107bc08768235a66621429beef5444Jeremy Hylton#ifdef __cplusplus 44b38da664c107bc08768235a66621429beef5444Jeremy Hyltonextern "C" { 54b38da664c107bc08768235a66621429beef5444Jeremy Hylton#endif 64b38da664c107bc08768235a66621429beef5444Jeremy Hylton 73e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltontypedef enum _block_type { FunctionBlock, ClassBlock, ModuleBlock } 83e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton block_ty; 94b38da664c107bc08768235a66621429beef5444Jeremy Hylton 10cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hyltonstruct _symtable_entry; 11cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton 124b38da664c107bc08768235a66621429beef5444Jeremy Hyltonstruct symtable { 1395292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. Löwis const char *st_filename; /* name of file being compiled */ 14cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton struct _symtable_entry *st_cur; /* current symbol table entry */ 153e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton struct _symtable_entry *st_top; /* module entry */ 16cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton PyObject *st_symbols; /* dictionary of symbol table entries */ 174b38da664c107bc08768235a66621429beef5444Jeremy Hylton PyObject *st_stack; /* stack of namespace info */ 184b38da664c107bc08768235a66621429beef5444Jeremy Hylton PyObject *st_global; /* borrowed ref to MODULE in st_symbols */ 193e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton int st_nblocks; /* number of blocks */ 204b38da664c107bc08768235a66621429beef5444Jeremy Hylton char *st_private; /* name of current class or NULL */ 213e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton int st_tmpname; /* temporary name counter */ 224db62b1e14ed909d4bd574633a11c45455c76bebJeremy Hylton PyFutureFeatures *st_future; /* module's future features */ 234b38da664c107bc08768235a66621429beef5444Jeremy Hylton}; 244b38da664c107bc08768235a66621429beef5444Jeremy Hylton 25cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hyltontypedef struct _symtable_entry { 26cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton PyObject_HEAD 273e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton PyObject *ste_id; /* int: key in st_symbols */ 283e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton PyObject *ste_symbols; /* dict: name to flags */ 293e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton PyObject *ste_name; /* string: name of block */ 30cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton PyObject *ste_varnames; /* list of variable names */ 31cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton PyObject *ste_children; /* list of child ids */ 323e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton block_ty ste_type; /* module, class, or function */ 333e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton int ste_unoptimized; /* false if namespace is optimized */ 343e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton int ste_nested : 1; /* true if block is nested */ 353e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton int ste_free : 1; /* true if block has free variables */ 363e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton int ste_child_free : 1; /* true if a child block has free variables, 37cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton including free refs to globals */ 383e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton int ste_generator : 1; /* true if namespace is a generator */ 393e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton int ste_varargs : 1; /* true if block has varargs */ 403e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton int ste_varkeywords : 1; /* true if block has varkeywords */ 413e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton int ste_lineno; /* first line of block */ 422e2cded1b56cc5488f49d395b46131fd995b02bcJeremy Hylton int ste_opt_lineno; /* lineno of last exec or import * */ 433e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton int ste_tmpname; /* counter for listcomp temp vars */ 44cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton struct symtable *ste_table; 453e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton} PySTEntryObject; 46cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton 473e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy HyltonPyAPI_DATA(PyTypeObject) PySTEntry_Type; 48cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton 493e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#define PySTEntry_Check(op) ((op)->ob_type == &PySTEntry_Type) 50cb17ae8b19c35cc63e7daec871c025d903c49105Jeremy Hylton 513e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy HyltonPyAPI_FUNC(PySTEntryObject *) \ 523e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton PySTEntry_New(struct symtable *, identifier, block_ty, void *, int); 533e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy HyltonPyAPI_FUNC(int) PyST_GetScope(PySTEntryObject *, PyObject *); 544b38da664c107bc08768235a66621429beef5444Jeremy Hylton 553e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy HyltonPyAPI_FUNC(struct symtable *) PySymtable_Build(mod_ty, const char *, 563e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton PyFutureFeatures *); 573e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy HyltonPyAPI_FUNC(PySTEntryObject *) PySymtable_Lookup(struct symtable *, void *); 584b38da664c107bc08768235a66621429beef5444Jeremy Hylton 593e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy HyltonPyAPI_FUNC(void) PySymtable_Free(struct symtable *); 604b38da664c107bc08768235a66621429beef5444Jeremy Hylton 614b38da664c107bc08768235a66621429beef5444Jeremy Hylton/* Flags for def-use information */ 624b38da664c107bc08768235a66621429beef5444Jeremy Hylton 634b38da664c107bc08768235a66621429beef5444Jeremy Hylton#define DEF_GLOBAL 1 /* global stmt */ 644b38da664c107bc08768235a66621429beef5444Jeremy Hylton#define DEF_LOCAL 2 /* assignment in code block */ 654b38da664c107bc08768235a66621429beef5444Jeremy Hylton#define DEF_PARAM 2<<1 /* formal parameter */ 664b38da664c107bc08768235a66621429beef5444Jeremy Hylton#define USE 2<<2 /* name is used */ 674b38da664c107bc08768235a66621429beef5444Jeremy Hylton#define DEF_STAR 2<<3 /* parameter is star arg */ 684b38da664c107bc08768235a66621429beef5444Jeremy Hylton#define DEF_DOUBLESTAR 2<<4 /* parameter is star-star arg */ 694b38da664c107bc08768235a66621429beef5444Jeremy Hylton#define DEF_INTUPLE 2<<5 /* name defined in tuple in parameters */ 703e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#define DEF_FREE 2<<6 /* name used but not defined in nested block */ 714b38da664c107bc08768235a66621429beef5444Jeremy Hylton#define DEF_FREE_GLOBAL 2<<7 /* free variable is actually implicit global */ 724b38da664c107bc08768235a66621429beef5444Jeremy Hylton#define DEF_FREE_CLASS 2<<8 /* free variable from class's method */ 734b38da664c107bc08768235a66621429beef5444Jeremy Hylton#define DEF_IMPORT 2<<9 /* assignment occurred via import */ 744b38da664c107bc08768235a66621429beef5444Jeremy Hylton 7599858b53fc47c98d04357e6a1c0aa5634a443415Jeremy Hylton#define DEF_BOUND (DEF_LOCAL | DEF_PARAM | DEF_IMPORT) 7699858b53fc47c98d04357e6a1c0aa5634a443415Jeremy Hylton 773e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton/* GLOBAL_EXPLICIT and GLOBAL_IMPLICIT are used internally by the symbol 783e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton table. GLOBAL is returned from PyST_GetScope() for either of them. 793e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton It is stored in ste_symbols at bits 12-14. 803e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton*/ 813e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#define SCOPE_OFF 11 823e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#define SCOPE_MASK 7 834b38da664c107bc08768235a66621429beef5444Jeremy Hylton 844b38da664c107bc08768235a66621429beef5444Jeremy Hylton#define LOCAL 1 854b38da664c107bc08768235a66621429beef5444Jeremy Hylton#define GLOBAL_EXPLICIT 2 864b38da664c107bc08768235a66621429beef5444Jeremy Hylton#define GLOBAL_IMPLICIT 3 874b38da664c107bc08768235a66621429beef5444Jeremy Hylton#define FREE 4 884b38da664c107bc08768235a66621429beef5444Jeremy Hylton#define CELL 5 894b38da664c107bc08768235a66621429beef5444Jeremy Hylton 903e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton/* The following three names are used for the ste_unoptimized bit field */ 9129906eef3a56c43a4cd68a8706c75844b2384e59Jeremy Hylton#define OPT_IMPORT_STAR 1 9229906eef3a56c43a4cd68a8706c75844b2384e59Jeremy Hylton#define OPT_EXEC 2 9329906eef3a56c43a4cd68a8706c75844b2384e59Jeremy Hylton#define OPT_BARE_EXEC 4 943e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#define OPT_TOPLEVEL 8 /* top-level names, including eval and exec */ 953e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton 963e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#define GENERATOR 1 973e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#define GENERATOR_EXPRESSION 2 9829906eef3a56c43a4cd68a8706c75844b2384e59Jeremy Hylton 99354433a59dd1701985ec8463ced25a967cade3c1Raymond Hettinger#define GENERATOR 1 100354433a59dd1701985ec8463ced25a967cade3c1Raymond Hettinger#define GENERATOR_EXPRESSION 2 101354433a59dd1701985ec8463ced25a967cade3c1Raymond Hettinger 1024b38da664c107bc08768235a66621429beef5444Jeremy Hylton#ifdef __cplusplus 1034b38da664c107bc08768235a66621429beef5444Jeremy Hylton} 1044b38da664c107bc08768235a66621429beef5444Jeremy Hylton#endif 1054b38da664c107bc08768235a66621429beef5444Jeremy Hylton#endif /* !Py_SYMTABLE_H */ 106