From 3f40c165877333dce1d65737c5be69461d7994f0 Mon Sep 17 00:00:00 2001 From: rocky Date: Sun, 8 Jan 2017 15:54:49 -0500 Subject: [PATCH] Fix 3.5, 3.6 while true if/break bug --- test/bytecode_3.5/03_while-if-break.pyc | Bin 0 -> 271 bytes test/bytecode_3.6/03_while-if-break.pyc | Bin 0 -> 261 bytes test/simple_source/bug35/03_while-if-break.py | 7 +++++++ uncompyle6/parsers/parse35.py | 2 ++ uncompyle6/scanner.py | 2 +- uncompyle6/scanners/scanner3.py | 10 ++++++++-- 6 files changed, 18 insertions(+), 3 deletions(-) create mode 100644 test/bytecode_3.5/03_while-if-break.pyc create mode 100644 test/bytecode_3.6/03_while-if-break.pyc create mode 100644 test/simple_source/bug35/03_while-if-break.py 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 0000000000000000000000000000000000000000..f7a2f48d0bf801bdd063bcd0410dadafc0f62d62 GIT binary patch literal 271 zcmWgR<>hi-Rur*-fq~&M5W@izkmUfx#R5Pg1&A0KS{N9jfD9&vU`^&^MxZbVfYgE5 z&Olr&2P7)Q8EP09vKSbe85oKL7y^JAYZ(~|nHj=?rUYv;`MqQXs?ubPVkybYP1R(I zV#&$RFSx~6v67*P87T8hqc}6SASX4xIKQ+gIaNQYG~L)#-@rJ&JR>tFRW~zDH>oH! zFhi-Rur*-fq~&M5W@izkmUfx#XLYFg&~Epg&~R|g(;XplR23YCPBmXgfeR86KRmYn?jf?JFg zD;bKIfik}|iZgQya#G`q^Gl18Q}vTd(~V8_4UFTr3!mZXC87IOdz21X`E4j?W9+2f}Pp}|HY5iCHtTO2mI`6;D2sdiw!Agus< CXfr_o literal 0 HcmV?d00001 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)