Mercurial > cpython-lru_cache-weakref
diff Python/compile.c @ 17076:85d74f040712 legacy-trunk
Fix crashes in nested list comprehensions
SF bugs 409230 and 407800
Also remove bogus list comp code from symtable_assign().
| author | Jeremy Hylton <jeremy@alum.mit.edu> |
|---|---|
| date | Mon, 19 Mar 2001 20:38:06 +0000 |
| parents | b046a31af2e0 |
| children | 7e181eba6b9b |
line wrap: on
line diff
--- a/Python/compile.c Mon Mar 19 19:19:45 2001 +0000 +++ b/Python/compile.c Mon Mar 19 20:38:06 2001 +0000 @@ -1,4 +1,3 @@ - /* Compile an expression node to intermediate code */ /* XXX TO DO: @@ -4818,9 +4817,11 @@ } case listmaker: if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) { + st->st_tmpname++; symtable_list_comprehension(st, CHILD(n, 1)); - n = CHILD(n, 0); - goto loop; + symtable_node(st, CHILD(n, 0)); + st->st_tmpname--; + return; } case atom: if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) { @@ -5017,13 +5018,12 @@ { char tmpname[12]; - sprintf(tmpname, "_[%d]", ++st->st_tmpname); + sprintf(tmpname, "_[%d]", st->st_tmpname); symtable_add_def(st, tmpname, DEF_LOCAL); symtable_assign(st, CHILD(n, 1), 0); symtable_node(st, CHILD(n, 3)); if (NCH(n) == 5) symtable_node(st, CHILD(n, 4)); - --st->st_tmpname; } static void @@ -5095,9 +5095,11 @@ } return; case listmaker: - if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) - symtable_list_comprehension(st, CHILD(n, 1)); - else { + if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) { + /* XXX This is an error, but the next pass + will catch it. */ + return; + } else { for (i = 0; i < NCH(n); i += 2) symtable_assign(st, CHILD(n, i), flag); }
