[pypy-svn] r51219 - pypy/branch/jit-refactoring/pypy/jit/rainbow/test

cfbolz at codespeak.net cfbolz at codespeak.net
Sat Feb 2 18:52:04 CET 2008


Author: cfbolz
Date: Sat Feb  2 18:52:03 2008
New Revision: 51219

Modified:
   pypy/branch/jit-refactoring/pypy/jit/rainbow/test/test_interpreter.py
Log:
cache the bytecode for a function


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 18:52:03 2008
@@ -4,7 +4,7 @@
 from pypy.jit.hintannotator.model import SomeLLAbstractConstant, OriginFlags
 from pypy.jit.hintannotator.model import originalconcretetype
 from pypy.jit.rainbow.bytecode import BytecodeWriter, label, tlabel, assemble
-from pypy.jit.codegen.llgraph.rgenop import RGenOp
+from pypy.jit.codegen.llgraph.rgenop import RGenOp as LLRGenOp
 from pypy.jit.rainbow.test.test_serializegraph import AbstractSerializationTest
 from pypy.jit.rainbow import bytecode
 from pypy.jit.timeshifter import rtimeshift, exception, rvalue
@@ -32,7 +32,31 @@
 
 class AbstractInterpretationTest(object):
 
+    RGenOp = LLRGenOp
+
+    def setup_class(cls):
+        from pypy.jit.timeshifter.test.conftest import option
+        cls.on_llgraph = cls.RGenOp is LLRGenOp
+        cls._cache = {}
+        cls._cache_order = []
+
+    def teardown_class(cls):
+        del cls._cache
+        del cls._cache_order
+
     def serialize(self, func, values, backendoptimize=False):
+        key = func, backendoptimize
+        try:
+            cache, argtypes = self._cache[key]
+        except KeyError:
+            pass
+        else:
+            self.__dict__.update(cache)
+            assert argtypes == getargtypes(self.rtyper.annotator, values)
+            return self.writer, self.jitcode, self.argcolors
+
+        if len(self._cache_order) >= 3:
+            del self._cache[self._cache_order.pop(0)]
         # build the normal ll graphs for ll_function
         t = TranslationContext()
         a = t.buildannotator()
@@ -58,12 +82,31 @@
             t.view()
         graph2 = graphof(t, func)
         self.graph = graph2
-        writer = BytecodeWriter(t, hannotator, RGenOp)
+        writer = BytecodeWriter(t, hannotator, self.RGenOp)
         jitcode = writer.make_bytecode(graph2)
         argcolors = []
+
+        # make residual functype
+        ha = self.hannotator
+        RESTYPE = originalconcretetype(hannotator.binding(graph2.getreturnvar()))
+        ARGS = []
+        for var in graph2.getargs():
+            # XXX ignoring virtualizables for now
+            binding = hannotator.binding(var)
+            if not binding.is_green():
+                ARGS.append(originalconcretetype(binding))
+        self.RESIDUAL_FUNCTYPE = lltype.FuncType(ARGS, RESTYPE)
+
         for i, ll_val in enumerate(values):
             color = writer.varcolor(graph2.startblock.inputargs[i])
             argcolors.append(color)
+        self.writer = writer
+        self.jitcode = jitcode
+        self.argcolors = argcolors
+
+        cache = self.__dict__.copy()
+        self._cache[key] = cache, getargtypes(rtyper.annotator, values)
+        self._cache_order.append(key)
         return writer, jitcode, argcolors
 
     def interpret(self, ll_function, values, opt_consts=[], *args, **kwds):
@@ -74,20 +117,8 @@
                                          rtyper=writer.translator.annotator.base_translator.rtyper)
         edesc = exception.ExceptionDesc(hrtyper, False)
         rgenop = writer.RGenOp()
-        # make residual functype
-        FUNC = lltype.FuncType([lltype.Signed], lltype.Signed)
-        ha = self.hannotator
-        RESTYPE = originalconcretetype(self.hannotator.binding(self.graph.getreturnvar()))
-        ARGS = []
-        for var in self.graph.getargs():
-            # XXX ignoring virtualizables for now
-            binding = self.hannotator.binding(var)
-            if not binding.is_green():
-                ARGS.append(originalconcretetype(binding))
-        FUNC = lltype.FuncType(ARGS, RESTYPE)
-        sigtoken = rgenop.sigToken(FUNC)
+        sigtoken = rgenop.sigToken(self.RESIDUAL_FUNCTYPE)
         builder, gv_generated, inputargs_gv = rgenop.newgraph(sigtoken, "generated")
-        print builder, builder.rgenop, rgenop
         builder.start_writing()
         jitstate = rtimeshift.JITState(builder, None,
                                        edesc.null_exc_type_box,
@@ -122,7 +153,7 @@
         if jitstate is not None:
             ll_finish_jitstate(jitstate, edesc, sigtoken)
         builder.end()
-        generated = gv_generated.revealconst(lltype.Ptr(FUNC))
+        generated = gv_generated.revealconst(lltype.Ptr(self.RESIDUAL_FUNCTYPE))
         graph = generated._obj.graph
         self.residual_graph = graph
         if conftest.option.view:



More information about the Pypy-commit mailing list