You've already forked python-uncompyle6
mirror of
https://github.com/rocky/python-uncompyle6.git
synced 2025-08-03 00:45:53 +08:00
Merge in COME_FROM disambiguation ...
from controlflowbranch. Should probably expand to Python2 parsers as well
This commit is contained in:
@@ -1,38 +0,0 @@
|
||||
"""
|
||||
Detect control flow as much as possible.
|
||||
The basic idea here is to put in explicit end instructions that make
|
||||
grammar parsing simpler and more precise.
|
||||
"""
|
||||
|
||||
from collections import namedtuple
|
||||
from xdis.bytecode import Bytecode
|
||||
|
||||
control_flow_start = namedtuple('control_flow_start', ['name', 'type', 'offset'])
|
||||
control_flow_end = namedtuple('control_flow_end', ['name', 'type', 'offset'])
|
||||
|
||||
class ControlFlow():
|
||||
def __init__(self, scanner):
|
||||
self.scanner = scanner
|
||||
self.opc = self.scanner.opc
|
||||
self.setup_ops = self.scanner.setup_ops
|
||||
self.op_range = self.scanner.op_range
|
||||
|
||||
# Control-flow nesting
|
||||
self.offset_action = {}
|
||||
self.cf_end = []
|
||||
|
||||
def detect_control_flow(self, co):
|
||||
self.bytecode = Bytecode(co, self.opc)
|
||||
for inst in self.bytecode:
|
||||
if inst.opcode in self.setup_ops:
|
||||
# Use part after SETUP_
|
||||
name = inst.opname[len('SETUP_'):]
|
||||
self.offset_action[inst.offset] = control_flow_start(name, 'start', inst.offset)
|
||||
self.offset_action[inst.argval] = control_flow_end(name, 'end', inst.offset)
|
||||
pass
|
||||
pass
|
||||
# import pprint
|
||||
# pp = pprint.PrettyPrinter(indent=4)
|
||||
# pp.pprint(self.offset_action)
|
||||
|
||||
return self.offset_action
|
@@ -29,7 +29,6 @@ from uncompyle6.scanner import Scanner, op_has_argument
|
||||
from xdis.code import iscode
|
||||
from xdis.bytecode import Bytecode
|
||||
from uncompyle6.scanner import Token, parse_fn_counts
|
||||
from uncompyle6.scanners.controlflow import ControlFlow
|
||||
|
||||
# Get all the opcodes into globals
|
||||
import xdis.opcodes.opcode_33 as op3
|
||||
@@ -192,7 +191,6 @@ class Scanner3(Scanner):
|
||||
# Format: {target offset: [jump offsets]}
|
||||
jump_targets = self.find_jump_targets()
|
||||
|
||||
offset_action = ControlFlow(self).detect_control_flow(co)
|
||||
for inst in bytecode:
|
||||
|
||||
argval = inst.argval
|
||||
|
Reference in New Issue
Block a user