diff --git a/uncompyle6/scanners/scanner2.py b/uncompyle6/scanners/scanner2.py index 2794edf7..0c69b7f8 100644 --- a/uncompyle6/scanners/scanner2.py +++ b/uncompyle6/scanners/scanner2.py @@ -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 diff --git a/uncompyle6/semantics/consts.py b/uncompyle6/semantics/consts.py index 80a2a14a..e6b22134 100644 --- a/uncompyle6/semantics/consts.py +++ b/uncompyle6/semantics/consts.py @@ -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 ), diff --git a/uncompyle6/semantics/pysource.py b/uncompyle6/semantics/pysource.py index 34c855cd..6359b4a7 100644 --- a/uncompyle6/semantics/pysource.py +++ b/uncompyle6/semantics/pysource.py @@ -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()