From 047e27c96629ddd0212535b46a7d72a1de4c3fdb Mon Sep 17 00:00:00 2001 From: rocky Date: Sat, 16 Nov 2019 09:10:14 -0500 Subject: [PATCH] 3.0 assert2... Not like other 3.x due to the lack of POP_JUMP_IF --- uncompyle6/parsers/parse30.py | 5 +++++ uncompyle6/scanners/scanner3.py | 14 +++++++++++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/uncompyle6/parsers/parse30.py b/uncompyle6/parsers/parse30.py index a6e13c00..7baef5a3 100644 --- a/uncompyle6/parsers/parse30.py +++ b/uncompyle6/parsers/parse30.py @@ -15,6 +15,9 @@ class Python30Parser(Python31Parser): pt_bp ::= POP_TOP POP_BLOCK assert ::= assert_expr jmp_true LOAD_ASSERT RAISE_VARARGS_1 COME_FROM POP_TOP + assert2 ::= assert_expr jmp_true LOAD_ASSERT expr CALL_FUNCTION_1 RAISE_VARARGS_1 + come_froms + return_if_lambda ::= RETURN_END_IF_LAMBDA COME_FROM POP_TOP compare_chained2 ::= expr COMPARE_OP RETURN_END_IF_LAMBDA @@ -212,7 +215,9 @@ class Python30Parser(Python31Parser): 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 except_suite ::= c_stmts POP_EXCEPT jump_except whileelsestmt ::= SETUP_LOOP testexpr l_stmts JUMP_BACK POP_BLOCK diff --git a/uncompyle6/scanners/scanner3.py b/uncompyle6/scanners/scanner3.py index 6a025486..661a5f17 100644 --- a/uncompyle6/scanners/scanner3.py +++ b/uncompyle6/scanners/scanner3.py @@ -257,21 +257,29 @@ class Scanner3(Scanner): # RAISE_VARARGS then we have a "raise" statement # else we have an "assert" statement. if self.version == 3.0: - # There is a an implied JUMP_IF_TRUE that we are not testing for (yet?) here + # Like 2.6, 3.0 doesn't have POP_JUMP_IF... so we have + # to go through more machinations assert_can_follow = inst.opname == "POP_TOP" and i + 1 < n + if assert_can_follow: + prev_inst = self.insts[i - 1] + assert_can_follow = ( + prev_inst.opname in ("JUMP_IF_TRUE", "JUMP_IF_FALSE") + and i + 1 < n ) + jump_if_inst = prev_inst else: assert_can_follow = ( inst.opname in ("POP_JUMP_IF_TRUE", "POP_JUMP_IF_FALSE") and i + 1 < n ) + jump_if_inst = inst if assert_can_follow: next_inst = self.insts[i + 1] if ( next_inst.opname == "LOAD_GLOBAL" and next_inst.argval == "AssertionError" - and inst.argval + and jump_if_inst.argval ): - raise_idx = self.offset2inst_index[self.prev_op[inst.argval]] + raise_idx = self.offset2inst_index[self.prev_op[jump_if_inst.argval]] raise_inst = self.insts[raise_idx] if raise_inst.opname.startswith("RAISE_VARARGS"): self.load_asserts.add(next_inst.offset)