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

cfbolz at codespeak.net cfbolz at codespeak.net
Fri Feb 1 15:20:44 CET 2008


Author: cfbolz
Date: Fri Feb  1 15:20:43 2008
New Revision: 51184

Modified:
   pypy/branch/jit-refactoring/pypy/jit/rainbow/bytecode.py
   pypy/branch/jit-refactoring/pypy/jit/rainbow/test/test_interpreter.py
   pypy/branch/jit-refactoring/pypy/jit/rainbow/test/test_serializegraph.py
Log:
converting green things into red things works


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	Fri Feb  1 15:20:43 2008
@@ -18,16 +18,20 @@
     green consts are negative indexes
     """
 
-    def __init__(self, code, constants):
+    def __init__(self, code, constants, typekinds, redboxclasses):
         self.code = code
         self.constants = constants
+        self.typekinds = typekinds
+        self.redboxclasses = redboxclasses
 
     def _freeze_(self):
         return True
 
 SIGN_EXTEND2 = 1 << 15
 
-STOP = object()
+class STOP(object):
+    pass
+STOP = STOP()
 
 class JitInterpreter(object):
     def __init__(self):
@@ -58,6 +62,8 @@
             result = self.opcode_implementations[bytecode](self)
             if result is STOP:
                 return
+            else:
+                assert result is None
 
 
     # operation helper functions
@@ -95,7 +101,11 @@
 
     # operation implementations
     def opimpl_make_redbox(self):
-        XXX
+        genconst = self.get_greenarg()
+        typeindex = self.load_2byte()
+        kind = self.frame.bytecode.typekinds[typeindex]
+        redboxcls = self.frame.bytecode.redboxclasses[typeindex]
+        self.red_result(redboxcls(kind, genconst))
 
     def opimpl_goto(self):
         target = self.load_4byte()
@@ -123,7 +133,6 @@
         newstate = rtimeshift.leave_graph_yellow(self.queue)
         self.jitstate = newstate
         return STOP
-        return STOP # XXX wrong, of course
 
     def opimpl_make_new_redvars(self):
         # an opcode with a variable number of args
@@ -206,18 +215,29 @@
         self.seen_blocks = {}
         self.assembler = []
         self.constants = []
+        self.typekinds = []
+        self.redboxclasses = []
+        # mapping constant -> index in constants
         self.const_positions = {}
+        # mapping blocks to True
         self.seen_blocks = {}
-        self.additional_positions = {}
         self.redvar_positions = {}
+        # mapping block to the free red index
         self.free_red = {}
         self.greenvar_positions = {}
+        # mapping block to the free green index
         self.free_green = {}
+        # mapping TYPE to index
+        self.type_positions = {}
+
         self.graph = graph
         self.entrymap = flowmodel.mkentrymap(graph)
         self.make_bytecode_block(graph.startblock)
         assert self.current_block is None
-        return JitCode(assemble(self.interpreter, *self.assembler), self.constants)
+        return JitCode(assemble(self.interpreter, *self.assembler),
+                       self.constants,
+                       self.typekinds,
+                       self.redboxclasses)
 
     def make_bytecode_block(self, block, insert_goto=False):
         if block in self.seen_blocks:
@@ -330,6 +350,7 @@
         resultindex = self.register_redvar((arg, block))
         argindex = self.green_position(arg)
         self.emit(argindex)
+        self.emit(self.type_position(arg.concretetype))
         return resultindex
 
     def opcolor(self, op):
@@ -377,6 +398,15 @@
         self.constants.append(const)
         self.const_positions[const] = result
         return result
+
+    def type_position(self, TYPE):
+        if TYPE in self.type_positions:
+            return self.type_positions[TYPE]
+        self.typekinds.append(self.RGenOp.kindToken(TYPE))
+        self.redboxclasses.append(rvalue.ll_redboxcls(TYPE))
+        result = len(self.type_positions)
+        self.type_positions[TYPE] = result
+        return result
         
     def emit(self, stuff):
         assert stuff is not None

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  1 15:20:43 2008
@@ -139,6 +139,12 @@
         res = self.interpret(f, [1, 2])
         assert res == 3
 
+    def test_convert_const_to_red(self):
+        def f(x):
+            return x + 1
+        res = self.interpret(f, [2])
+        assert res == 3
+
     def test_green_switch(self):
         def f(green, x, y):
             green = hint(green, concrete=True)

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	Fri Feb  1 15:20:43 2008
@@ -63,18 +63,21 @@
                                         "make_new_greenvars", 0,
                                         "red_return", 0)
         assert len(jitcode.constants) == 0
+        assert len(jitcode.typekinds) == 0
 
     def test_constant(self):
         def f(x):
             return x + 1
         writer, jitcode = self.serialize(f, [int])
         assert jitcode.code == assemble(writer.interpreter,
-                                        "make_redbox", -1,
+                                        "make_redbox", -1, 0,
                                         "red_int_add", 0, 1,
                                         "make_new_redvars", 1, 2,
                                         "make_new_greenvars", 0,
                                         "red_return", 0)
         assert len(jitcode.constants) == 1
+        assert len(jitcode.typekinds) == 1
+        assert len(jitcode.redboxclasses) == 1
  
     def test_green_switch(self):
         def f(x, y, z):
@@ -98,6 +101,7 @@
                             )
         assert jitcode.code == expected
         assert len(jitcode.constants) == 0
+        assert len(jitcode.typekinds) == 0
 
     def test_green_switch2(self):
         def f(x, y, z):
@@ -129,7 +133,7 @@
                             )
         assert jitcode.code == expected
         assert len(jitcode.constants) == 0
-
+        assert len(jitcode.typekinds) == 0
 
 
 class TestLLType(AbstractSerializationTest):



More information about the Pypy-commit mailing list