[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