Another Python 3.0 (while) parse bug

This commit is contained in:
rocky
2018-06-23 05:48:14 -04:00
parent fa5da2b1ef
commit fb31fe1f35
3 changed files with 12 additions and 1 deletions

View File

@@ -50,7 +50,7 @@ def test_grammar():
expect_right_recursive.add((('l_stmts',
('lastl_stmt', 'come_froms', 'l_stmts'))))
pass
elif PYTHON_VERSION < 3.3:
elif 3.0 < PYTHON_VERSION < 3.3:
expect_right_recursive.add((('l_stmts',
('lastl_stmt', 'COME_FROM', 'l_stmts'))))
pass

View File

@@ -85,6 +85,8 @@ class Python30Parser(Python31Parser):
and ::= expr JUMP_IF_FALSE POP_TOP expr COME_FROM
whilestmt ::= SETUP_LOOP testexpr l_stmts_opt
JUMP_BACK POP_TOP POP_BLOCK COME_FROM_LOOP
whilestmt ::= SETUP_LOOP testexpr returns
POP_TOP POP_BLOCK COME_FROM_LOOP
"""
def customize_grammar_rules(self, tokens, customize):
@@ -98,6 +100,8 @@ class Python30Parser(Python31Parser):
jump_absolute_else ::= JUMP_ABSOLUTE ELSE
whilestmt ::= SETUP_LOOP testexpr l_stmts_opt COME_FROM JUMP_BACK POP_BLOCK
COME_FROM_LOOP
whilestmt ::= SETUP_LOOP testexpr returns
POP_BLOCK COME_FROM_LOOP
assert ::= assert_expr jmp_true LOAD_ASSERT RAISE_VARARGS_1
return_if_lambda ::= RETURN_END_IF_LAMBDA
compare_chained1 ::= expr DUP_TOP ROT_THREE COMPARE_OP JUMP_IF_FALSE_OR_POP compare_chained2 COME_FROM

View File

@@ -319,6 +319,13 @@ class Scanner30(Scanner3):
pass
pass
if code[pre_rtarget] == self.opc.RETURN_VALUE:
if self.version == 3.0:
next_op = rtarget
if code[next_op] == self.opc.POP_TOP:
next_op = rtarget
next_op += instruction_size(self.code[next_op], self.opc)
if code[next_op] == self.opc.POP_BLOCK:
return
self.return_end_ifs.add(pre_rtarget)
else:
self.fixed_jumps[offset] = rtarget