diff --git a/pytest/test_fjt.py b/pytest/test_fjt.py index 28cb2a7e..aab08bd2 100644 --- a/pytest/test_fjt.py +++ b/pytest/test_fjt.py @@ -1,6 +1,7 @@ #!/usr/bin/env python from uncompyle6 import PYTHON_VERSION, IS_PYPY from uncompyle6.scanner import get_scanner +from xdis.bytecode import Bytecode from array import array def bug(state, slotstate): if state: @@ -53,9 +54,11 @@ def test_if_in_for(): {'start': 48, 'end': 67, 'type': 'while-loop'}] elif 3.2 < PYTHON_VERSION <= 3.4: + bytecode = Bytecode(code, scan.opc) scan.code = array('B', code.co_code) scan.build_lines_data(code) scan.build_prev_op() + scan.insts = list(bytecode) fjt = scan.find_jump_targets(False) assert {69: [66], 63: [18]} == fjt assert scan.structs == \ diff --git a/uncompyle6/scanners/scanner3.py b/uncompyle6/scanners/scanner3.py index 0d4b679a..dd487d18 100644 --- a/uncompyle6/scanners/scanner3.py +++ b/uncompyle6/scanners/scanner3.py @@ -28,7 +28,6 @@ from array import array from uncompyle6.scanner import Scanner from xdis.code import iscode from xdis.bytecode import Bytecode, instruction_size -from xdis.util import code2num from uncompyle6.scanner import Token, parse_fn_counts import xdis diff --git a/uncompyle6/scanners/scanner36.py b/uncompyle6/scanners/scanner36.py index 58a7daf0..e951930a 100644 --- a/uncompyle6/scanners/scanner36.py +++ b/uncompyle6/scanners/scanner36.py @@ -42,76 +42,6 @@ class Scanner36(Scanner3): pass return tokens, customize - def find_jump_targets(self, debug): - """ - Detect all offsets in a byte code which are jump targets - where we might insert a COME_FROM instruction. - - Return the list of offsets. - - Return the list of offsets. An instruction can be jumped - to in from multiple instructions. - """ - code = self.code - n = len(code) - self.structs = [{'type': 'root', - 'start': 0, - 'end': n-1}] - - # All loop entry points - self.loops = [] - - # Map fixed jumps to their real destination - self.fixed_jumps = {} - self.except_targets = {} - self.ignore_if = set() - self.build_statement_indices() - self.else_start = {} - - # Containers filled by detect_control_flow() - self.not_continue = set() - self.return_end_ifs = set() - self.setup_loop_targets = {} # target given setup_loop offset - self.setup_loops = {} # setup_loop offset given target - - targets = {} - for i, inst in enumerate(self.insts): - offset = inst.offset - op = inst.opcode - - self.detect_control_flow(offset, targets, 0) - - if inst.has_arg: - label = self.fixed_jumps.get(offset) - oparg = inst.arg - next_offset = xdis.next_offset(op, self.opc, offset) - - if label is None: - if op in self.opc.hasjrel and op != self.opc.FOR_ITER: - label = next_offset + oparg - elif op in self.opc.hasjabs: - if op in self.jump_if_pop: - if oparg > offset: - label = oparg - - if label is not None and label != -1: - targets[label] = targets.get(label, []) + [offset] - elif op == self.opc.END_FINALLY and offset in self.fixed_jumps: - label = self.fixed_jumps[offset] - targets[label] = targets.get(label, []) + [offset] - pass - - pass # for loop - - # DEBUG: - if debug in ('both', 'after'): - import pprint as pp - pp.pprint(self.structs) - - return targets - - pass - if __name__ == "__main__": from uncompyle6 import PYTHON_VERSION if PYTHON_VERSION == 3.6: