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