[pypy-commit] pypy framestate: Add JUMP_IF_FALSE_OR_POP, JUMP_IF_TRUE_OR_POP

rlamy noreply at buildbot.pypy.org
Mon Nov 24 18:25:38 CET 2014


Author: Ronan Lamy <ronan.lamy at gmail.com>
Branch: framestate
Changeset: r74711:177e61c285a5
Date: 2014-11-24 17:03 +0000
http://bitbucket.org/pypy/pypy/changeset/177e61c285a5/

Log:	Add JUMP_IF_FALSE_OR_POP, JUMP_IF_TRUE_OR_POP

diff --git a/rpython/flowspace/bytecode.py b/rpython/flowspace/bytecode.py
--- a/rpython/flowspace/bytecode.py
+++ b/rpython/flowspace/bytecode.py
@@ -294,6 +294,7 @@
 
 
 OPNAMES = host_bytecode_spec.method_names
+NO_ARG = -1
 
 class BCInstruction(object):
     """
@@ -375,7 +376,6 @@
     on_True = reader.get_next_block()
     on_False = reader.get_block_at(self.arg)
     block = reader.curr_block
-    graph = reader.graph
     block.operations[-1] = SWITCH_BOOL(on_False, on_True, offset=self.offset)
     block.set_exits([on_False, on_True])
     reader.enter_next_block(on_True)
@@ -386,14 +386,48 @@
     on_False = reader.get_next_block()
     on_True = reader.get_block_at(self.arg)
     block = reader.curr_block
-    graph = reader.graph
     block.operations[-1] = SWITCH_BOOL(on_False, on_True, offset=self.offset)
     block.set_exits([on_False, on_True])
     reader.enter_next_block(on_False)
 
+ at bc_reader.register_opcode
+class JUMP_IF_FALSE_OR_POP(BCInstruction):
+    def bc_flow(self, reader):
+        block = reader.curr_block
+        block.operations.append(self)
+        self.on_True = reader.get_next_block()
+        self.on_False = reader.get_block_at(self.arg)
+        block.set_exits([self.on_False, self.on_True])
+        reader.enter_next_block(self.on_True)
+
+    def eval(self, ctx):
+        w_value = ctx.peekvalue()
+        if not ctx.guessbool(op.bool(w_value).eval(ctx)):
+            return self.on_False
+        ctx.popvalue()
+        return self.on_True
+
+ at bc_reader.register_opcode
+class JUMP_IF_TRUE_OR_POP(BCInstruction):
+    def bc_flow(self, reader):
+        block = reader.curr_block
+        block.operations.append(self)
+        self.on_True = reader.get_block_at(self.arg)
+        self.on_False = reader.get_next_block()
+        block.set_exits([self.on_False, self.on_True])
+        reader.enter_next_block(self.on_False)
+
+    def eval(self, ctx):
+        w_value = ctx.peekvalue()
+        if ctx.guessbool(op.bool(w_value).eval(ctx)):
+            return self.on_True
+        ctx.popvalue()
+        return self.on_False
+
+
 class SWITCH_BOOL(BCInstruction):
-    name = 'Switch'
-    arg = -42
+    name = 'SWITCH_BOOL'
+    arg = NO_ARG
     def __init__(self, on_False, on_True, offset=-1):
         self.on_False = on_False
         self.on_True = on_True
diff --git a/rpython/flowspace/flowcontext.py b/rpython/flowspace/flowcontext.py
--- a/rpython/flowspace/flowcontext.py
+++ b/rpython/flowspace/flowcontext.py
@@ -698,19 +698,6 @@
         if self.guessbool(op.bool(w_cond).eval(self)):
             return target
 
-    def JUMP_IF_FALSE_OR_POP(self, target):
-        w_value = self.peekvalue()
-        if not self.guessbool(op.bool(w_value).eval(self)):
-            return target
-        self.popvalue()
-
-    def JUMP_IF_TRUE_OR_POP(self, target):
-        w_value = self.peekvalue()
-        if self.guessbool(op.bool(w_value).eval(self)):
-            return target
-            return target
-        self.popvalue()
-
     def JUMP_IF_NOT_DEBUG(self, target):
         pass
 


More information about the pypy-commit mailing list