diff options
author | Jeremy Hylton <jeremy@alum.mit.edu> | 2003-08-28 14:42:14 (GMT) |
---|---|---|
committer | Jeremy Hylton <jeremy@alum.mit.edu> | 2003-08-28 14:42:14 (GMT) |
commit | 376e63d5cdb7388b5787ab10f7d82ba24257e742 (patch) | |
tree | 36d17f0ca63b937b0bf01f2030d0b673e091912e /Python/compile.c | |
parent | ead21f596ce9c3f3ed3349bdf872182a1e930ca0 (diff) | |
download | cpython-376e63d5cdb7388b5787ab10f7d82ba24257e742.zip cpython-376e63d5cdb7388b5787ab10f7d82ba24257e742.tar.gz cpython-376e63d5cdb7388b5787ab10f7d82ba24257e742.tar.bz2 |
Fix for SF bug [ 784075 ] Fatal Python error: unknown scope
Make sure the inner function is not compiled when there is a syntax
error in the default arguments.
Diffstat (limited to 'Python/compile.c')
-rw-r--r-- | Python/compile.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/Python/compile.c b/Python/compile.c index 38624d4..69a07af 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -3666,10 +3666,16 @@ com_continue_stmt(struct compiling *c, node *n) XXX if we could pop the exception still on the stack */ } +/* Return the number of default values in the argument list. + + If a non-default argument follows a default argument, set an + exception and return -1. +*/ + static int com_argdefs(struct compiling *c, node *n) { - int i, nch, nargs, ndefs; + int i, nch, ndefs; if (TYPE(n) == lambdef) { /* lambdef: 'lambda' [varargslist] ':' test */ n = CHILD(n, 1); @@ -3686,14 +3692,12 @@ com_argdefs(struct compiling *c, node *n) (fpdef ['=' test] ',')* '*' ....... | fpdef ['=' test] (',' fpdef ['=' test])* [','] */ nch = NCH(n); - nargs = 0; ndefs = 0; for (i = 0; i < nch; i++) { int t; if (TYPE(CHILD(n, i)) == STAR || TYPE(CHILD(n, i)) == DOUBLESTAR) break; - nargs++; i++; if (i >= nch) t = RPAR; /* Anything except EQUAL or COMMA */ @@ -3710,9 +3714,11 @@ com_argdefs(struct compiling *c, node *n) } else { /* Treat "(a=1, b)" as an error */ - if (ndefs) + if (ndefs) { com_error(c, PyExc_SyntaxError, "non-default argument follows default argument"); + return -1; + } } if (t != COMMA) break; @@ -3727,6 +3733,8 @@ com_funcdef(struct compiling *c, node *n) int ndefs; REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */ ndefs = com_argdefs(c, n); + if (ndefs < 0) + return; symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n), n->n_lineno); co = (PyObject *)icompile(n, c); |