[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