Author: Ronan Lamy <[email protected]>
Branch: framestate
Changeset: r74698:30190c212671
Date: 2014-11-23 19:04 +0000
http://bitbucket.org/pypy/pypy/changeset/30190c212671/
Log: Add .pending_blocks: mapping of target offsets to peredeclared
blocks
diff --git a/rpython/flowspace/bytecode.py b/rpython/flowspace/bytecode.py
--- a/rpython/flowspace/bytecode.py
+++ b/rpython/flowspace/bytecode.py
@@ -137,8 +137,11 @@
self.offset = 0
i = 0
while self.offset < len(code.co_code):
- if self.offset in self.pending_cuts:
- self.new_block()
+ if self.offset in self.pending_blocks:
+ new_block = self.pending_blocks[self.offset]
+ if not self.blocks[-1].operations:
+ self.blocks.pop()
+ self.blocks.append(new_block)
next_offset, instr = self.read(code, self.offset)
yield instr
self.offset = next_offset
@@ -155,25 +158,27 @@
return n, i
def new_block(self):
- if self.blocks[-1].operations:
- new_block = SimpleBlock([])
- self.blocks.append(new_block)
+ return SimpleBlock([])
- def _add_jump(self, target):
- if target <= self.offset:
- i_block, i_instr = self.find_position(target)
+ def get_block_at(self, offset):
+ """Get or create the block starting at ``offset``"""
+ if offset <= self.offset:
+ i_block, i_instr = self.find_position(offset)
split = self.blocks[i_block].split_at(i_instr)
if len(split) == 2:
new_block = split[1]
for i, instr in enumerate(new_block.operations):
self.graph.pos_index[instr.offset] = new_block, i
self.blocks[i_block:i_block + 1] = split
+ return split[-1]
else:
- self.pending_cuts.add(target)
+ new_block = self.new_block()
+ self.pending_blocks[offset] = new_block
+ return self.new_block()
def build_flow(self, code):
offsets = []
- self.pending_cuts = set()
+ self.pending_blocks = {}
self.blocks = [SimpleBlock([])]
self.graph = graph = BytecodeGraph(self.blocks[0])
last_offset = -1
@@ -184,8 +189,9 @@
graph._next_pos[last_offset] = instr.offset
block.operations.append(instr)
if instr.has_jump():
- self.new_block()
- self._add_jump(instr.arg)
+ new_block = self.new_block()
+ self.blocks.append(new_block)
+ self.get_block_at(instr.arg)
last_offset = instr.offset
graph._next_pos[offsets[-1]] = len(code.co_code)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit