[Python-checkins] r54404 - in python/trunk: Lib/test/test_syntax.py Misc/NEWS Python/ast.c

collin.winter python-checkins at python.org
Fri Mar 16 05:11:37 CET 2007


Author: collin.winter
Date: Fri Mar 16 05:11:30 2007
New Revision: 54404
Modified:
 python/trunk/Lib/test/test_syntax.py
 python/trunk/Misc/NEWS
 python/trunk/Python/ast.c
Log:
Patch #1642547: Fix an error/crash when encountering syntax errors in complex if statements.
Will backport.
Modified: python/trunk/Lib/test/test_syntax.py
==============================================================================
--- python/trunk/Lib/test/test_syntax.py	(original)
+++ python/trunk/Lib/test/test_syntax.py	Fri Mar 16 05:11:30 2007
@@ -367,6 +367,56 @@
 ...
 SystemError: too many statically nested blocks
 
+This tests assignment-context; there was a bug in Python 2.5 where compiling
+a complex 'if' (one with 'elif') would fail to notice an invalid suite,
+leading to spurious errors.
+
+ >>> if 1:
+ ... x() = 1
+ ... elif 1:
+ ... pass
+ Traceback (most recent call last):
+ ... 
+ SyntaxError: can't assign to function call (<doctest test.test_syntax[44]>, line 2)
+
+ >>> if 1:
+ ... pass
+ ... elif 1:
+ ... x() = 1
+ Traceback (most recent call last):
+ ... 
+ SyntaxError: can't assign to function call (<doctest test.test_syntax[45]>, line 4)
+
+ >>> if 1:
+ ... x() = 1
+ ... elif 1:
+ ... pass
+ ... else:
+ ... pass
+ Traceback (most recent call last):
+ ... 
+ SyntaxError: can't assign to function call (<doctest test.test_syntax[46]>, line 2)
+
+ >>> if 1:
+ ... pass
+ ... elif 1:
+ ... x() = 1
+ ... else:
+ ... pass
+ Traceback (most recent call last):
+ ... 
+ SyntaxError: can't assign to function call (<doctest test.test_syntax[47]>, line 4)
+
+ >>> if 1:
+ ... pass
+ ... elif 1:
+ ... pass
+ ... else:
+ ... x() = 1
+ Traceback (most recent call last):
+ ... 
+ SyntaxError: can't assign to function call (<doctest test.test_syntax[48]>, line 6)
+
 """
 
 import re
Modified: python/trunk/Misc/NEWS
==============================================================================
--- python/trunk/Misc/NEWS	(original)
+++ python/trunk/Misc/NEWS	Fri Mar 16 05:11:30 2007
@@ -12,6 +12,9 @@
 Core and builtins
 -----------------
 
+- Patch #1642547: Fix an error/crash when encountering syntax errors in
+ complex if statements.
+
 - Patch #1462488: Python no longer segfaults when ``object.__reduce_ex__()``
 is called with an object that is faking its type.
 
Modified: python/trunk/Python/ast.c
==============================================================================
--- python/trunk/Python/ast.c	(original)
+++ python/trunk/Python/ast.c	Fri Mar 16 05:11:30 2007
@@ -1032,6 +1032,7 @@
 	if (NCH(ch) == 5) {
 	 int j, n_ifs;
 	 asdl_seq *ifs;
+	 expr_ty list_for_expr;
 
 	 ch = CHILD(ch, 4);
 	 n_ifs = count_list_ifs(ch);
@@ -1046,8 +1047,12 @@
 	 REQ(ch, list_iter);
 		 ch = CHILD(ch, 0);
 		 REQ(ch, list_if);
+ 
+		list_for_expr = ast_for_expr(c, CHILD(ch, 1));
+		if (!list_for_expr)
+			return NULL;
 
-		asdl_seq_SET(ifs, j, ast_for_expr(c, CHILD(ch, 1)));
+		asdl_seq_SET(ifs, j, list_for_expr);
 		if (NCH(ch) == 3)
 		 ch = CHILD(ch, 2);
 		}
@@ -1991,7 +1996,8 @@
 			 "assignment");
 		return NULL;
 	}
-	set_context(expr1, Store, ch);
+	if(!set_context(expr1, Store, ch))
+		return NULL;
 
 	ch = CHILD(n, 2);
 	if (TYPE(ch) == testlist)
@@ -2584,6 +2590,8 @@
 }
 else if (s[2] == 'i') {
 	int i, n_elif, has_else = 0;
+	expr_ty expression;
+	asdl_seq *suite_seq;
 	asdl_seq *orelse = NULL;
 	n_elif = NCH(n) - 4;
 	/* must reference the child n_elif+1 since 'else' token is third,
@@ -2596,8 +2604,7 @@
 	n_elif /= 4;
 
 	if (has_else) {
-	 expr_ty expression;
-	 asdl_seq *seq1, *seq2;
+	 asdl_seq *suite_seq2;
 
 	 orelse = asdl_seq_new(1, c->c_arena);
 	 if (!orelse)
@@ -2605,14 +2612,14 @@
 	 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
 	 if (!expression)
 		return NULL;
-	 seq1 = ast_for_suite(c, CHILD(n, NCH(n) - 4));
-	 if (!seq1)
+	 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
+	 if (!suite_seq)
 		return NULL;
-	 seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
-	 if (!seq2)
+	 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
+	 if (!suite_seq2)
 		return NULL;
 
-	 asdl_seq_SET(orelse, 0, If(expression, seq1, seq2, 
+	 asdl_seq_SET(orelse, 0, If(expression, suite_seq, suite_seq2, 
 				 LINENO(CHILD(n, NCH(n) - 6)), CHILD(n, NCH(n) - 6)->n_col_offset,
 				 c->c_arena));
 	 /* the just-created orelse handled the last elif */
@@ -2621,8 +2628,6 @@
 
 	for (i = 0; i < n_elif; i++) {
 	 int off = 5 + (n_elif - i - 1) * 4;
-	 expr_ty expression;
-	 asdl_seq *suite_seq;
 	 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
 	 if (!newobj)
 		return NULL;
@@ -2638,9 +2643,14 @@
 			 LINENO(CHILD(n, off)), CHILD(n, off)->n_col_offset, c->c_arena));
 	 orelse = newobj;
 	}
-	return If(ast_for_expr(c, CHILD(n, 1)),
-		 ast_for_suite(c, CHILD(n, 3)),
-		 orelse, LINENO(n), n->n_col_offset, c->c_arena);
+	expression = ast_for_expr(c, CHILD(n, 1));
+	if (!expression)
+		return NULL;
+	suite_seq = ast_for_suite(c, CHILD(n, 3));
+	if (!suite_seq)
+		return NULL;
+	return If(expression, suite_seq, orelse,
+ LINENO(n), n->n_col_offset, c->c_arena);
 }
 
 PyErr_Format(PyExc_SystemError,
@@ -2876,6 +2886,8 @@
 
 assert(TYPE(n) == with_stmt);
 context_expr = ast_for_expr(c, CHILD(n, 1));
+ if (!context_expr)
+ return NULL;
 if (TYPE(CHILD(n, 2)) == with_var) {
 	optional_vars = ast_for_with_var(c, CHILD(n, 2));
 


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /