From a7ceedb62caa40be62c4b05963497c0180c4ecd9 Mon Sep 17 00:00:00 2001 From: rocky Date: Sat, 15 Dec 2018 09:17:54 -0500 Subject: [PATCH] Python 3.6+ control flow --- test/bytecode_3.6/03_if_try.pyc | Bin 0 -> 276 bytes uncompyle6/parsers/parse36.py | 5 +++++ uncompyle6/scanners/scanner3.py | 7 +++---- 3 files changed, 8 insertions(+), 4 deletions(-) create mode 100644 test/bytecode_3.6/03_if_try.pyc diff --git a/test/bytecode_3.6/03_if_try.pyc b/test/bytecode_3.6/03_if_try.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1a3ef6fb8c8e7799cc7e68e8e0fe3a6f89795fa7 GIT binary patch literal 276 zcmXr!<>i{sBO1fQ$iVQJ0SPbx*$zNl%mXA+7*ZHp7@`K-_L=8g?V>VNfL?ufNLofp)7}fywqyTxEjD9PDnxoirQ%o}wi!-7)QW8rN!7TQo z)Z)^dlHwwuBN)KMFNNaF+=86c_~QK1qU2Qlq|$U_GkpW&_{_BUlA=nzg34P$CPo%UHpU{5n4czuMwky_f&6%j!zMRBr8Fni J4y+rb830-;HHQEI literal 0 HcmV?d00001 diff --git a/uncompyle6/parsers/parse36.py b/uncompyle6/parsers/parse36.py index f34002d2..6b85e009 100644 --- a/uncompyle6/parsers/parse36.py +++ b/uncompyle6/parsers/parse36.py @@ -42,6 +42,11 @@ class Python36Parser(Python35Parser): whilestmt ::= SETUP_LOOP testexpr l_stmts_opt JUMP_BACK come_froms POP_BLOCK COME_FROM_LOOP + # 3.6 due to jump optimization, we sometimes add RETURN_END_IF where + # RETURN_VALUE is meant. Specifcally this can happen in + # ifelsestmt -> ...else_suite _. suite_stmts... (last) stmt + return ::= ret_expr RETURN_END_IF + # A COME_FROM is dropped off because of JUMP-to-JUMP optimization and ::= expr jmp_false expr and ::= expr jmp_false expr jmp_false diff --git a/uncompyle6/scanners/scanner3.py b/uncompyle6/scanners/scanner3.py index ce734fa0..cff66037 100644 --- a/uncompyle6/scanners/scanner3.py +++ b/uncompyle6/scanners/scanner3.py @@ -957,8 +957,6 @@ class Scanner3(Scanner): elif op == self.opc.POP_EXCEPT: next_offset = xdis.next_offset(op, self.opc, offset) target = self.get_target(next_offset) - if target is None: - from trepan.api import debug; debug() if target > next_offset: next_op = code[next_offset] if (self.opc.JUMP_ABSOLUTE == next_op and @@ -986,8 +984,9 @@ class Scanner3(Scanner): # In RETURN_VALUE, JUMP_ABSOLUTE, RETURN_VALUE is never RETURN_END_IF if op == self.opc.RETURN_VALUE: next_offset = xdis.next_offset(op, self.opc, offset) - if (next_offset < len(code) and code[next_offset] == self.opc.JUMP_ABSOLUTE and - offset in self.return_end_ifs): + if ( next_offset < len(code) and + (code[next_offset] == self.opc.JUMP_ABSOLUTE and + offset in self.return_end_ifs) ): self.return_end_ifs.remove(offset) pass pass