You've already forked python-uncompyle6
mirror of
https://github.com/rocky/python-uncompyle6.git
synced 2025-08-02 16:44:46 +08:00
3.0 assert2...
Not like other 3.x due to the lack of POP_JUMP_IF
This commit is contained in:
@@ -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
|
||||
|
@@ -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)
|
||||
|
Reference in New Issue
Block a user