Author: Ronan Lamy <[email protected]>
Branch: framestate
Changeset: r74707:d1f78f96c21e
Date: 2014-11-24 02:56 +0000
http://bitbucket.org/pypy/pypy/changeset/d1f78f96c21e/

Log:    Merge prepare_flow() and bc_flow()

diff --git a/rpython/flowspace/bytecode.py b/rpython/flowspace/bytecode.py
--- a/rpython/flowspace/bytecode.py
+++ b/rpython/flowspace/bytecode.py
@@ -140,10 +140,14 @@
         while self.offset < len(code.co_code):
             self.graph._next_pos.setdefault(last_offset, self.offset)
             if self.offset in self.pending_blocks:
-                new_block = self.pending_blocks[self.offset]
+                next_block = self.pending_blocks[self.offset]
                 if not self.curr_block.operations:
+                    import pdb; pdb.set_trace
                     self.blocks.pop()
-                self.enter_next_block(new_block)
+                self.enter_next_block(next_block)
+            elif self.needs_new_block:
+                next_block = self.new_block()
+                self.enter_next_block(next_block)
             next_offset, instr = self.read(code, self.offset)
             yield instr
             last_offset = instr.offset
@@ -175,31 +179,37 @@
             self.blocks[i_block:i_block + 1] = split
             return split[-1]
         else:
+            if offset in self.pending_blocks:
+                return self.pending_blocks[offset]
             new_block = self.new_block()
             self.pending_blocks[offset] = new_block
-            return self.new_block()
+            return new_block
 
     def enter_next_block(self, block):
         self.curr_block = block
         self.blocks.append(block)
+        self.needs_new_block = False
+
+    def end_block(self):
+        self.needs_new_block = True
 
     def build_flow(self, code):
         offsets = []
         self.pending_blocks = {}
         self.blocks = [SimpleBlock([])]
         self.curr_block = self.blocks[0]
+        self.needs_new_block = False
         self.graph = graph = BytecodeGraph(self.blocks[0])
         for instr in self._iter_instr(code):
             offsets.append(instr.offset)
             block = self.curr_block
             graph.pos_index[instr.offset] = block, len(block.operations)
-            instr.prepare_flow(self)
+            instr.bc_flow(self)
 
         graph._next_pos[offsets[-1]] = len(code.co_code)
-        for block in self.blocks:
-            self.curr_block = block
-            for i, op in enumerate(block.operations):
-                op.bc_flow(self)
+        for b in self.blocks:
+            for x in b._exits:
+                assert x in self.blocks
         return graph
 
     def build_code(self, code):
@@ -298,17 +308,13 @@
     def eval(self, ctx):
         pass
 
-    def prepare_flow(self, reader):
-        block = reader.curr_block
-        block.operations.append(self)
+    def bc_flow(self, reader):
+        reader.curr_block.operations.append(self)
         if self.has_jump():
             new_block = reader.new_block()
             reader.enter_next_block(new_block)
             reader.get_block_at(self.arg)
 
-    def bc_flow(self, reader):
-        pass
-
     def has_jump(self):
         return self.num in opcode.hasjrel or self.num in opcode.hasjabs
 
@@ -351,39 +357,29 @@
 
 @flow_opcode
 def POP_JUMP_IF_FALSE(self, reader):
+    reader.curr_block.operations.append(self)
+    on_True = reader.new_block()
+    on_False = reader.get_block_at(self.arg)
     block = reader.curr_block
     graph = reader.graph
-    on_False = reader.get_block_at(self.arg)
-    on_True = reader.get_block_at(graph.next_pos(self))
     block.operations[-1] = SWITCH_BOOL(on_False, on_True, offset=self.offset)
     block.set_exits([on_False, on_True])
-
-def prepare(self, reader):
-    block = reader.curr_block
-    block.operations.append(self)
-    new_block = reader.new_block()
-    reader.enter_next_block(new_block)
-    reader.get_block_at(self.arg)
-POP_JUMP_IF_FALSE.prepare_flow = prepare
+    reader.enter_next_block(on_True)
 
 @flow_opcode
 def POP_JUMP_IF_TRUE(self, reader):
+    reader.curr_block.operations.append(self)
+    on_False = reader.new_block()
+    on_True = reader.get_block_at(self.arg)
     block = reader.curr_block
     graph = reader.graph
-    on_True = reader.get_block_at(self.arg)
-    on_False = reader.get_block_at(graph.next_pos(self))
     block.operations[-1] = SWITCH_BOOL(on_False, on_True, offset=self.offset)
     block.set_exits([on_False, on_True])
-
-def prepare(self, reader):
-    block = reader.curr_block
-    block.operations.append(self)
-    new_block = reader.new_block()
-    reader.enter_next_block(new_block)
-    reader.get_block_at(self.arg)
-POP_JUMP_IF_TRUE.prepare_flow = prepare
+    reader.enter_next_block(on_False)
 
 class SWITCH_BOOL(BCInstruction):
+    name = 'Switch'
+    arg = -42
     def __init__(self, on_False, on_True, offset=-1):
         self.on_False = on_False
         self.on_True = on_True
@@ -398,31 +394,21 @@
 
 @flow_opcode
 def JUMP_ABSOLUTE(self, reader):
-    pass
-
-def prepare(self, reader):
+    reader.curr_block.operations.append(self)
+    target_block = reader.get_block_at(self.arg)
     block = reader.curr_block
     graph = reader.graph
-    block.operations.append(self)
-    new_block = reader.new_block()
-    reader.enter_next_block(new_block)
-    target_block = reader.get_block_at(self.arg)
     graph.add_jump(block, target_block, self.arg)
-JUMP_ABSOLUTE.prepare_flow = prepare
+    reader.end_block()
 
 @flow_opcode
 def JUMP_FORWARD(self, reader):
-    pass
-
-def prepare(self, reader):
+    reader.curr_block.operations.append(self)
+    target_block = reader.get_block_at(self.arg)
     block = reader.curr_block
     graph = reader.graph
-    block.operations.append(self)
-    new_block = reader.new_block()
-    reader.enter_next_block(new_block)
-    target_block = reader.get_block_at(self.arg)
     graph.add_jump(block, target_block, self.arg)
-JUMP_FORWARD.prepare_flow = prepare
+    reader.end_block()
 
 @bc_reader.register_opcode
 class SETUP_EXCEPT(BCInstruction):
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to