Kaydet (Commit) 280e6bd7 authored tarafından Jeremy Hylton's avatar Jeremy Hylton

Make error messages clearer for illegal combinations of nested

functions and import */exec.
üst 6e9c0baa
...@@ -4191,32 +4191,53 @@ symtable_check_unoptimized(struct compiling *c, ...@@ -4191,32 +4191,53 @@ symtable_check_unoptimized(struct compiling *c,
|| (ste->ste_nested && si->si_nimplicit))) || (ste->ste_nested && si->si_nimplicit)))
return 0; return 0;
#define ILLEGAL_CONTAINS "contains a nested function with free variables"
#define ILLEGAL_IS "is a nested function"
#define ILLEGAL_IMPORT_STAR \ #define ILLEGAL_IMPORT_STAR \
"import * is not allowed in function '%.100s' " \ "import * is not allowed in function '%.100s' because it %s"
"because it contains a nested function with free variables"
#define ILLEGAL_BARE_EXEC \ #define ILLEGAL_BARE_EXEC \
"unqualified exec is not allowed in function '%.100s' " \ "unqualified exec is not allowed in function '%.100s' it %s"
"because it contains a nested function with free variables"
#define ILLEGAL_EXEC_AND_IMPORT_STAR \ #define ILLEGAL_EXEC_AND_IMPORT_STAR \
"function '%.100s' uses import * and bare exec, which are illegal" \ "function '%.100s' uses import * and bare exec, which are illegal" \
"because it contains a nested function with free variables" "because it %s"
/* XXX perhaps the linenos for these opt-breaking statements /* XXX perhaps the linenos for these opt-breaking statements
should be stored so the exception can point to them. */ should be stored so the exception can point to them. */
if (ste->ste_optimized == OPT_IMPORT_STAR) if (ste->ste_child_free) {
sprintf(buf, ILLEGAL_IMPORT_STAR, if (ste->ste_optimized == OPT_IMPORT_STAR)
PyString_AS_STRING(ste->ste_name)); sprintf(buf, ILLEGAL_IMPORT_STAR,
else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC)) PyString_AS_STRING(ste->ste_name),
sprintf(buf, ILLEGAL_BARE_EXEC, ILLEGAL_CONTAINS);
PyString_AS_STRING(ste->ste_name)); else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
else { sprintf(buf, ILLEGAL_BARE_EXEC,
sprintf(buf, ILLEGAL_EXEC_AND_IMPORT_STAR, PyString_AS_STRING(ste->ste_name),
PyString_AS_STRING(ste->ste_name)); ILLEGAL_CONTAINS);
else {
sprintf(buf, ILLEGAL_EXEC_AND_IMPORT_STAR,
PyString_AS_STRING(ste->ste_name),
ILLEGAL_CONTAINS);
}
} else {
if (ste->ste_optimized == OPT_IMPORT_STAR)
sprintf(buf, ILLEGAL_IMPORT_STAR,
PyString_AS_STRING(ste->ste_name),
ILLEGAL_IS);
else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
sprintf(buf, ILLEGAL_BARE_EXEC,
PyString_AS_STRING(ste->ste_name),
ILLEGAL_IS);
else {
sprintf(buf, ILLEGAL_EXEC_AND_IMPORT_STAR,
PyString_AS_STRING(ste->ste_name),
ILLEGAL_IS);
}
} }
if (c->c_symtable->st_nested_scopes) { if (c->c_symtable->st_nested_scopes) {
PyErr_SetString(PyExc_SyntaxError, buf); PyErr_SetString(PyExc_SyntaxError, buf);
PyErr_SyntaxLocation(c->c_symtable->st_filename, PyErr_SyntaxLocation(c->c_symtable->st_filename,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment