diff --git a/uncompyle6/scanners/scanner3.py b/uncompyle6/scanners/scanner3.py index 64a25751..5d4a10ef 100644 --- a/uncompyle6/scanners/scanner3.py +++ b/uncompyle6/scanners/scanner3.py @@ -555,6 +555,33 @@ class Scanner3(scan.Scanner): else: self.fixed_jumps[offset] = self.restrict_to_parent(target, parent) + def next_except_jump(self, start): + """ + Return the next jump that was generated by an except SomeException: + construct in a try...except...else clause or None if not found. + """ + + if self.code[start] == DUP_TOP: + except_match = self.first_instr(start, len(self.code), POP_JUMP_IF_FALSE) + if except_match: + jmp = self.prev_op[self.get_target(except_match)] + self.ignore_if.add(except_match) + self.not_continue.add(jmp) + return jmp + + count_END_FINALLY = 0 + count_SETUP_ = 0 + for i in self.op_range(start, len(self.code)): + op = self.code[i] + if op == END_FINALLY: + if count_END_FINALLY == count_SETUP_: + assert self.code[self.prev_op[i]] in (JUMP_ABSOLUTE, JUMP_FORWARD, RETURN_VALUE) + self.not_continue.add(self.prev_op[i]) + return self.prev_op[i] + count_END_FINALLY += 1 + elif op in (SETUP_EXCEPT, SETUP_WITH, SETUP_FINALLY): + count_SETUP_ += 1 + def rem_or(self, start, end, instr, target=None, include_beyond_target=False): """ Find offsets of all requested between and , diff --git a/uncompyle6/scanners/scanner34.py b/uncompyle6/scanners/scanner34.py index dbcd2de3..df69476b 100644 --- a/uncompyle6/scanners/scanner34.py +++ b/uncompyle6/scanners/scanner34.py @@ -298,33 +298,6 @@ class Scanner34(scan3.Scanner3): else: self.fixed_jumps[offset] = self.restrict_to_parent(target, parent) - def next_except_jump(self, start): - """ - Return the next jump that was generated by an except SomeException: - construct in a try...except...else clause or None if not found. - """ - - if self.code[start] == DUP_TOP: - except_match = self.first_instr(start, len(self.code), POP_JUMP_IF_FALSE) - if except_match: - jmp = self.prev_op[self.get_target(except_match)] - self.ignore_if.add(except_match) - self.not_continue.add(jmp) - return jmp - - count_END_FINALLY = 0 - count_SETUP_ = 0 - for i in self.op_range(start, len(self.code)): - op = self.code[i] - if op == END_FINALLY: - if count_END_FINALLY == count_SETUP_: - assert self.code[self.prev_op[i]] in (JUMP_ABSOLUTE, JUMP_FORWARD, RETURN_VALUE) - self.not_continue.add(self.prev_op[i]) - return self.prev_op[i] - count_END_FINALLY += 1 - elif op in (SETUP_EXCEPT, SETUP_WITH, SETUP_FINALLY): - count_SETUP_ += 1 - if __name__ == "__main__": co = inspect.currentframe().f_code tokens, customize = Scanner34(3.4).disassemble(co) diff --git a/uncompyle6/scanners/scanner35.py b/uncompyle6/scanners/scanner35.py index 89b373b5..ca6e53a5 100644 --- a/uncompyle6/scanners/scanner35.py +++ b/uncompyle6/scanners/scanner35.py @@ -288,33 +288,6 @@ class Scanner35(scan3.Scanner3): else: self.fixed_jumps[offset] = self.restrict_to_parent(target, parent) - def next_except_jump(self, start): - """ - Return the next jump that was generated by an except SomeException: - construct in a try...except...else clause or None if not found. - """ - - if self.code[start] == DUP_TOP: - except_match = self.first_instr(start, len(self.code), POP_JUMP_IF_FALSE) - if except_match: - jmp = self.prev_op[self.get_target(except_match)] - self.ignore_if.add(except_match) - self.not_continue.add(jmp) - return jmp - - count_END_FINALLY = 0 - count_SETUP_ = 0 - for i in self.op_range(start, len(self.code)): - op = self.code[i] - if op == END_FINALLY: - if count_END_FINALLY == count_SETUP_: - assert self.code[self.prev_op[i]] in (JUMP_ABSOLUTE, JUMP_FORWARD, RETURN_VALUE) - self.not_continue.add(self.prev_op[i]) - return self.prev_op[i] - count_END_FINALLY += 1 - elif op in (SETUP_EXCEPT, SETUP_WITH, SETUP_FINALLY): - count_SETUP_ += 1 - if __name__ == "__main__": co = inspect.currentframe().f_code tokens, customize = Scanner35(3.5).disassemble(co)