[Python-checkins] python/dist/src/Python symtable.c, 2.10.8.18,
2.10.8.19 ast.c, 1.1.2.43, 1.1.2.44
nnorwitz at projects.sourceforge.net
nnorwitz at projects.sourceforge.net
Sat Jan 24 14:46:29 EST 2004
Update of /cvsroot/python/python/dist/src/Python
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv23106/Python
Modified Files:
Tag: ast-branch
symtable.c ast.c
Log Message:
handle nested tuple arguments
Index: symtable.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Python/symtable.c,v
retrieving revision 2.10.8.18
retrieving revision 2.10.8.19
diff -C2 -d -r2.10.8.18 -r2.10.8.19
*** symtable.c 24 Jan 2004 18:33:38 -0000 2.10.8.18
--- symtable.c 24 Jan 2004 19:43:46 -0000 2.10.8.19
***************
*** 853,863 ****
symtable_visit_params(struct symtable *st, asdl_seq *args, int toplevel)
{
! int i;
for (i = 0; i < asdl_seq_LEN(args); i++) {
expr_ty arg = asdl_seq_GET(args, i);
if (arg->kind == Name_kind) {
assert(arg->v.Name.ctx == Param ||
! arg->v.Name.ctx == Store);
if (!symtable_add_def(st, arg->v.Name.id, DEF_PARAM))
return 0;
--- 853,864 ----
symtable_visit_params(struct symtable *st, asdl_seq *args, int toplevel)
{
! int i, complex = 0;
+ /* go through all the toplevel arguments first */
for (i = 0; i < asdl_seq_LEN(args); i++) {
expr_ty arg = asdl_seq_GET(args, i);
if (arg->kind == Name_kind) {
assert(arg->v.Name.ctx == Param ||
! (arg->v.Name.ctx == Store && !toplevel));
if (!symtable_add_def(st, arg->v.Name.id, DEF_PARAM))
return 0;
***************
*** 865,874 ****
else if (arg->kind == Tuple_kind) {
assert(arg->v.Tuple.ctx == Store);
if (toplevel) {
if (!symtable_implicit_arg(st, i))
return 0;
}
- if (!symtable_visit_params(st, arg->v.Tuple.elts, 0))
- return 0;
}
else {
--- 866,874 ----
else if (arg->kind == Tuple_kind) {
assert(arg->v.Tuple.ctx == Store);
+ complex = 1;
if (toplevel) {
if (!symtable_implicit_arg(st, i))
return 0;
}
}
else {
***************
*** 878,881 ****
--- 878,891 ----
}
}
+
+ /* visit all the nested arguments */
+ if (complex) {
+ for (i = 0; i < asdl_seq_LEN(args); i++) {
+ expr_ty arg = asdl_seq_GET(args, i);
+ if (arg->kind == Tuple_kind &&
+ !symtable_visit_params(st, arg->v.Tuple.elts, 0))
+ return 0;
+ }
+ }
return 1;
Index: ast.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Python/Attic/ast.c,v
retrieving revision 1.1.2.43
retrieving revision 1.1.2.44
diff -C2 -d -r1.1.2.43 -r1.1.2.44
*** ast.c 23 Jan 2004 16:03:25 -0000 1.1.2.43
--- ast.c 24 Jan 2004 19:44:12 -0000 1.1.2.44
***************
*** 181,185 ****
}
case encoding_decl:
! /* XXX need to handle properlyi, ignore for now */
stmts = asdl_seq_new(1);
if (!stmts)
--- 181,185 ----
}
case encoding_decl:
! /* XXX need to handle properly, ignore for now */
stmts = asdl_seq_new(1);
if (!stmts)
***************
*** 428,437 ****
}
/* Create AST for argument list.
XXX TO DO:
- check for invalid argument lists like normal after default
- - handle nested tuple arguments
- - handle default arguments properly (might be problem somewhere else)
*/
--- 428,456 ----
}
+ static expr_ty
+ compiler_complex_args(const node *n)
+ {
+ int i, len = (NCH(n) + 1) / 2;
+ asdl_seq *args = asdl_seq_new(len);
+ if (!args)
+ return NULL;
+
+ for (i = 0; i < len; i++) {
+ const node *child = CHILD(CHILD(n, 2*i), 0);
+ expr_ty arg;
+ if (TYPE(child) == NAME)
+ arg = Name(NEW_IDENTIFIER(child), Store);
+ else
+ arg = compiler_complex_args(child);
+ asdl_seq_SET(args, i, arg);
+ }
+
+ return Tuple(args, Store);
+ }
+
/* Create AST for argument list.
XXX TO DO:
- check for invalid argument lists like normal after default
*/
***************
*** 479,485 ****
case fpdef:
if (NCH(ch) == 3)
! /* XXX don't handle fplist yet */
! goto error;
! if (TYPE(CHILD(ch, 0)) == NAME)
/* XXX check return value of Name call */
asdl_seq_APPEND(args, Name(NEW_IDENTIFIER(CHILD(ch, 0)),
--- 498,504 ----
case fpdef:
if (NCH(ch) == 3)
! asdl_seq_APPEND(args,
! compiler_complex_args(CHILD(ch, 1)));
! else if (TYPE(CHILD(ch, 0)) == NAME)
/* XXX check return value of Name call */
asdl_seq_APPEND(args, Name(NEW_IDENTIFIER(CHILD(ch, 0)),
More information about the Python-checkins
mailing list