X Tutup
Skip to content

Commit 1cb2cd7

Browse files
committed
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
1 parent 9ec312b commit 1cb2cd7

File tree

3 files changed

+20
-6
lines changed

3 files changed

+20
-6
lines changed

uncompyle6/scanners/scanner2.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -617,7 +617,7 @@ def detect_control_flow(self, offset, op):
617617
'start': jump_back+3,
618618
'end': end})
619619
elif op == self.opc.SETUP_EXCEPT:
620-
start = offset+3
620+
start = offset + self.op_size(op)
621621
target = self.get_target(offset, op)
622622
end = self.restrict_to_parent(target, parent)
623623
if target != end:
@@ -632,10 +632,17 @@ def detect_control_flow(self, offset, op):
632632

633633

634634
end_finally_offset = end
635+
setup_except_nest = 0
635636
while end_finally_offset < len(self.code):
636637
if self.code[end_finally_offset] == self.opc.END_FINALLY:
637-
break
638+
if setup_except_nest == 0:
639+
break
640+
else:
641+
setup_except_nest -= 1
642+
elif self.code[end_finally_offset] == self.opc.SETUP_EXCEPT:
643+
setup_except_nest += 1
638644
end_finally_offset += self.op_size(code[end_finally_offset])
645+
pass
639646

640647
# Add the except blocks
641648
i = end

uncompyle6/semantics/consts.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,7 @@
225225
'ifelsestmtr': ( '%|if %c:\n%+%c%-%|else:\n%+%c%-', 0, 1, 2 ),
226226
'ifelsestmtr2': ( '%|if %c:\n%+%c%-%|else:\n%+%c%-\n\n', 0, 1, 3 ), # has COME_FROM
227227
'elifelsestmtr': ( '%|elif %c:\n%+%c%-%|else:\n%+%c%-\n\n', 0, 1, 2 ),
228+
'elifelsestmtr2': ( '%|elif %c:\n%+%c%-%|else:\n%+%c%-\n\n', 0, 1, 3 ), # has COME_FROM
228229

229230
'whileTruestmt': ( '%|while True:\n%+%c%-\n\n', 1 ),
230231
'whilestmt': ( '%|while %c:\n%+%c%-\n\n', 1, 2 ),

uncompyle6/semantics/pysource.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -774,10 +774,16 @@ def n_ifelsestmtr(self, node):
774774
n_ifelsestmtr2 = n_ifelsestmtr
775775

776776
def n_elifelsestmtr(self, node):
777-
if len(node[2]) != 2:
777+
if node[2] == 'COME_FROM':
778+
return_stmts_node = node[3]
779+
node.type = 'elifelsestmtr2'
780+
else:
781+
return_stmts_node = node[2]
782+
783+
if len(return_stmts_node) != 2:
778784
self.default(node)
779785

780-
for n in node[2][0]:
786+
for n in return_stmts_node[0]:
781787
if not (n[0] == 'ifstmt' and n[0][1][0] == 'return_if_stmts'):
782788
self.default(node)
783789
return
@@ -789,12 +795,12 @@ def n_elifelsestmtr(self, node):
789795
self.preorder(node[1])
790796
self.indentLess()
791797

792-
for n in node[2][0]:
798+
for n in return_stmts_node[0]:
793799
n[0].type = 'elifstmt'
794800
self.preorder(n)
795801
self.println(self.indent, 'else:')
796802
self.indentMore()
797-
self.preorder(node[2][1])
803+
self.preorder(return_stmts_node[1])
798804
self.indentLess()
799805
self.prune()
800806

0 commit comments

Comments
 (0)
X Tutup