[pypy-svn] r34801 - pypy/dist/pypy/jit/timeshifter

pedronis at codespeak.net pedronis at codespeak.net
Mon Nov 20 18:25:08 CET 2006


Author: pedronis
Date: Mon Nov 20 18:24:59 2006
New Revision: 34801

Modified:
   pypy/dist/pypy/jit/timeshifter/rcontainer.py
Log:
(arre, arigo around, pedronis)

some support for immutable noidentity structures to fall back to compile time constants.



Modified: pypy/dist/pypy/jit/timeshifter/rcontainer.py
==============================================================================
--- pypy/dist/pypy/jit/timeshifter/rcontainer.py	(original)
+++ pypy/dist/pypy/jit/timeshifter/rcontainer.py	Mon Nov 20 18:24:59 2006
@@ -2,6 +2,10 @@
 from pypy.rpython.lltypesystem import lltype
 from pypy.rpython.annlowlevel import cachedtype
 from pypy.jit.timeshifter import rvalue
+from pypy.rlib.unroll import unrolling_iterable
+
+from pypy.rpython.lltypesystem import lloperation
+debug_print = lloperation.llop.debug_print
 
 class AbstractContainer(object):
     __slots__ = []
@@ -23,6 +27,7 @@
     arrayfielddesc = None
     alloctoken = None
     varsizealloctoken = None
+    materialize = None
     
     def __init__(self, RGenOp, TYPE):
         self.TYPE = TYPE
@@ -58,6 +63,22 @@
         self.fielddesc_by_name = fielddesc_by_name
         self.innermostdesc = innermostdesc
 
+        self.immutable = TYPE._hints.get('immutable', False)
+        self.noidentity = TYPE._hints.get('noidentity', False)
+
+        if self.immutable and self.noidentity:
+            descs = unrolling_iterable(fielddescs)
+            def materialize(rgenop, boxes):
+                s = lltype.malloc(TYPE)
+                i = 0
+                for desc in descs:
+                    v = rvalue.ll_getvalue(boxes[i], desc.RESTYPE)
+                    setattr(s, desc.fieldname, v)
+                    i = i + 1
+                return rgenop.genconst(s)
+
+            self.materialize = materialize
+                
     def getfielddesc(self, name):
         return self.fielddesc_by_name[name]
 
@@ -208,6 +229,16 @@
         typedesc = self.typedesc
         boxes = self.content_boxes
         self.content_boxes = None
+        if typedesc.materialize is not None:
+            for box in boxes:
+                if box is None or not box.is_constant():
+                    break
+            else:
+                gv = typedesc.materialize(builder.rgenop, boxes)
+                self.ownbox.genvar = gv
+                self.ownbox.content = None
+                return
+        debug_print(lltype.Void, "FORCE CONTAINER")
         genvar = builder.genop_malloc_fixedsize(typedesc.alloctoken)
         # force the box pointing to this VirtualStruct
         self.ownbox.genvar = genvar



More information about the Pypy-commit mailing list