[pypy-svn] r25048 - pypy/dist/pypy/jit
arigo at codespeak.net
arigo at codespeak.net
Mon Mar 27 19:49:09 CEST 2006
Author: arigo
Date: Mon Mar 27 19:48:58 2006
New Revision: 25048
Modified:
pypy/dist/pypy/jit/hintrtyper.py
pypy/dist/pypy/jit/rtimeshift.py
Log:
Some more light refactoring.
Modified: pypy/dist/pypy/jit/hintrtyper.py
==============================================================================
--- pypy/dist/pypy/jit/hintrtyper.py (original)
+++ pypy/dist/pypy/jit/hintrtyper.py Mon Mar 27 19:48:58 2006
@@ -119,19 +119,16 @@
return res
ts = self.timeshifter
- RESTYPE = originalconcretetype(hop.s_result)
v_argbox, c_fieldname = hop.inputargs(self.getredrepr(PTRTYPE),
green_void_repr)
- fielddesc = rtimeshift.make_fielddesc(PTRTYPE, c_fieldname.value)
+ fielddesc = rtimeshift.StructFieldDesc.make(PTRTYPE, c_fieldname.value)
c_fielddesc = inputconst(lltype.Void, fielddesc)
s_fielddesc = ts.rtyper.annotator.bookkeeper.immutablevalue(fielddesc)
- gv_resulttype = rgenop.constTYPE(RESTYPE)
- c_resulttype = hop.inputconst(rgenop.CONSTORVAR, gv_resulttype)
v_jitstate = hop.llops.getjitstate()
s_CONSTORVAR = annmodel.SomePtr(rgenop.CONSTORVAR)
return hop.llops.genmixlevelhelpercall(rtimeshift.ll_generate_getfield,
- [ts.s_JITState, s_fielddesc, ts.s_RedBox, s_CONSTORVAR],
- [v_jitstate, c_fielddesc, v_argbox, c_resulttype],
+ [ts.s_JITState, s_fielddesc, ts.s_RedBox],
+ [v_jitstate, c_fielddesc, v_argbox ],
ts.s_RedBox)
def translate_op_getarrayitem(self, hop):
@@ -142,19 +139,16 @@
return res
ts = self.timeshifter
- RESTYPE = originalconcretetype(hop.s_result)
v_argbox, v_index = hop.inputargs(self.getredrepr(PTRTYPE),
self.getredrepr(lltype.Signed))
- fielddesc = rtimeshift.make_fielddesc(PTRTYPE, '-')
+ fielddesc = rtimeshift.ArrayFieldDesc.make(PTRTYPE)
c_fielddesc = inputconst(lltype.Void, fielddesc)
s_fielddesc = ts.rtyper.annotator.bookkeeper.immutablevalue(fielddesc)
- gv_resulttype = rgenop.constTYPE(RESTYPE)
- c_resulttype = hop.inputconst(rgenop.CONSTORVAR, gv_resulttype)
v_jitstate = hop.llops.getjitstate()
s_CONSTORVAR = annmodel.SomePtr(rgenop.CONSTORVAR)
return hop.llops.genmixlevelhelpercall(rtimeshift.ll_generate_getarrayitem,
- [ts.s_JITState, s_fielddesc, ts.s_RedBox, ts.s_RedBox, s_CONSTORVAR],
- [v_jitstate, c_fielddesc, v_argbox, v_index, c_resulttype],
+ [ts.s_JITState, s_fielddesc, ts.s_RedBox, ts.s_RedBox],
+ [v_jitstate, c_fielddesc, v_argbox, v_index ],
ts.s_RedBox)
def translate_op_setfield(self, hop):
@@ -168,7 +162,7 @@
green_void_repr,
self.getredrepr(VALUETYPE)
)
- fielddesc = rtimeshift.make_fielddesc(PTRTYPE, c_fieldname.value)
+ fielddesc = rtimeshift.StructFieldDesc.make(PTRTYPE, c_fieldname.value)
c_fielddesc = inputconst(lltype.Void, fielddesc)
s_fielddesc = ts.rtyper.annotator.bookkeeper.immutablevalue(fielddesc)
v_jitstate = hop.llops.getjitstate()
@@ -184,19 +178,16 @@
# non virtual case
ts = self.timeshifter
PTRTYPE = originalconcretetype(hop.args_s[0])
- RESTYPE = originalconcretetype(hop.s_result)
v_argbox, c_fieldname = hop.inputargs(self.getredrepr(PTRTYPE),
green_void_repr)
- fielddesc = rtimeshift.make_fielddesc(PTRTYPE, c_fieldname.value)
+ fielddesc = rtimeshift.StructFieldDesc.make(PTRTYPE, c_fieldname.value)
c_fielddesc = inputconst(lltype.Void, fielddesc)
s_fielddesc = ts.rtyper.annotator.bookkeeper.immutablevalue(fielddesc)
- gv_resulttype = rgenop.constTYPE(RESTYPE)
- c_resulttype = hop.inputconst(rgenop.CONSTORVAR, gv_resulttype)
v_jitstate = hop.llops.getjitstate()
s_CONSTORVAR = annmodel.SomePtr(rgenop.CONSTORVAR)
return hop.llops.genmixlevelhelpercall(rtimeshift.ll_generate_getsubstruct,
- [ts.s_JITState, s_fielddesc, ts.s_RedBox, s_CONSTORVAR],
- [v_jitstate, c_fielddesc, v_argbox, c_resulttype],
+ [ts.s_JITState, s_fielddesc, ts.s_RedBox],
+ [v_jitstate, c_fielddesc, v_argbox ],
ts.s_RedBox)
@@ -344,7 +335,7 @@
def create(self, hop):
if self.typedesc is None:
T = self.original_concretetype.TO
- self.typedesc = rtimeshift.ContainerTypeDesc(T)
+ self.typedesc = rtimeshift.ContainerTypeDesc.make(T)
ts = self.timeshifter
return hop.llops.genmixlevelhelpercall(self.typedesc.ll_factory,
[], [], ts.s_RedBox)
Modified: pypy/dist/pypy/jit/rtimeshift.py
==============================================================================
--- pypy/dist/pypy/jit/rtimeshift.py (original)
+++ pypy/dist/pypy/jit/rtimeshift.py Mon Mar 27 19:48:58 2006
@@ -1,4 +1,4 @@
-import operator
+import operator, weakref
from pypy.rpython.lltypesystem import lltype, lloperation, llmemory
from pypy.rpython import rgenop
@@ -33,12 +33,12 @@
return False
# generic implementation of some operations
- def op_getfield(self, jitstate, fielddesc, gv_resulttype):
+ def op_getfield(self, jitstate, fielddesc):
op_args = lltype.malloc(VARLIST.TO, 2)
op_args[0] = self.getgenvar(jitstate)
op_args[1] = fielddesc.gv_fieldname
genvar = rgenop.genop(jitstate.curblock, 'getfield', op_args,
- gv_resulttype)
+ fielddesc.gv_resulttype)
return VarRedBox(genvar)
def op_setfield(self, jitstate, fielddesc, valuebox):
@@ -91,7 +91,14 @@
"A red box that contains (for now) a virtual Struct."
def __init__(self, typedesc):
- self.content_boxes = typedesc.content_boxes[:]
+ # duplicate the list 'content_boxes',
+ # and also replace the nested VirtualRedBox
+ clist = []
+ for box in typedesc.content_boxes:
+ if isinstance(box, VirtualRedBox):
+ box = VirtualRedBox(box.typedesc)
+ clist.append(box)
+ self.content_boxes = clist
self.typedesc = typedesc
self.genvar = rgenop.nullvar
@@ -109,9 +116,9 @@
boxes[i])
return self.genvar
- def op_getfield(self, jitstate, fielddesc, gv_returntype):
+ def op_getfield(self, jitstate, fielddesc):
if self.content_boxes is None:
- return RedBox.op_getfield(self, jitstate, fielddesc, gv_returntype)
+ return RedBox.op_getfield(self, jitstate, fielddesc)
else:
return self.content_boxes[fielddesc.fieldindex]
@@ -256,22 +263,36 @@
return VarRedBox(genvar)
class ContainerTypeDesc(object):
+ _type_cache = weakref.WeakKeyDictionary()
+
def __init__(self, TYPE):
self.TYPE = TYPE
self.PTRTYPE = lltype.Ptr(TYPE)
self.gv_type = rgenop.constTYPE(self.TYPE)
self.gv_ptrtype = rgenop.constTYPE(self.PTRTYPE)
# XXX only for Struct so far
- self.fielddescs = [make_fielddesc(self.PTRTYPE, name)
+ self.fielddescs = [StructFieldDesc.make(self.PTRTYPE, name)
for name in TYPE._names]
defls = []
for name in TYPE._names:
FIELDTYPE = TYPE._flds[name]
- defaultvalue = FIELDTYPE._defl()
- defaultbox = ConstRedBox.ll_fromvalue(defaultvalue)
+ if isinstance(FIELDTYPE, lltype.ContainerType):
+ subtypedesc = ContainerTypeDesc.make(FIELDTYPE)
+ defaultbox = VirtualRedBox(subtypedesc)
+ else:
+ defaultvalue = FIELDTYPE._defl()
+ defaultbox = ConstRedBox.ll_fromvalue(defaultvalue)
defls.append(defaultbox)
self.content_boxes = defls
+ def make(T):
+ try:
+ return ContainerTypeDesc._type_cache[T]
+ except KeyError:
+ desc = ContainerTypeDesc._type_cache[T] = ContainerTypeDesc(T)
+ return desc
+ make = staticmethod(make)
+
def ll_factory(self):
return VirtualRedBox(self)
@@ -281,39 +302,57 @@
def compact_repr(self): # goes in ll helper names
return "Desc_%s" % (self.TYPE._short_name(),)
-class FieldDesc(object): # xxx should we use offsets instead
- def __init__(self, PTRTYPE, fieldname):
+class FieldDesc(object):
+ _fielddesc_cache = weakref.WeakKeyDictionary()
+
+ def __init__(self, PTRTYPE, RESTYPE):
self.PTRTYPE = PTRTYPE
+ if isinstance(RESTYPE, lltype.ContainerType):
+ RESTYPE = lltype.Ptr(RESTYPE)
+ self.RESTYPE = RESTYPE
+ self.gv_resulttype = rgenop.constTYPE(RESTYPE)
self.immutable = PTRTYPE.TO._hints.get('immutable', False)
- self.fieldname = fieldname
- self.gv_fieldname = rgenop.constFieldName(fieldname)
- if isinstance(PTRTYPE.TO, lltype.Struct):
- try:
- self.fieldindex = operator.indexOf(PTRTYPE.TO._names, fieldname)
- except ValueError:
- raise ValueError("field not found: %r in %r" % (fieldname,
- PTRTYPE.TO))
def _freeze_(self):
return True
+ def make(cls, PTRTYPE, *args):
+ T = PTRTYPE.TO
+ cache = FieldDesc._fielddesc_cache.setdefault(T, {})
+ try:
+ return cache[args]
+ except KeyError:
+ fdesc = cache[args] = cls(PTRTYPE, *args)
+ return fdesc
+ make = classmethod(make)
+
+class StructFieldDesc(FieldDesc):
+ def __init__(self, PTRTYPE, fieldname):
+ assert isinstance(PTRTYPE.TO, lltype.Struct)
+ RES1 = getattr(PTRTYPE.TO, fieldname)
+ FieldDesc.__init__(self, PTRTYPE, RES1)
+ self.fieldname = fieldname
+ self.gv_fieldname = rgenop.constFieldName(fieldname)
+ self.fieldindex = operator.indexOf(PTRTYPE.TO._names, fieldname)
+ if isinstance(RES1, lltype.ContainerType):
+ # inlined substructure
+ self.inlined_typedesc = ContainerTypeDesc.make(RES1)
+ else:
+ self.inlined_typedesc = None
+
def compact_repr(self): # goes in ll helper names
return "Fld_%s_in_%s" % (self.fieldname, self.PTRTYPE._short_name())
-_fielddesc_cache = {}
-
-def make_fielddesc(PTRTYPE, fieldname):
- try:
- return _fielddesc_cache[PTRTYPE, fieldname]
- except KeyError:
- fdesc = _fielddesc_cache[PTRTYPE, fieldname] = FieldDesc(PTRTYPE, fieldname)
- return fdesc
+class ArrayFieldDesc(FieldDesc):
+ def __init__(self, PTRTYPE):
+ assert isinstance(PTRTYPE.TO, lltype.Array)
+ FieldDesc.__init__(self, PTRTYPE, PTRTYPE.TO.OF)
-def ll_generate_getfield(jitstate, fielddesc, argbox, gv_resulttype):
+def ll_generate_getfield(jitstate, fielddesc, argbox):
if fielddesc.immutable and isinstance(argbox, ConstRedBox):
res = getattr(argbox.ll_getvalue(fielddesc.PTRTYPE), fielddesc.fieldname)
return ConstRedBox.ll_fromvalue(res)
- return argbox.op_getfield(jitstate, fielddesc, gv_resulttype)
+ return argbox.op_getfield(jitstate, fielddesc)
gv_Void = rgenop.constTYPE(lltype.Void)
@@ -321,7 +360,7 @@
destbox.op_setfield(jitstate, fielddesc, valuebox)
-def ll_generate_getsubstruct(jitstate, fielddesc, argbox, gv_resulttype):
+def ll_generate_getsubstruct(jitstate, fielddesc, argbox):
if isinstance(argbox, ConstRedBox):
res = getattr(argbox.ll_getvalue(fielddesc.PTRTYPE), fielddesc.fieldname)
return ConstRedBox.ll_fromvalue(res)
@@ -329,12 +368,11 @@
op_args[0] = argbox.getgenvar(jitstate)
op_args[1] = fielddesc.gv_fieldname
genvar = rgenop.genop(jitstate.curblock, 'getsubstruct', op_args,
- gv_resulttype)
+ fielddesc.gv_resulttype)
return VarRedBox(genvar)
-def ll_generate_getarrayitem(jitstate, fielddesc, argbox,
- indexbox, gv_resulttype):
+def ll_generate_getarrayitem(jitstate, fielddesc, argbox, indexbox):
if (fielddesc.immutable and
isinstance(argbox, ConstRedBox) and isinstance(indexbox, ConstRedBox)):
res = argbox.ll_getvalue(fielddesc.PTRTYPE)[indexbox.ll_getvalue(lltype.Signed)]
@@ -343,7 +381,7 @@
op_args[0] = argbox.getgenvar(jitstate)
op_args[1] = indexbox.getgenvar(jitstate)
genvar = rgenop.genop(jitstate.curblock, 'getarrayitem', op_args,
- gv_resulttype)
+ fielddesc.gv_resulttype)
return VarRedBox(genvar)
##def ll_generate_malloc(jitstate, gv_type, gv_resulttype):
More information about the Pypy-commit
mailing list