[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