You've already forked python-uncompyle6
mirror of
https://github.com/rocky/python-uncompyle6.git
synced 2025-08-04 01:09:52 +08:00
Beter 2.7 end_if and COME_FROM determination
Fixes #149 ... Add more tests too
This commit is contained in:
BIN
test/bytecode_2.7/03_if_vs_and.pyc
Normal file
BIN
test/bytecode_2.7/03_if_vs_and.pyc
Normal file
Binary file not shown.
@@ -130,6 +130,10 @@ class Python27Parser(Python2Parser):
|
|||||||
whileelsestmt ::= SETUP_LOOP testexpr l_stmts_opt JUMP_BACK POP_BLOCK
|
whileelsestmt ::= SETUP_LOOP testexpr l_stmts_opt JUMP_BACK POP_BLOCK
|
||||||
else_suitel COME_FROM
|
else_suitel COME_FROM
|
||||||
|
|
||||||
|
return_stmts ::= _stmts return_stmt
|
||||||
|
return_stmt ::= return
|
||||||
|
|
||||||
|
ifstmt ::= testexpr return_stmts COME_FROM
|
||||||
ifstmt ::= testexpr return_if_stmts COME_FROM
|
ifstmt ::= testexpr return_if_stmts COME_FROM
|
||||||
ifelsestmt ::= testexpr c_stmts_opt JUMP_FORWARD else_suite COME_FROM
|
ifelsestmt ::= testexpr c_stmts_opt JUMP_FORWARD else_suite COME_FROM
|
||||||
ifelsestmtc ::= testexpr c_stmts_opt JUMP_ABSOLUTE else_suitec
|
ifelsestmtc ::= testexpr c_stmts_opt JUMP_ABSOLUTE else_suitec
|
||||||
|
@@ -958,17 +958,32 @@ class Scanner2(Scanner):
|
|||||||
'end': end_offset})
|
'end': end_offset})
|
||||||
elif code_pre_rtarget == self.opc.RETURN_VALUE:
|
elif code_pre_rtarget == self.opc.RETURN_VALUE:
|
||||||
if self.version == 2.7 or pre_rtarget not in self.ignore_if:
|
if self.version == 2.7 or pre_rtarget not in self.ignore_if:
|
||||||
# 10 is exception-match. If there is an exception match in the
|
# Below, 10 is exception-match. If there is an exception
|
||||||
# compare, then this is an exception clause not an if-then clause
|
# match in the compare, then this is an exception
|
||||||
|
# clause not an if-then clause
|
||||||
if (self.code[self.prev[offset]] != self.opc.COMPARE_OP or
|
if (self.code[self.prev[offset]] != self.opc.COMPARE_OP or
|
||||||
self.code[self.prev[offset]+1] != 10):
|
self.code[self.prev[offset]+1] != 10):
|
||||||
self.structs.append({'type': 'if-then',
|
self.structs.append({'type': 'if-then',
|
||||||
'start': start,
|
'start': start,
|
||||||
'end': rtarget})
|
'end': rtarget})
|
||||||
self.thens[start] = rtarget
|
self.thens[start] = rtarget
|
||||||
if self.version == 2.7 or code[pre_rtarget+1] != self.opc.JUMP_FORWARD:
|
if (self.version == 2.7 or
|
||||||
|
code[pre_rtarget+1] != self.opc.JUMP_FORWARD):
|
||||||
|
# The below is a big hack until we get
|
||||||
|
# better control flow analysis: disallow
|
||||||
|
# END_IF if the instruction before the
|
||||||
|
# END_IF instruction happens to be a jump
|
||||||
|
# target. In this case, probably what's
|
||||||
|
# gone on is that we messed up on the
|
||||||
|
# END_IF location and it should be the
|
||||||
|
# instruction before.
|
||||||
self.fixed_jumps[offset] = rtarget
|
self.fixed_jumps[offset] = rtarget
|
||||||
self.return_end_ifs.add(pre_rtarget)
|
if (self.version == 2.7 and
|
||||||
|
self.insts[self.offset2inst_index[pre[pre_rtarget]]].is_jump_target):
|
||||||
|
self.return_end_ifs.add(pre[pre_rtarget])
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
self.return_end_ifs.add(pre_rtarget)
|
||||||
pass
|
pass
|
||||||
pass
|
pass
|
||||||
pass
|
pass
|
||||||
|
Reference in New Issue
Block a user