[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