Fix crashes in nested list comprehensions

SF bugs 409230 and 407800

Also remove bogus list comp code from symtable_assign().
This commit is contained in:
Jeremy Hylton 2001-03-19 20:38:06 +00:00
parent baa03e80f4
commit 23b4227ec8

View file

@ -1,4 +1,3 @@
/* Compile an expression node to intermediate code */ /* Compile an expression node to intermediate code */
/* XXX TO DO: /* XXX TO DO:
@ -4818,9 +4817,11 @@ symtable_node(struct symtable *st, node *n)
} }
case listmaker: case listmaker:
if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) { if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
st->st_tmpname++;
symtable_list_comprehension(st, CHILD(n, 1)); symtable_list_comprehension(st, CHILD(n, 1));
n = CHILD(n, 0); symtable_node(st, CHILD(n, 0));
goto loop; st->st_tmpname--;
return;
} }
case atom: case atom:
if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) { if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
@ -5017,13 +5018,12 @@ symtable_list_comprehension(struct symtable *st, node *n)
{ {
char tmpname[12]; char tmpname[12];
sprintf(tmpname, "_[%d]", ++st->st_tmpname); sprintf(tmpname, "_[%d]", st->st_tmpname);
symtable_add_def(st, tmpname, DEF_LOCAL); symtable_add_def(st, tmpname, DEF_LOCAL);
symtable_assign(st, CHILD(n, 1), 0); symtable_assign(st, CHILD(n, 1), 0);
symtable_node(st, CHILD(n, 3)); symtable_node(st, CHILD(n, 3));
if (NCH(n) == 5) if (NCH(n) == 5)
symtable_node(st, CHILD(n, 4)); symtable_node(st, CHILD(n, 4));
--st->st_tmpname;
} }
static void static void
@ -5095,9 +5095,11 @@ symtable_assign(struct symtable *st, node *n, int flag)
} }
return; return;
case listmaker: case listmaker:
if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
symtable_list_comprehension(st, CHILD(n, 1)); /* XXX This is an error, but the next pass
else { will catch it. */
return;
} else {
for (i = 0; i < NCH(n); i += 2) for (i = 0; i < NCH(n); i += 2)
symtable_assign(st, CHILD(n, i), flag); symtable_assign(st, CHILD(n, i), flag);
} }