SF #1377897, Bus error in ast

If a line had multiple semi-colons and ended with a semi-colon, we would
loop too many times and access a NULL node.  Exit the loop early if
there are no more children.
This commit is contained in:
Neal Norwitz 2005-12-11 20:12:40 +00:00
parent 8ad64aaacc
commit f8d403dd97
2 changed files with 9 additions and 0 deletions

View File

@ -276,6 +276,10 @@ check_syntax("lambda x: x = 2")
### simple_stmt: small_stmt (';' small_stmt)* [';'] ### simple_stmt: small_stmt (';' small_stmt)* [';']
print 'simple_stmt' print 'simple_stmt'
x = 1; pass; del x x = 1; pass; del x
def foo():
# verify statments that end with semi-colons
x = 1; pass; del x;
foo()
### small_stmt: expr_stmt | print_stmt | pass_stmt | del_stmt | flow_stmt | import_stmt | global_stmt | access_stmt | exec_stmt ### small_stmt: expr_stmt | print_stmt | pass_stmt | del_stmt | flow_stmt | import_stmt | global_stmt | access_stmt | exec_stmt
# Tested below # Tested below

View File

@ -2562,6 +2562,11 @@ ast_for_suite(struct compiling *c, const node *n)
ch = CHILD(ch, 0); ch = CHILD(ch, 0);
REQ(ch, simple_stmt); REQ(ch, simple_stmt);
for (j = 0; j < NCH(ch); j += 2) { for (j = 0; j < NCH(ch); j += 2) {
/* statement terminates with a semi-colon ';' */
if (NCH(CHILD(ch, j)) == 0) {
assert((j + 1) == NCH(ch));
break;
}
s = ast_for_stmt(c, CHILD(ch, j)); s = ast_for_stmt(c, CHILD(ch, j));
if (!s) if (!s)
goto error; goto error;