[pypy-svn] r51964 - in pypy/branch/jit-refactoring/pypy/jit/rainbow: . test

cfbolz at codespeak.net cfbolz at codespeak.net
Fri Feb 29 19:17:54 CET 2008


Author: cfbolz
Date: Fri Feb 29 19:17:52 2008
New Revision: 51964

Modified:
   pypy/branch/jit-refactoring/pypy/jit/rainbow/codewriter.py
   pypy/branch/jit-refactoring/pypy/jit/rainbow/interpreter.py
   pypy/branch/jit-refactoring/pypy/jit/rainbow/test/test_interpreter.py
Log:
fix indirect gray calls


Modified: pypy/branch/jit-refactoring/pypy/jit/rainbow/codewriter.py
==============================================================================
--- pypy/branch/jit-refactoring/pypy/jit/rainbow/codewriter.py	(original)
+++ pypy/branch/jit-refactoring/pypy/jit/rainbow/codewriter.py	Fri Feb 29 19:17:52 2008
@@ -691,7 +691,7 @@
             emitted_args.append(self.serialize_oparg("red", v))
         self.emit("red_residual_call")
         calldescindex = self.calldesc_position(op.args[0].concretetype)
-        self.emit(fnptrindex, calldescindex, withexc)
+        self.emit(fnptrindex, calldescindex, withexc, kind != "gray")
         self.emit(len(emitted_args), *emitted_args)
         self.emit(self.promotiondesc_position(lltype.Signed))
         self.emit("goto", tlabel(("after indirect call", op)))
@@ -706,14 +706,17 @@
 
         if kind == "red":
             self.emit("red_after_direct_call")
+            self.register_redvar(op.result)
         elif kind == "yellow":
             self.emit("yellow_after_direct_call")
             self.emit("yellow_retrieve_result_as_red")
             self.emit(self.type_position(op.result.concretetype))
+            self.register_redvar(op.result)
+        elif kind == "gray":
+            self.emit("red_after_direct_call")
         else:
             XXX
 
-        self.register_redvar(op.result)
         self.emit(label(("after indirect call", op)))
 
     def handle_oopspec_call(self, op, withexc):
@@ -783,12 +786,14 @@
     def handle_residual_call(self, op, withexc):
         fnptr = op.args[0]
         pos = self.calldesc_position(lltype.typeOf(fnptr.value))
+        has_result = self.varcolor(op.result) != "gray"
         func = self.serialize_oparg("red", fnptr)
         emitted_args = []
         for v in op.args[1:]:
             emitted_args.append(self.serialize_oparg("red", v))
         self.emit("red_residual_call")
-        self.emit(func, pos, withexc, len(emitted_args), *emitted_args)
+        self.emit(func, pos, withexc, has_result, len(emitted_args))
+        self.emit(*emitted_args)
         self.emit(self.promotiondesc_position(lltype.Signed))
         self.register_redvar(op.result)
 

Modified: pypy/branch/jit-refactoring/pypy/jit/rainbow/interpreter.py
==============================================================================
--- pypy/branch/jit-refactoring/pypy/jit/rainbow/interpreter.py	(original)
+++ pypy/branch/jit-refactoring/pypy/jit/rainbow/interpreter.py	Fri Feb 29 19:17:52 2008
@@ -228,7 +228,8 @@
             bytecode = self.load_2byte()
             assert bytecode >= 0
             result = self.opcode_implementations[bytecode](self)
-            #assert self.frame.local_boxes[-1] is not None
+            #assert (self.frame is None or not self.frame.local_boxes or
+            #        self.frame.local_boxes[-1] is not None)
             if result is STOP:
                 return
             else:
@@ -581,12 +582,14 @@
         rtimeshift.residual_fetch(self.jitstate, self.exceptiondesc,
                                   check_forced, flagbox)
 
-    @arguments("red", "calldesc", "bool", "red_varargs", "promotiondesc")
-    def opimpl_red_residual_call(self, funcbox, calldesc, withexc,
-                                        redargs, promotiondesc):
+    @arguments("red", "calldesc", "bool", "bool", "red_varargs",
+               "promotiondesc")
+    def opimpl_red_residual_call(self, funcbox, calldesc, withexc, has_result,
+                                 redargs, promotiondesc):
         result = rtimeshift.gen_residual_call(self.jitstate, calldesc,
                                               funcbox, redargs)
-        self.red_result(result)
+        if has_result:
+            self.red_result(result)
         if withexc:
             exceptiondesc = self.exceptiondesc
         else:

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	Fri Feb 29 19:17:52 2008
@@ -1367,7 +1367,6 @@
         self.check_insns(indirect_call=1)
 
     def test_indirect_gray_call(self):
-        py.test.skip("not working yet")
         def h1(w, n):
             w[0] =  n*2
         def h2(w, n):



More information about the Pypy-commit mailing list