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

cfbolz at codespeak.net cfbolz at codespeak.net
Sun Feb 3 16:04:33 CET 2008


Author: cfbolz
Date: Sun Feb  3 16:04:28 2008
New Revision: 51226

Modified:
   pypy/branch/jit-refactoring/pypy/jit/rainbow/bytecode.py
   pypy/branch/jit-refactoring/pypy/jit/rainbow/test/test_interpreter.py
Log:
support for gray calls


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	Sun Feb  3 16:04:28 2008
@@ -21,7 +21,8 @@
     """
 
     def __init__(self, name, code, constants, typekinds, redboxclasses,
-                 keydescs, called_bytecodes, num_mergepoints, is_portal):
+                 keydescs, called_bytecodes, num_mergepoints, graph_color,
+                 is_portal):
         self.name = name
         self.code = code
         self.constants = constants
@@ -30,6 +31,7 @@
         self.keydescs = keydescs
         self.called_bytecodes = called_bytecodes
         self.num_mergepoints = num_mergepoints
+        self.graph_color = graph_color
         self.is_portal = is_portal
 
     def _freeze_(self):
@@ -75,12 +77,23 @@
 
     def dispatch(self):
         is_portal = self.frame.bytecode.is_portal
+        graph_color = self.frame.bytecode.graph_color
         newjitstate = rtimeshift.dispatch_next(self.queue)
         resumepoint = rtimeshift.getresumepoint(newjitstate)
         self.newjitstate(newjitstate)
         if resumepoint == -1:
-            newjitstate = rtimeshift.leave_graph_red(
-                    self.queue, is_portal)
+            if graph_color == "red":
+                newjitstate = rtimeshift.leave_graph_red(
+                        self.queue, is_portal)
+            elif graph_color == "green":
+                XXX
+            elif graph_color == "gray":
+                assert not is_portal
+                newjitstate = rtimeshift.leave_graph_gray(
+                        self.queue)
+            else:
+                assert 0, "unknown graph color %s" % (color, )
+
             self.newjitstate(newjitstate)
             if newjitstate is None or is_portal:
                 return STOP
@@ -160,6 +173,10 @@
         rtimeshift.save_return(self.jitstate)
         return self.dispatch()
 
+    def opimpl_gray_return(self):
+        rtimeshift.save_return(self.jitstate)
+        return self.dispatch()
+
     def opimpl_green_return(self):
         XXX
 
@@ -299,6 +316,7 @@
         self.keydescs = []
         self.called_bytecodes = []
         self.num_mergepoints = 0
+        self.graph_color = self.graph_calling_color(graph)
         self.is_portal = is_portal
         # mapping constant -> index in constants
         self.const_positions = {}
@@ -330,6 +348,7 @@
                           self.keydescs,
                           self.called_bytecodes,
                           self.num_mergepoints,
+                          self.graph_color,
                           self.is_portal)
         if is_portal:
             self.finish_all_graphs()
@@ -369,10 +388,14 @@
         if block.exits == ():
             returnvar, = block.inputargs
             color = self.varcolor(returnvar)
-            assert color == "red" # XXX green return values not supported yet
-            index = self.serialize_oparg(color, returnvar)
-            self.emit("%s_return" % color)
-            self.emit(index)
+            if color == "red":
+                index = self.serialize_oparg(color, returnvar)
+                self.emit("red_return")
+                self.emit(index)
+            elif originalconcretetype(returnvar) == lltype.Void:
+                self.emit("gray_return")
+            else:
+                XXX
         elif len(block.exits) == 1:
             link, = block.exits
             self.insert_renaming(link)
@@ -593,7 +616,7 @@
         assert len(targets) == 1
         targetgraph, = targets.values()
         kind, exc = self.guess_call_kind(op)
-        if kind == "red":
+        if kind == "red" or kind == "gray":
             graphindex = self.graph_position(targetgraph)
             args = targetgraph.getargs()
             reds, greens = self.sort_by_color(op.args[1:], args)
@@ -606,7 +629,8 @@
             for index in result:
                 self.emit(index)
             self.emit(graphindex)
-            self.register_redvar(op.result)
+            if kind == "red":
+                self.register_redvar(op.result)
             self.emit("red_after_direct_call")
         else:
             XXX

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	Sun Feb  3 16:04:28 2008
@@ -454,7 +454,6 @@
                           'int_sub': 1, 'int_mul': 1})
 
     def test_void_call(self):
-        py.test.skip("calls are WIP")
         def ll_do_nothing(x):
             pass
         def ll_function(y):



More information about the Pypy-commit mailing list