[pypy-svn] r25228 - pypy/branch/jit-timeshifter-refactoring/timeshifter
pedronis at codespeak.net
pedronis at codespeak.net
Sun Apr 2 17:53:49 CEST 2006
Author: pedronis
Date: Sun Apr 2 17:53:47 2006
New Revision: 25228
Modified:
pypy/branch/jit-timeshifter-refactoring/timeshifter/rcontainer.py
pypy/branch/jit-timeshifter-refactoring/timeshifter/rtimeshift.py
pypy/branch/jit-timeshifter-refactoring/timeshifter/rtyper.py
Log:
(arre, pedronis)
fixed getfield/getsubstruct at least for the non-virtual case. plus minor typo fixing.
Modified: pypy/branch/jit-timeshifter-refactoring/timeshifter/rcontainer.py
==============================================================================
--- pypy/branch/jit-timeshifter-refactoring/timeshifter/rcontainer.py (original)
+++ pypy/branch/jit-timeshifter-refactoring/timeshifter/rcontainer.py Sun Apr 2 17:53:47 2006
@@ -1,3 +1,6 @@
+import operator
+from pypy.rpython.lltypesystem import lltype
+from pypy.rpython import rgenop
from pypy.jit.timeshifter import rvalue
@@ -40,20 +43,53 @@
substructdesc = StructTypeDesc(FIELDTYPE)
for subfielddesc in substructdesc.fielddescs:
dottedname = '%s.%s' % (name, subfielddesc.fieldname)
- index = len(fielddesc)
- fielddescs.append(StructFieldDesc(self.TYPE, dottedname,
+ index = len(fielddescs)
+ fielddescs.append(StructFieldDesc(self.PTRTYPE, dottedname,
index))
else:
- index = len(fielddesc)
- fielddesc.append(StructFieldDesc(self.TYPE, name, index))
+ index = len(fielddescs)
+ fielddescs.append(StructFieldDesc(self.PTRTYPE, name, index))
self.fielddescs = fielddescs
+ def getfielddesc(self, name):
+ index = operator.indexOf(self.TYPE._names, name)
+ return self.fielddescs[index]
+
def _freeze_(self):
return True
def compact_repr(self): # goes in ll helper names
return "Desc_%s" % (self.TYPE._short_name(),)
+# XXX basic field descs for now
+class FieldDesc(object):
+ __metaclass__ = cachedtype
+
+ 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.redboxcls = rvalue.ll_redboxcls(RESTYPE)
+ self.immutable = PTRTYPE.TO._hints.get('immutable', False)
+
+ def _freeze_(self):
+ return True
+
+class NamedFieldDesc(FieldDesc):
+
+ def __init__(self, PTRTYPE, name):
+ FieldDesc.__init__(self, PTRTYPE, getattr(PTRTYPE.TO, name))
+ self.fieldname = name
+ self.gv_fieldname = rgenop.constFieldName(name)
+
+class ArrayFieldDesc(FieldDesc):
+ def __init__(self, PTRTYPE):
+ assert isinstance(PTRTYPE.TO, lltype.Array)
+ FieldDesc.__init__(self, PTRTYPE, PTRTYPE.TO.OF)
+
+# ____________________________________________________________
class StructFieldDesc(object):
__metaclass__ = cachedtype
@@ -67,7 +103,7 @@
assert not isinstance(RES1, lltype.ContainerType)
self.PTRTYPE = PTRTYPE
self.RESTYPE = RES1
- self.gv_resulttype = rgenop.constTYPE(RESTYPE)
+ self.gv_resulttype = rgenop.constTYPE(RES1)
self.fieldname = fieldname
self.fieldname_gv = [rgenop.constFieldName(component)
for component in fieldname.split('.')]
Modified: pypy/branch/jit-timeshifter-refactoring/timeshifter/rtimeshift.py
==============================================================================
--- pypy/branch/jit-timeshifter-refactoring/timeshifter/rtimeshift.py (original)
+++ pypy/branch/jit-timeshifter-refactoring/timeshifter/rtimeshift.py Sun Apr 2 17:53:47 2006
@@ -515,152 +515,152 @@
opdesc.gv_RESULT)
return opdesc.redboxcls(opdesc.gv_RESULT, genvar)
-class StructTypeDesc(object):
- _type_cache = weakref.WeakKeyDictionary()
+## class StructTypeDesc(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)
-
- def setup(self):
- self.fielddescs = [StructFieldDesc.make(self.PTRTYPE, name)
- for name in self.TYPE._names]
- defls = []
- for desc in self.fielddescs:
- if desc.inlined_typedesc is not None:
- defaultbox = None
- else:
- defaultvalue = desc.RESTYPE._defl()
- defaultbox = rvalue.ll_fromvalue(defaultvalue)
- defls.append(defaultbox)
- self.default_boxes = defls
-
- def build_content_boxes(self, parentbox):
- # make a'content_boxes' list based on the typedesc's default_boxes,
- # building nested SubVirtualRedBoxes for inlined substructs
- clist = []
- for i in range(len(self.fielddescs)):
- fielddesc = self.fielddescs[i]
- if fielddesc.inlined_typedesc:
- box = SubVirtualRedBox(parentbox, fielddesc)
- else:
- box = self.default_boxes[i]
- clist.append(box)
- return clist
-
- def compare_content_boxes(self, content_boxes_1, content_boxes_2):
- for i in range(len(self.fielddescs)):
- fielddesc = self.fielddescs[i]
- if fielddesc.inlined_typedesc:
- box1 = content_boxes_1[i]
- box2 = content_boxes_2[i]
- assert isinstance(box1, BigRedBox)
- assert isinstance(box2, BigRedBox)
- if not fielddesc.inlined_typedesc.compare_content_boxes(
- box1.content_boxes, box2.content_boxes):
- return False
- else:
- return True
-
- def materialize_content(self, jitstate, gv, boxes):
- for i in range(len(boxes)):
- smallbox = boxes[i]
- fielddesc = self.fielddescs[i]
- if fielddesc.inlined_typedesc:
- op_args = lltype.malloc(VARLIST.TO, 2)
- op_args[0] = gv
- op_args[1] = fielddesc.gv_fieldname
- gv_sub = rgenop.genop(jitstate.curblock, 'getsubstruct',
- op_args, fielddesc.gv_resulttype)
- assert isinstance(smallbox, SubVirtualRedBox)
- subboxes = smallbox.content_boxes
- smallbox.content_boxes = None
- fielddesc.inlined_typedesc.materialize_content(jitstate,
- gv_sub,
- subboxes)
- else:
- op_args = lltype.malloc(VARLIST.TO, 3)
- op_args[0] = gv
- op_args[1] = fielddesc.gv_fieldname
- op_args[2] = smallbox.getgenvar(jitstate)
- rgenop.genop(jitstate.curblock, 'setfield', op_args,
- gv_Void)
-
- def make(T):
- try:
- return StructTypeDesc._type_cache[T]
- except KeyError:
- desc = StructTypeDesc._type_cache[T] = StructTypeDesc(T)
- desc.setup()
- return desc
- make = staticmethod(make)
-
- def ll_factory(self):
- return VirtualRedBox(self)
-
- def _freeze_(self):
- return True
-
- def compact_repr(self): # goes in ll helper names
- return "Desc_%s" % (self.TYPE._short_name(),)
-
-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.redboxcls = rvalue.ll_redboxcls(RESTYPE)
- self.immutable = PTRTYPE.TO._hints.get('immutable', False)
-
- 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)
- fdesc.setup()
- 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.Struct):
- # inlined substructure
- self.inlined_typedesc = StructTypeDesc.make(RES1)
-## elif isinstance(RES1, lltype.Array):
-## # inlined array XXX in-progress
-## self.inlined_typedesc = ArrayTypeDesc.make(RES1)
- else:
- self.inlined_typedesc = None
-
- def setup(self):
- self.parenttypedesc = StructTypeDesc.make(self.PTRTYPE.TO)
-
- def compact_repr(self): # goes in ll helper names
- return "Fld_%s_in_%s" % (self.fieldname, self.PTRTYPE._short_name())
-
-class ArrayFieldDesc(FieldDesc):
- def __init__(self, PTRTYPE):
- assert isinstance(PTRTYPE.TO, lltype.Array)
- FieldDesc.__init__(self, PTRTYPE, PTRTYPE.TO.OF)
- def setup(self):
- pass
+## 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)
+
+## def setup(self):
+## self.fielddescs = [StructFieldDesc.make(self.PTRTYPE, name)
+## for name in self.TYPE._names]
+## defls = []
+## for desc in self.fielddescs:
+## if desc.inlined_typedesc is not None:
+## defaultbox = None
+## else:
+## defaultvalue = desc.RESTYPE._defl()
+## defaultbox = rvalue.ll_fromvalue(defaultvalue)
+## defls.append(defaultbox)
+## self.default_boxes = defls
+
+## def build_content_boxes(self, parentbox):
+## # make a'content_boxes' list based on the typedesc's default_boxes,
+## # building nested SubVirtualRedBoxes for inlined substructs
+## clist = []
+## for i in range(len(self.fielddescs)):
+## fielddesc = self.fielddescs[i]
+## if fielddesc.inlined_typedesc:
+## box = SubVirtualRedBox(parentbox, fielddesc)
+## else:
+## box = self.default_boxes[i]
+## clist.append(box)
+## return clist
+
+## def compare_content_boxes(self, content_boxes_1, content_boxes_2):
+## for i in range(len(self.fielddescs)):
+## fielddesc = self.fielddescs[i]
+## if fielddesc.inlined_typedesc:
+## box1 = content_boxes_1[i]
+## box2 = content_boxes_2[i]
+## assert isinstance(box1, BigRedBox)
+## assert isinstance(box2, BigRedBox)
+## if not fielddesc.inlined_typedesc.compare_content_boxes(
+## box1.content_boxes, box2.content_boxes):
+## return False
+## else:
+## return True
+
+## def materialize_content(self, jitstate, gv, boxes):
+## for i in range(len(boxes)):
+## smallbox = boxes[i]
+## fielddesc = self.fielddescs[i]
+## if fielddesc.inlined_typedesc:
+## op_args = lltype.malloc(VARLIST.TO, 2)
+## op_args[0] = gv
+## op_args[1] = fielddesc.gv_fieldname
+## gv_sub = rgenop.genop(jitstate.curblock, 'getsubstruct',
+## op_args, fielddesc.gv_resulttype)
+## assert isinstance(smallbox, SubVirtualRedBox)
+## subboxes = smallbox.content_boxes
+## smallbox.content_boxes = None
+## fielddesc.inlined_typedesc.materialize_content(jitstate,
+## gv_sub,
+## subboxes)
+## else:
+## op_args = lltype.malloc(VARLIST.TO, 3)
+## op_args[0] = gv
+## op_args[1] = fielddesc.gv_fieldname
+## op_args[2] = smallbox.getgenvar(jitstate)
+## rgenop.genop(jitstate.curblock, 'setfield', op_args,
+## gv_Void)
+
+## def make(T):
+## try:
+## return StructTypeDesc._type_cache[T]
+## except KeyError:
+## desc = StructTypeDesc._type_cache[T] = StructTypeDesc(T)
+## desc.setup()
+## return desc
+## make = staticmethod(make)
+
+## def ll_factory(self):
+## return VirtualRedBox(self)
+
+## def _freeze_(self):
+## return True
+
+## def compact_repr(self): # goes in ll helper names
+## return "Desc_%s" % (self.TYPE._short_name(),)
+
+## 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.redboxcls = rvalue.ll_redboxcls(RESTYPE)
+## self.immutable = PTRTYPE.TO._hints.get('immutable', False)
+
+## 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)
+## fdesc.setup()
+## 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.Struct):
+## # inlined substructure
+## self.inlined_typedesc = StructTypeDesc.make(RES1)
+## ## elif isinstance(RES1, lltype.Array):
+## ## # inlined array XXX in-progress
+## ## self.inlined_typedesc = ArrayTypeDesc.make(RES1)
+## else:
+## self.inlined_typedesc = None
+
+## def setup(self):
+## self.parenttypedesc = StructTypeDesc.make(self.PTRTYPE.TO)
+
+## def compact_repr(self): # goes in ll helper names
+## return "Fld_%s_in_%s" % (self.fieldname, self.PTRTYPE._short_name())
+
+## class ArrayFieldDesc(FieldDesc):
+## def __init__(self, PTRTYPE):
+## assert isinstance(PTRTYPE.TO, lltype.Array)
+## FieldDesc.__init__(self, PTRTYPE, PTRTYPE.TO.OF)
+## def setup(self):
+## pass
def ll_generate_getfield(jitstate, fielddesc, argbox):
if fielddesc.immutable and argbox.is_constant():
@@ -671,7 +671,7 @@
if argbox.content is None:
op_args = lltype.malloc(VARLIST.TO, 2)
op_args[0] = argbox.getgenvar(jitstate)
- op_args[1] = fielddesc.gv_fieldname
+ op_args[1] = fielddesc.fieldname_gv[-1]
genvar = rgenop.genop(jitstate.curblock, 'getfield', op_args,
fielddesc.gv_resulttype)
return fielddesc.redboxcls(fielddesc.gv_resulttype, genvar)
@@ -689,7 +689,16 @@
res = getattr(rvalue.ll_getvalue(argbox, fielddesc.PTRTYPE),
fielddesc.fieldname)
return rvalue.ll_fromvalue(res)
- return argbox.op_getsubstruct(jitstate, fielddesc)
+ assert isinstance(argbox, rvalue.PtrRedBox)
+ if argbox.content is None:
+ op_args = lltype.malloc(VARLIST.TO, 2)
+ op_args[0] = argbox.getgenvar(jitstate)
+ op_args[1] = fielddesc.gv_fieldname
+ genvar = rgenop.genop(jitstate.curblock, 'getsubstruct', op_args,
+ fielddesc.gv_resulttype)
+ return fielddesc.redboxcls(fielddesc.gv_resulttype, genvar)
+ else:
+ return argbox.content.op_getsubstruct(jitstate, fielddesc)
def ll_generate_getarrayitem(jitstate, fielddesc, argbox, indexbox):
Modified: pypy/branch/jit-timeshifter-refactoring/timeshifter/rtyper.py
==============================================================================
--- pypy/branch/jit-timeshifter-refactoring/timeshifter/rtyper.py (original)
+++ pypy/branch/jit-timeshifter-refactoring/timeshifter/rtyper.py Sun Apr 2 17:53:47 2006
@@ -10,7 +10,7 @@
from pypy.rpython import rgenop
from pypy.jit.hintannotator import model as hintmodel
from pypy.jit.hintannotator import container as hintcontainer
-from pypy.jit.timeshifter import rtimeshift, rvalue
+from pypy.jit.timeshifter import rtimeshift, rvalue, rcontainer
class HintTypeSystem(TypeSystem):
name = "hinttypesystem"
@@ -122,7 +122,7 @@
ts = self.timeshifter
v_argbox, c_fieldname = hop.inputargs(self.getredrepr(PTRTYPE),
green_void_repr)
- fielddesc = rtimeshift.StructFieldDesc.make(PTRTYPE, c_fieldname.value)
+ fielddesc = rcontainer.StructTypeDesc(PTRTYPE.TO).getfielddesc(c_fieldname.value)
c_fielddesc = inputconst(lltype.Void, fielddesc)
s_fielddesc = ts.rtyper.annotator.bookkeeper.immutablevalue(fielddesc)
v_jitstate = hop.llops.getjitstate()
@@ -142,7 +142,7 @@
ts = self.timeshifter
v_argbox, v_index = hop.inputargs(self.getredrepr(PTRTYPE),
self.getredrepr(lltype.Signed))
- fielddesc = rtimeshift.ArrayFieldDesc.make(PTRTYPE)
+ fielddesc = rcontainer.ArrayFieldDesc(PTRTYPE)
c_fielddesc = inputconst(lltype.Void, fielddesc)
s_fielddesc = ts.rtyper.annotator.bookkeeper.immutablevalue(fielddesc)
v_jitstate = hop.llops.getjitstate()
@@ -163,7 +163,7 @@
green_void_repr,
self.getredrepr(VALUETYPE)
)
- fielddesc = rtimeshift.StructFieldDesc.make(PTRTYPE, c_fieldname.value)
+ fielddesc = rcontainer.StructTypeDesc(PTRTYPE.TO).getfielddesc(c_fieldname.value)
c_fielddesc = inputconst(lltype.Void, fielddesc)
s_fielddesc = ts.rtyper.annotator.bookkeeper.immutablevalue(fielddesc)
v_jitstate = hop.llops.getjitstate()
@@ -181,7 +181,7 @@
PTRTYPE = originalconcretetype(hop.args_s[0])
v_argbox, c_fieldname = hop.inputargs(self.getredrepr(PTRTYPE),
green_void_repr)
- fielddesc = rtimeshift.StructFieldDesc.make(PTRTYPE, c_fieldname.value)
+ fielddesc = rcontainer.NamedFieldDesc(PTRTYPE, c_fieldname.value) # XXX
c_fielddesc = inputconst(lltype.Void, fielddesc)
s_fielddesc = ts.rtyper.annotator.bookkeeper.immutablevalue(fielddesc)
v_jitstate = hop.llops.getjitstate()
More information about the Pypy-commit
mailing list