You've already forked python-uncompyle6
mirror of
https://github.com/rocky/python-uncompyle6.git
synced 2025-08-03 00:45:53 +08:00
More 2.6, 2.7 control flow
Todo more COME_FROMs but now need to check targets better. In some cases we're relying on grammar ambiguity to work out right and in 2.7 it doesn't
This commit is contained in:
@@ -617,7 +617,7 @@ class Scanner2(scan.Scanner):
|
||||
'start': jump_back+3,
|
||||
'end': end})
|
||||
elif op == self.opc.SETUP_EXCEPT:
|
||||
start = offset+3
|
||||
start = offset + self.op_size(op)
|
||||
target = self.get_target(offset, op)
|
||||
end = self.restrict_to_parent(target, parent)
|
||||
if target != end:
|
||||
@@ -632,10 +632,17 @@ class Scanner2(scan.Scanner):
|
||||
|
||||
|
||||
end_finally_offset = end
|
||||
setup_except_nest = 0
|
||||
while end_finally_offset < len(self.code):
|
||||
if self.code[end_finally_offset] == self.opc.END_FINALLY:
|
||||
break
|
||||
if setup_except_nest == 0:
|
||||
break
|
||||
else:
|
||||
setup_except_nest -= 1
|
||||
elif self.code[end_finally_offset] == self.opc.SETUP_EXCEPT:
|
||||
setup_except_nest += 1
|
||||
end_finally_offset += self.op_size(code[end_finally_offset])
|
||||
pass
|
||||
|
||||
# Add the except blocks
|
||||
i = end
|
||||
|
@@ -225,6 +225,7 @@ TABLE_DIRECT = {
|
||||
'ifelsestmtr': ( '%|if %c:\n%+%c%-%|else:\n%+%c%-', 0, 1, 2 ),
|
||||
'ifelsestmtr2': ( '%|if %c:\n%+%c%-%|else:\n%+%c%-\n\n', 0, 1, 3 ), # has COME_FROM
|
||||
'elifelsestmtr': ( '%|elif %c:\n%+%c%-%|else:\n%+%c%-\n\n', 0, 1, 2 ),
|
||||
'elifelsestmtr2': ( '%|elif %c:\n%+%c%-%|else:\n%+%c%-\n\n', 0, 1, 3 ), # has COME_FROM
|
||||
|
||||
'whileTruestmt': ( '%|while True:\n%+%c%-\n\n', 1 ),
|
||||
'whilestmt': ( '%|while %c:\n%+%c%-\n\n', 1, 2 ),
|
||||
|
@@ -774,10 +774,16 @@ class SourceWalker(GenericASTTraversal, object):
|
||||
n_ifelsestmtr2 = n_ifelsestmtr
|
||||
|
||||
def n_elifelsestmtr(self, node):
|
||||
if len(node[2]) != 2:
|
||||
if node[2] == 'COME_FROM':
|
||||
return_stmts_node = node[3]
|
||||
node.type = 'elifelsestmtr2'
|
||||
else:
|
||||
return_stmts_node = node[2]
|
||||
|
||||
if len(return_stmts_node) != 2:
|
||||
self.default(node)
|
||||
|
||||
for n in node[2][0]:
|
||||
for n in return_stmts_node[0]:
|
||||
if not (n[0] == 'ifstmt' and n[0][1][0] == 'return_if_stmts'):
|
||||
self.default(node)
|
||||
return
|
||||
@@ -789,12 +795,12 @@ class SourceWalker(GenericASTTraversal, object):
|
||||
self.preorder(node[1])
|
||||
self.indentLess()
|
||||
|
||||
for n in node[2][0]:
|
||||
for n in return_stmts_node[0]:
|
||||
n[0].type = 'elifstmt'
|
||||
self.preorder(n)
|
||||
self.println(self.indent, 'else:')
|
||||
self.indentMore()
|
||||
self.preorder(node[2][1])
|
||||
self.preorder(return_stmts_node[1])
|
||||
self.indentLess()
|
||||
self.prune()
|
||||
|
||||
|
Reference in New Issue
Block a user