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);
 		}