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

cfbolz at codespeak.net cfbolz at codespeak.net
Mon Feb 11 20:48:35 CET 2008


Author: cfbolz
Date: Mon Feb 11 20:48:33 2008
New Revision: 51395

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
   pypy/branch/jit-refactoring/pypy/jit/rainbow/test/test_serializegraph.py
   pypy/branch/jit-refactoring/pypy/jit/rainbow/test/test_vlist.py
Log:
three more virtual list tests pass


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	Mon Feb 11 20:48:33 2008
@@ -1,4 +1,5 @@
 from pypy.rlib.unroll import unrolling_iterable
+from pypy.rlib.objectmodel import we_are_translated
 from pypy.objspace.flow import model as flowmodel
 from pypy.rpython.lltypesystem import lltype
 from pypy.jit.hintannotator.model import originalconcretetype
@@ -10,8 +11,6 @@
 from pypy.translator.backendopt.removenoops import remove_same_as
 
 
-
-
 class BytecodeWriter(object):
     def __init__(self, t, hannotator, RGenOp):
         self.translator = t
@@ -295,9 +294,9 @@
     def redvar_position(self, arg):
         return self.redvar_positions[arg]
 
-    def register_greenvar(self, arg, where=-1):
+    def register_greenvar(self, arg, where=None):
         assert isinstance(arg, flowmodel.Variable)
-        if where == -1:
+        if where is None:
             where = self.free_green[self.current_block]
             self.free_green[self.current_block] += 1
         self.greenvar_positions[arg] = where
@@ -382,27 +381,41 @@
         self.graph_positions[graph] = index
         return index
 
-    def nonrainbow_position(self, fnptr):
+    def nonrainbow_position(self, fnptr, *voidargs):
         fn = fnptr._obj
-        if fn in self.nonrainbow_positions:
-            return self.nonrainbow_positions[fn]
+        key = fn, voidargs
+        if key in self.nonrainbow_positions:
+            return self.nonrainbow_positions[key]
         FUNCTYPE = lltype.typeOf(fn)
-        argiter = unrolling_iterable(enumerate(FUNCTYPE.ARGS))
+        argiter = unrolling_iterable(FUNCTYPE.ARGS)
         numargs = len(FUNCTYPE.ARGS)
-        def call_normal_function(interpreter, greenargs, redargs):
-            assert len(redargs) == 0
-            assert len(greenargs) == numargs
+        def call_normal_function(interpreter, greenargs):
+            assert len(greenargs) + len(voidargs) == numargs 
             args = ()
-            for i, ARG in argiter:
-                genconst = greenargs[i]
-                arg = genconst.revealconst(ARG)
-                args += (arg, )
+            j = 0
+            k = 0
+            for ARG in argiter:
+                if ARG == lltype.Void:
+                    # XXX terrible hack
+                    arg = voidargs[k]
+                    if not we_are_translated():
+                        arg._TYPE = lltype.Void
+                    args += (arg, )
+                    k += 1
+                else:
+                    genconst = greenargs[j]
+                    arg = genconst.revealconst(ARG)
+                    args += (arg, )
+                    j += 1
             rgenop = interpreter.jitstate.curbuilder.rgenop
-            result = rgenop.genconst(fnptr(*args))
+            try:
+                result = rgenop.genconst(fnptr(*args))
+            except Exception, e:
+                XXX # need to create a default result and set exception
             interpreter.green_result(result)
         result = len(self.nonrainbow_functions)
         self.nonrainbow_functions.append(call_normal_function)
-        self.nonrainbow_positions[fn] = result
+        self.nonrainbow_positions[key] = result
         return result
 
     def interiordesc(self, op, PTRTYPE, nb_offsets):
@@ -533,6 +546,20 @@
             self.emit(*args)
             self.register_redvar(op.result)
             return
+        elif kind == "green":
+            voidargs = [const.value for const in op.args[1:]
+                            if const.concretetype == lltype.Void]
+            pos = self.nonrainbow_position(op.args[0].value, *voidargs)
+            emitted_args = []
+            for v in op.args[1:]:
+                if v.concretetype != lltype.Void:
+                    emitted_args.append(self.serialize_oparg("green", v))
+            self.emit("green_direct_call")
+            self.emit(len(emitted_args))
+            self.emit(*emitted_args)
+            self.emit(pos)
+            self.register_greenvar(op.result)
+            return
         targets = dict(self.graphs_from(op))
         assert len(targets) == 1
         targetgraph, = targets.values()
@@ -546,14 +573,6 @@
             if kind == "red":
                 self.register_redvar(op.result)
             self.emit("red_after_direct_call")
-        elif kind == "green":
-            pos = self.nonrainbow_position(op.args[0].value)
-            args = targetgraph.getargs()
-            emitted_args = self.args_of_call(op.args[1:], args)
-            self.emit("green_direct_call")
-            self.emit(*emitted_args)
-            self.emit(pos)
-            self.register_greenvar(op.result)
         elif kind == "yellow":
             graphindex = self.graph_position(targetgraph)
             args = targetgraph.getargs()

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	Mon Feb 11 20:48:33 2008
@@ -299,10 +299,9 @@
 
     def opimpl_green_direct_call(self):
         greenargs = self.get_green_varargs()
-        redargs = self.get_red_varargs()
         index = self.load_2byte()
         function = self.frame.bytecode.nonrainbow_functions[index]
-        function(self, greenargs, redargs)
+        function(self, greenargs)
 
     def opimpl_yellow_direct_call(self):
         greenargs = self.get_green_varargs()

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	Mon Feb 11 20:48:33 2008
@@ -95,6 +95,7 @@
         self.graph = graph2
         writer = BytecodeWriter(t, hannotator, self.RGenOp)
         jitcode = writer.make_bytecode(graph2)
+        rtyper.specialize_more_blocks()
         argcolors = []
 
         # make residual functype

Modified: pypy/branch/jit-refactoring/pypy/jit/rainbow/test/test_serializegraph.py
==============================================================================
--- pypy/branch/jit-refactoring/pypy/jit/rainbow/test/test_serializegraph.py	(original)
+++ pypy/branch/jit-refactoring/pypy/jit/rainbow/test/test_serializegraph.py	Mon Feb 11 20:48:33 2008
@@ -246,7 +246,7 @@
 
         writer, jitcode = self.serialize(ll_function, [int])
         assert jitcode.code == assemble(writer.interpreter,
-                                        "green_direct_call", 1, 0, 0, 0,
+                                        "green_direct_call", 1, 0, 0,
                                         "make_redbox", 1, 0,
                                         "make_new_redvars", 1, 0,
                                         "make_new_greenvars", 0,

Modified: pypy/branch/jit-refactoring/pypy/jit/rainbow/test/test_vlist.py
==============================================================================
--- pypy/branch/jit-refactoring/pypy/jit/rainbow/test/test_vlist.py	(original)
+++ pypy/branch/jit-refactoring/pypy/jit/rainbow/test/test_vlist.py	Mon Feb 11 20:48:33 2008
@@ -65,7 +65,6 @@
         self.check_insns({'int_is_true': 1})
 
     def test_force(self):
-        py.test.skip("implement me")
         def ll_function(n):
             lst = []
             lst.append(n)
@@ -134,7 +133,6 @@
         self.check_insns({})
 
     def test_frozen_list(self):
-        py.test.skip("implement me")
         lst = [5, 7, 9]
         def ll_function(x):
             mylist = hint(lst, deepfreeze=True)



More information about the Pypy-commit mailing list