You've already forked python-uncompyle6
mirror of
https://github.com/rocky/python-uncompyle6.git
synced 2025-08-03 16:59:52 +08:00
Improvement of loop handling
This commit is contained in:
@@ -36,3 +36,12 @@ while i < 10:
|
|||||||
print i,
|
print i,
|
||||||
else:
|
else:
|
||||||
print 'Else'
|
print 'Else'
|
||||||
|
|
||||||
|
for x, y in [(1,2),(3,4)]:
|
||||||
|
if x in ['==', '>=', '>']:
|
||||||
|
if '0' in y:
|
||||||
|
print
|
||||||
|
|
||||||
|
for x in (1, 2, 3):
|
||||||
|
if x == 1:
|
||||||
|
print x
|
||||||
|
@@ -85,6 +85,9 @@ class Scanner:
|
|||||||
ret = self.getOpcodeToDel(i)
|
ret = self.getOpcodeToDel(i)
|
||||||
if ret != None:
|
if ret != None:
|
||||||
toDel += ret
|
toDel += ret
|
||||||
|
|
||||||
|
#self.print_bytecode()
|
||||||
|
|
||||||
if toDel:
|
if toDel:
|
||||||
toDel = sorted(list(set(toDel)))
|
toDel = sorted(list(set(toDel)))
|
||||||
delta = 0
|
delta = 0
|
||||||
@@ -278,7 +281,8 @@ class Scanner:
|
|||||||
destFor = self.get_target(jmpabs1target)
|
destFor = self.get_target(jmpabs1target)
|
||||||
if destFor == i+opsize+4:
|
if destFor == i+opsize+4:
|
||||||
setupLoop = self.last_instr(0, jmpabs1target, SETUP_LOOP)
|
setupLoop = self.last_instr(0, jmpabs1target, SETUP_LOOP)
|
||||||
assert self.get_target(setupLoop) >= i+opsize+4+self.op_size(POP_BLOCK)
|
standarFor = self.last_instr(setupLoop, jmpabs1target, GET_ITER)
|
||||||
|
if standarFor == None:
|
||||||
self.restructJump(jmpabs1target, destFor+self.op_size(POP_BLOCK))
|
self.restructJump(jmpabs1target, destFor+self.op_size(POP_BLOCK))
|
||||||
toDel += [setupLoop, i+opsize+1, i+opsize+4]
|
toDel += [setupLoop, i+opsize+1, i+opsize+4]
|
||||||
if len(toDel) > 0:
|
if len(toDel) > 0:
|
||||||
@@ -455,6 +459,15 @@ class Scanner:
|
|||||||
target = self.code[pos+1] + self.code[pos+2] * 256
|
target = self.code[pos+1] + self.code[pos+2] * 256
|
||||||
return target
|
return target
|
||||||
|
|
||||||
|
def print_bytecode(self):
|
||||||
|
for i in self.op_range(0, len(self.code)):
|
||||||
|
op = self.code[i]
|
||||||
|
if op in dis.hasjabs+dis.hasjrel:
|
||||||
|
dest = self.get_target(i, op)
|
||||||
|
print '%i\t%s\t%i' % (i, dis.opname[op], dest)
|
||||||
|
else:
|
||||||
|
print '%i\t%s\t' % (i, dis.opname[op])
|
||||||
|
|
||||||
def first_instr(self, start, end, instr, target=None, exact=True):
|
def first_instr(self, start, end, instr, target=None, exact=True):
|
||||||
"""
|
"""
|
||||||
Find the first <instr> in the block from start to end.
|
Find the first <instr> in the block from start to end.
|
||||||
|
@@ -285,7 +285,8 @@ class Scanner:
|
|||||||
destFor = self.get_target(jmpabs1target)
|
destFor = self.get_target(jmpabs1target)
|
||||||
if destFor == i+opsize+4:
|
if destFor == i+opsize+4:
|
||||||
setupLoop = self.last_instr(0, jmpabs1target, SETUP_LOOP)
|
setupLoop = self.last_instr(0, jmpabs1target, SETUP_LOOP)
|
||||||
assert self.get_target(setupLoop) >= i+opsize+4+self.op_size(POP_BLOCK)
|
standarFor = self.last_instr(setupLoop, jmpabs1target, GET_ITER)
|
||||||
|
if standarFor == None:
|
||||||
self.restructJump(jmpabs1target, destFor+self.op_size(POP_BLOCK))
|
self.restructJump(jmpabs1target, destFor+self.op_size(POP_BLOCK))
|
||||||
toDel += [setupLoop, i+opsize+1, i+opsize+4]
|
toDel += [setupLoop, i+opsize+1, i+opsize+4]
|
||||||
if len(toDel) > 0:
|
if len(toDel) > 0:
|
||||||
@@ -384,8 +385,6 @@ class Scanner:
|
|||||||
if(self.code[i] in (PJIF,PJIT)):
|
if(self.code[i] in (PJIF,PJIT)):
|
||||||
target = self.get_argument(i)
|
target = self.get_argument(i)
|
||||||
target += i + 3
|
target += i + 3
|
||||||
if target > 0xFFFF:
|
|
||||||
raise 'TODO'
|
|
||||||
self.restructJump(i, target)
|
self.restructJump(i, target)
|
||||||
|
|
||||||
for i in self.op_range(0, len(self.code)):
|
for i in self.op_range(0, len(self.code)):
|
||||||
@@ -393,8 +392,6 @@ class Scanner:
|
|||||||
target = self.get_target(i)
|
target = self.get_target(i)
|
||||||
if self.code[target] == JA:
|
if self.code[target] == JA:
|
||||||
target = self.get_target(target)
|
target = self.get_target(target)
|
||||||
if target > 0xFFFF:
|
|
||||||
raise 'TODO'
|
|
||||||
self.restructJump(i, target)
|
self.restructJump(i, target)
|
||||||
|
|
||||||
def restructCode(self, listDel):
|
def restructCode(self, listDel):
|
||||||
|
Reference in New Issue
Block a user