mirror of
https://github.com/python/cpython.git
synced 2025-11-02 03:01:58 +00:00
Preliminary support for future nested scopes
compile.h: #define NESTED_SCOPES_DEFAULT 0 for Python 2.1
__future__ feature name: "nested_scopes"
symtable.h: Add st_nested_scopes slot. Define flags to track exec and
import star.
Lib/test/test_scope.py: requires nested scopes
compile.c: Fiddle with error messages.
Reverse the sense of ste_optimized flag on
PySymtableEntryObjects. If it is true, there is an optimization
conflict.
Modify get_ref_type to respect st_nested_scopes flags.
Refactor symtable_load_symbols() into several smaller functions,
which use struct symbol_info to share variables. In new function
symtable_update_flags(), raise an error or warning for import * or
bare exec that conflicts with nested scopes. Also, modify handle
for free variables to respect st_nested_scopes flag.
In symtable_init() assign st_nested_scopes flag to
NESTED_SCOPES_DEFAULT (defined in compile.h).
Add preliminary and often incorrect implementation of
symtable_check_future().
Add symtable_lookup() helper for future use.
This commit is contained in:
parent
2a5130ed20
commit
29906eef3a
5 changed files with 285 additions and 120 deletions
|
|
@ -7,6 +7,9 @@
|
|||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define NESTED_SCOPES_DEFAULT 0
|
||||
#define FUTURE_NESTED_SCOPES "nested_scopes"
|
||||
|
||||
/* Bytecode object */
|
||||
typedef struct {
|
||||
PyObject_HEAD
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@ struct _symtable_entry;
|
|||
|
||||
struct symtable {
|
||||
int st_pass; /* pass == 1 or 2 */
|
||||
int st_nested_scopes; /* true if nested scopes are enabled */
|
||||
char *st_filename; /* name of file being compiled */
|
||||
struct _symtable_entry *st_cur; /* current symbol table entry */
|
||||
PyObject *st_symbols; /* dictionary of symbol table entries */
|
||||
|
|
@ -40,7 +41,7 @@ typedef struct _symtable_entry {
|
|||
PyObject *ste_children; /* list of child ids */
|
||||
int ste_type; /* module, class, or function */
|
||||
int ste_lineno; /* first line of scope */
|
||||
int ste_optimized; /* true if namespace is optimized */
|
||||
int ste_optimized; /* true if namespace can't be optimized */
|
||||
int ste_nested; /* true if scope is nested */
|
||||
int ste_child_free; /* true if a child scope has free variables,
|
||||
including free refs to globals */
|
||||
|
|
@ -84,6 +85,10 @@ DL_IMPORT(void) PySymtable_Free(struct symtable *);
|
|||
#define FREE 4
|
||||
#define CELL 5
|
||||
|
||||
#define OPT_IMPORT_STAR 1
|
||||
#define OPT_EXEC 2
|
||||
#define OPT_BARE_EXEC 4
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue