You've already forked python-uncompyle6
mirror of
https://github.com/rocky/python-uncompyle6.git
synced 2025-08-04 01:09:52 +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
|
pt_bp ::= POP_TOP POP_BLOCK
|
||||||
|
|
||||||
assert ::= assert_expr jmp_true LOAD_ASSERT RAISE_VARARGS_1 COME_FROM POP_TOP
|
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
|
return_if_lambda ::= RETURN_END_IF_LAMBDA COME_FROM POP_TOP
|
||||||
compare_chained2 ::= expr COMPARE_OP RETURN_END_IF_LAMBDA
|
compare_chained2 ::= expr COMPARE_OP RETURN_END_IF_LAMBDA
|
||||||
|
|
||||||
@@ -212,7 +215,9 @@ class Python30Parser(Python31Parser):
|
|||||||
COME_FROM_LOOP
|
COME_FROM_LOOP
|
||||||
whilestmt ::= SETUP_LOOP testexpr returns
|
whilestmt ::= SETUP_LOOP testexpr returns
|
||||||
POP_BLOCK COME_FROM_LOOP
|
POP_BLOCK COME_FROM_LOOP
|
||||||
|
|
||||||
assert ::= assert_expr jmp_true LOAD_ASSERT RAISE_VARARGS_1
|
assert ::= assert_expr jmp_true LOAD_ASSERT RAISE_VARARGS_1
|
||||||
|
|
||||||
return_if_lambda ::= RETURN_END_IF_LAMBDA
|
return_if_lambda ::= RETURN_END_IF_LAMBDA
|
||||||
except_suite ::= c_stmts POP_EXCEPT jump_except
|
except_suite ::= c_stmts POP_EXCEPT jump_except
|
||||||
whileelsestmt ::= SETUP_LOOP testexpr l_stmts JUMP_BACK POP_BLOCK
|
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
|
# RAISE_VARARGS then we have a "raise" statement
|
||||||
# else we have an "assert" statement.
|
# else we have an "assert" statement.
|
||||||
if self.version == 3.0:
|
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
|
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:
|
else:
|
||||||
assert_can_follow = (
|
assert_can_follow = (
|
||||||
inst.opname in ("POP_JUMP_IF_TRUE", "POP_JUMP_IF_FALSE")
|
inst.opname in ("POP_JUMP_IF_TRUE", "POP_JUMP_IF_FALSE")
|
||||||
and i + 1 < n
|
and i + 1 < n
|
||||||
)
|
)
|
||||||
|
jump_if_inst = inst
|
||||||
if assert_can_follow:
|
if assert_can_follow:
|
||||||
next_inst = self.insts[i + 1]
|
next_inst = self.insts[i + 1]
|
||||||
if (
|
if (
|
||||||
next_inst.opname == "LOAD_GLOBAL"
|
next_inst.opname == "LOAD_GLOBAL"
|
||||||
and next_inst.argval == "AssertionError"
|
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]
|
raise_inst = self.insts[raise_idx]
|
||||||
if raise_inst.opname.startswith("RAISE_VARARGS"):
|
if raise_inst.opname.startswith("RAISE_VARARGS"):
|
||||||
self.load_asserts.add(next_inst.offset)
|
self.load_asserts.add(next_inst.offset)
|
||||||
|
Reference in New Issue
Block a user