diff --git a/test/bytecode_3.5/03_while-if-break.pyc b/test/bytecode_3.5/03_while-if-break.pyc new file mode 100644 index 00000000..f7a2f48d Binary files /dev/null and b/test/bytecode_3.5/03_while-if-break.pyc differ diff --git a/test/bytecode_3.6/03_while-if-break.pyc b/test/bytecode_3.6/03_while-if-break.pyc new file mode 100644 index 00000000..37c94152 Binary files /dev/null and b/test/bytecode_3.6/03_while-if-break.pyc differ diff --git a/test/simple_source/bug35/03_while-if-break.py b/test/simple_source/bug35/03_while-if-break.py new file mode 100644 index 00000000..d520ca7d --- /dev/null +++ b/test/simple_source/bug35/03_while-if-break.py @@ -0,0 +1,7 @@ +# Python 3.5 and 3.6 break inside a +# while True and if / break +def display_date(loop): + while True: + if loop.time(): + break + x = 5 diff --git a/uncompyle6/parsers/parse35.py b/uncompyle6/parsers/parse35.py index de32c96b..ba5f05ee 100644 --- a/uncompyle6/parsers/parse35.py +++ b/uncompyle6/parsers/parse35.py @@ -109,6 +109,8 @@ class Python35Parser(Python34Parser): # differently than 3.3, 3.4 yield_from ::= expr GET_YIELD_FROM_ITER LOAD_CONST YIELD_FROM + + _ifstmts_jump ::= c_stmts_opt COME_FROM """ def add_custom_rules(self, tokens, customize): diff --git a/uncompyle6/scanner.py b/uncompyle6/scanner.py index 2bd91528..40c61c29 100755 --- a/uncompyle6/scanner.py +++ b/uncompyle6/scanner.py @@ -226,7 +226,7 @@ class Scanner(object): for given opcode . """ if op < self.opc.HAVE_ARGUMENT: - return 1 + return 2 if self.version >= 3.6 else 1 else: return 2 if self.version >= 3.6 else 3 diff --git a/uncompyle6/scanners/scanner3.py b/uncompyle6/scanners/scanner3.py index 6095b1c9..429a57d1 100644 --- a/uncompyle6/scanners/scanner3.py +++ b/uncompyle6/scanners/scanner3.py @@ -851,7 +851,8 @@ class Scanner3(Scanner): 'start': start, 'end': pre_rtarget}) self.not_continue.add(pre_rtarget) - elif code[pre_rtarget] == self.opc.RETURN_VALUE: + elif code[pre_rtarget] in (self.opc.RETURN_VALUE, + self.opc.BREAK_LOOP): self.structs.append({'type': 'if-then', 'start': start, 'end': rtarget}) @@ -881,7 +882,12 @@ class Scanner3(Scanner): return pass pass - self.return_end_ifs.add(pre_rtarget) + if code[pre_rtarget] == self.opc.RETURN_VALUE: + self.return_end_ifs.add(pre_rtarget) + else: + self.fixed_jumps[offset] = rtarget + self.not_continue.add(pre_rtarget) + elif op == self.opc.SETUP_EXCEPT: target = self.get_target(offset)