[pypy-svn] r51196 - in pypy/branch/jit-refactoring/pypy/jit/rainbow: . test
cfbolz at codespeak.net
cfbolz at codespeak.net
Sat Feb 2 02:44:12 CET 2008
Author: cfbolz
Date: Sat Feb 2 02:44:11 2008
New Revision: 51196
Modified:
pypy/branch/jit-refactoring/pypy/jit/rainbow/bytecode.py
pypy/branch/jit-refactoring/pypy/jit/rainbow/test/test_interpreter.py
Log:
implement red switches
Modified: pypy/branch/jit-refactoring/pypy/jit/rainbow/bytecode.py
==============================================================================
--- pypy/branch/jit-refactoring/pypy/jit/rainbow/bytecode.py (original)
+++ pypy/branch/jit-refactoring/pypy/jit/rainbow/bytecode.py Sat Feb 2 02:44:11 2008
@@ -55,6 +55,7 @@
self.frame.local_boxes = redargs
self.frame.local_green = greenargs
self.bytecode_loop()
+ return self.jitstate
def bytecode_loop(self):
while 1:
@@ -70,6 +71,7 @@
def load_2byte(self):
pc = self.frame.pc
+ assert pc >= 0
result = ((ord(self.frame.bytecode.code[pc]) << 8) |
ord(self.frame.bytecode.code[pc + 1]))
self.frame.pc = pc + 2
@@ -77,6 +79,7 @@
def load_4byte(self):
pc = self.frame.pc
+ assert pc >= 0
result = ((ord(self.frame.bytecode.code[pc + 0]) << 24) |
(ord(self.frame.bytecode.code[pc + 1]) << 16) |
(ord(self.frame.bytecode.code[pc + 2]) << 8) |
@@ -99,6 +102,13 @@
def green_result(self, gv):
self.frame.local_green.append(gv)
+ def newjitstate(self, newjitstate):
+ self.jitstate = newjitstate
+ if newjitstate is not None:
+ self.frame = newjitstate.frame
+ else:
+ self.frame = None
+
# operation implementations
def opimpl_make_redbox(self):
genconst = self.get_greenarg()
@@ -119,14 +129,24 @@
self.frame.pc = target
def opimpl_red_goto_iftrue(self):
- XXX
+ switchbox = self.get_redarg()
+ target = self.load_4byte()
+ # XXX not sure about passing no green vars
+ descision = rtimeshift.split(self.jitstate, switchbox, self.frame.pc)
+ if descision:
+ self.frame.pc = target
def opimpl_red_return(self):
rtimeshift.save_return(self.jitstate)
- # XXX for now
- newstate = rtimeshift.leave_graph_red(self.queue, is_portal=True)
- self.jitstate = newstate
- return STOP
+ newjitstate = rtimeshift.dispatch_next(self.queue)
+ resumepoint = rtimeshift.getresumepoint(newjitstate)
+ if resumepoint == -1:
+ # XXX for now
+ newjitstate = rtimeshift.leave_graph_red(self.queue, is_portal=True)
+ self.newjitstate(newjitstate)
+ return STOP
+ self.newjitstate(newjitstate)
+ self.frame.pc = resumepoint
def opimpl_green_return(self):
rtimeshift.save_return(self.jitstate)
Modified: pypy/branch/jit-refactoring/pypy/jit/rainbow/test/test_interpreter.py
==============================================================================
--- pypy/branch/jit-refactoring/pypy/jit/rainbow/test/test_interpreter.py (original)
+++ pypy/branch/jit-refactoring/pypy/jit/rainbow/test/test_interpreter.py Sat Feb 2 02:44:11 2008
@@ -117,8 +117,9 @@
redargs.append(boxcls(kind, inputargs_gv[i]))
residualargs.append(ll_val)
i += 1
- writer.interpreter.run(jitstate, jitcode, greenargs, redargs)
- ll_finish_jitstate(writer.interpreter.jitstate, edesc, sigtoken)
+ jitstate = writer.interpreter.run(jitstate, jitcode, greenargs, redargs)
+ if jitstate is not None:
+ ll_finish_jitstate(jitstate, edesc, sigtoken)
builder.end()
generated = gv_generated.revealconst(lltype.Ptr(FUNC))
graph = generated._obj.graph
@@ -174,5 +175,13 @@
res = self.interpret(ll_plus_minus, [0xA5A, 3, 32, 10])
assert res == 42
+ def test_red_switch(self):
+ def f(x, y):
+ if x:
+ return x
+ return y
+ res = self.interpret(f, [1, 2])
+
+
class TestLLType(AbstractInterpretationTest):
type_system = "lltype"
More information about the Pypy-commit
mailing list