mirror of
https://github.com/python/cpython.git
synced 2025-07-19 17:25:54 +00:00
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:
parent
baa03e80f4
commit
23b4227ec8
1 changed files with 10 additions and 8 deletions
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue