summaryrefslogtreecommitdiffstats
path: root/Python/compile.c
diff options
context:
space:
mode:
authorJeremy Hylton <jeremy@alum.mit.edu>2003-08-28 14:42:14 (GMT)
committerJeremy Hylton <jeremy@alum.mit.edu>2003-08-28 14:42:14 (GMT)
commit376e63d5cdb7388b5787ab10f7d82ba24257e742 (patch)
tree36d17f0ca63b937b0bf01f2030d0b673e091912e /Python/compile.c
parentead21f596ce9c3f3ed3349bdf872182a1e930ca0 (diff)
downloadcpython-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.c16
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);