Improvement of loop handling

This commit is contained in:
Mysterie
2012-09-22 15:19:07 +02:00
parent e5f0560012
commit f91e514f44
3 changed files with 29 additions and 10 deletions

View File

@@ -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

View File

@@ -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.

View File

@@ -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):