diff --git a/test/bytecode_2.7/05_while_if_continue.pyc b/test/bytecode_2.7/05_while_if_continue.pyc new file mode 100644 index 00000000..6eaf8ffb Binary files /dev/null and b/test/bytecode_2.7/05_while_if_continue.pyc differ diff --git a/test/simple_source/bug27+/05_while_if_continue.py b/test/simple_source/bug27+/05_while_if_continue.py new file mode 100644 index 00000000..fa64ffdf --- /dev/null +++ b/test/simple_source/bug27+/05_while_if_continue.py @@ -0,0 +1,11 @@ +# Issue 151 for Python 2.7 +# Bug was two-fold. Not having a rile for a while loop with an ending return statement +# and allowing iflastsmtl to have an optional c_stmt which allowed the "if" to get +# comined into the "while". A separate analysis for control flow should make this +# simpiler. +def func(a, b, c): + while a: + if b: + continue + return False + return True diff --git a/uncompyle6/parser.py b/uncompyle6/parser.py index a7f70a45..7ac69018 100644 --- a/uncompyle6/parser.py +++ b/uncompyle6/parser.py @@ -323,7 +323,7 @@ class PythonParser(GenericASTBuilder): stmt ::= return return ::= ret_expr RETURN_VALUE - # returns are a sequence of statements that ends in a RETURN statement. + # "returns" nonterminal is a sequence of statements that ends in a RETURN statement. # In later Python versions with jump optimization, this can cause JUMPs # that would normally appear to be omitted. diff --git a/uncompyle6/parsers/parse27.py b/uncompyle6/parsers/parse27.py index 37abf587..257ac5ed 100644 --- a/uncompyle6/parsers/parse27.py +++ b/uncompyle6/parsers/parse27.py @@ -64,9 +64,9 @@ class Python27Parser(Python2Parser): def p_jump27(self, args): """ - iflaststmtl ::= testexpr c_stmts_opt + iflaststmtl ::= testexpr c_stmts - _ifstmts_jump ::= c_stmts_opt JUMP_FORWARD come_froms + _ifstmts_jump ::= c_stmts_opt JUMP_FORWARD come_froms bp_come_from ::= POP_BLOCK COME_FROM # FIXME: Common with 3.0+ @@ -119,6 +119,8 @@ class Python27Parser(Python2Parser): POP_BLOCK LOAD_CONST COME_FROM_WITH WITH_CLEANUP END_FINALLY + whilestmt ::= SETUP_LOOP testexpr returns POP_BLOCK COME_FROM + while1stmt ::= SETUP_LOOP returns bp_come_from while1stmt ::= SETUP_LOOP l_stmts_opt JUMP_BACK POP_BLOCK COME_FROM whilestmt ::= SETUP_LOOP testexpr l_stmts_opt JUMP_BACK POP_BLOCK _come_froms