diff options
author | Jeremy Hylton <jeremy@alum.mit.edu> | 2001-03-01 22:59:14 (GMT) |
---|---|---|
committer | Jeremy Hylton <jeremy@alum.mit.edu> | 2001-03-01 22:59:14 (GMT) |
commit | 9f324e964e06c79f9c47501afa12b1af4cb1a75f (patch) | |
tree | 1042e0c0f358ed8130f826fbf28b95e88921df3f /Python/compile.c | |
parent | 0f6b3832b9a0397910308f22f75f8449c4f492d8 (diff) | |
download | cpython-9f324e964e06c79f9c47501afa12b1af4cb1a75f.zip cpython-9f324e964e06c79f9c47501afa12b1af4cb1a75f.tar.gz cpython-9f324e964e06c79f9c47501afa12b1af4cb1a75f.tar.bz2 |
Useful future statement support for the interactive interpreter
(Also remove warning about module-level global decl, because we can't
distinguish from code passed to exec.)
Define PyCompilerFlags type contains a single element,
cf_nested_scopes, that is true if a nested scopes future statement has
been entered at the interactive prompt.
New API functions:
PyNode_CompileFlags()
PyRun_InteractiveOneFlags()
-- same as their non Flags counterparts except that the take an
optional PyCompilerFlags pointer
compile.c: In jcompile() use PyCompilerFlags argument. If
cf_nested_scopes is true, compile code with nested scopes. If it
is false, but the code has a valid future nested scopes statement,
set it to true.
pythonrun.c: Create a new PyCompilerFlags object in
PyRun_InteractiveLoop() and thread it through to
PyRun_InteractiveOneFlags().
Diffstat (limited to 'Python/compile.c')
-rw-r--r-- | Python/compile.c | 38 |
1 files changed, 27 insertions, 11 deletions
diff --git a/Python/compile.c b/Python/compile.c index efef05b..fe4d05e 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -471,7 +471,8 @@ static int com_argdefs(struct compiling *, node *); static void com_assign(struct compiling *, node *, int, node *); static void com_assign_name(struct compiling *, node *, int); static PyCodeObject *icompile(node *, struct compiling *); -static PyCodeObject *jcompile(node *, char *, struct compiling *); +static PyCodeObject *jcompile(node *, char *, struct compiling *, + PyCompilerFlags *); static PyObject *parsestrplus(node *); static PyObject *parsestr(char *); static node *get_rawdocstring(node *); @@ -3816,7 +3817,13 @@ dict_keys_inorder(PyObject *dict, int offset) PyCodeObject * PyNode_Compile(node *n, char *filename) { - return jcompile(n, filename, NULL); + return PyNode_CompileFlags(n, filename, NULL); +} + +PyCodeObject * +PyNode_CompileFlags(node *n, char *filename, PyCompilerFlags *flags) +{ + return jcompile(n, filename, NULL, flags); } struct symtable * @@ -3844,11 +3851,12 @@ PyNode_CompileSymtable(node *n, char *filename) static PyCodeObject * icompile(node *n, struct compiling *base) { - return jcompile(n, base->c_filename, base); + return jcompile(n, base->c_filename, base, NULL); } static PyCodeObject * -jcompile(node *n, char *filename, struct compiling *base) +jcompile(node *n, char *filename, struct compiling *base, + PyCompilerFlags *flags) { struct compiling sc; PyCodeObject *co; @@ -3864,7 +3872,17 @@ jcompile(node *n, char *filename, struct compiling *base) } else { sc.c_private = NULL; sc.c_future = PyNode_Future(n, filename); - if (sc.c_future == NULL || symtable_build(&sc, n) < 0) { + if (sc.c_future == NULL) { + com_free(&sc); + return NULL; + } + if (flags) { + if (flags->cf_nested_scopes) + sc.c_future->ff_nested_scopes = 1; + else if (sc.c_future->ff_nested_scopes) + flags->cf_nested_scopes = 1; + } + if (symtable_build(&sc, n) < 0) { com_free(&sc); return NULL; } @@ -4952,12 +4970,10 @@ symtable_global(struct symtable *st, node *n) { int i; - if (st->st_nscopes == 1) { - /* XXX must check that we are compiling file_input */ - if (symtable_warn(st, - "global statement has no meaning at module level") < 0) - return; - } + /* XXX It might be helpful to warn about module-level global + statements, but it's hard to tell the difference between + module-level and a string passed to exec. + */ for (i = 1; i < NCH(n); i += 2) { char *name = STR(CHILD(n, i)); |