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);
(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 */
}
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;
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);