[pypy-svn] r25263 - in pypy/branch/jit-timeshifter-refactoring/timeshifter: . test

arigo at codespeak.net arigo at codespeak.net
Mon Apr 3 17:36:13 CEST 2006


Author: arigo
Date: Mon Apr  3 17:36:12 2006
New Revision: 25263

Modified:
   pypy/branch/jit-timeshifter-refactoring/timeshifter/rcontainer.py
   pypy/branch/jit-timeshifter-refactoring/timeshifter/rvalue.py
   pypy/branch/jit-timeshifter-refactoring/timeshifter/test/test_timeshift.py
Log:
(pedronis, arigo)

A quick fix.  (insert smiley here)


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	Mon Apr  3 17:36:12 2006
@@ -28,6 +28,7 @@
 
 class StructTypeDesc(object):
     __metaclass__ = cachedtype
+    firstsubstructdesc = None
 
     def __init__(self, TYPE):
         self.TYPE = TYPE
@@ -40,6 +41,9 @@
             FIELDTYPE = getattr(self.TYPE, name)
             if isinstance(FIELDTYPE, lltype.ContainerType):
                 substructdesc = StructTypeDesc(FIELDTYPE)
+                assert name == self.TYPE._names[0], (
+                    "unsupported: inlined substructures not as first field")
+                self.firstsubstructdesc = substructdesc
                 for subfielddesc in substructdesc.fielddescs:
                     dottedname = '%s.%s' % (name, subfielddesc.fieldname)
                     index = len(fielddescs)
@@ -55,7 +59,15 @@
         return self.fielddescs[index]
 
     def ll_factory(self):
-        return rvalue.PtrRedBox(self.gv_ptrtype, content=VirtualStruct(self))
+        vstruct = VirtualStruct(self)
+        vstruct.substruct_boxes = []
+        typedesc = self
+        while typedesc is not None:
+            box = rvalue.PtrRedBox(typedesc.gv_ptrtype,
+                                   content=vstruct)
+            vstruct.substruct_boxes.append(box)
+            typedesc = typedesc.firstsubstructdesc
+        return vstruct.substruct_boxes[0]
 
     def _freeze_(self):
         return True
@@ -83,6 +95,12 @@
 
     def __init__(self, PTRTYPE, name):
         FieldDesc.__init__(self, PTRTYPE, getattr(PTRTYPE.TO, name))
+        self.structdepth = 0
+        T = self.PTRTYPE.TO
+        while (T._names and
+               isinstance(getattr(T, T._names[0]), lltype.ContainerType)):
+            self.structdepth += 1
+            T = getattr(T, T._names[0])
         self.fieldname = name
         self.gv_fieldname = rgenop.constFieldName(name)
 
@@ -144,23 +162,22 @@
         self.typedesc = typedesc
         #self.fz_content initialized later
 
-    def exactmatch(self, box, outgoingvarboxes, memo):
-        vstruct = box.content
+    def exactmatch(self, vstruct, outgoingvarboxes, memo):
         contmemo = memo.containers
         if self in contmemo:
             ok = vstruct is contmemo[self]
             if not ok:
-                outgoingvarboxes.append(box)
+                outgoingvarboxes.extend(vstruct.substruct_boxes)
             return ok
         if vstruct in contmemo:
             assert contmemo[vstruct] is not self
-            outgoingvarboxes.append(box)
+            outgoingvarboxes.extend(vstruct.substruct_boxes)
             return False
-        contmemo[self] = vstruct
-        contmemo[vstruct] = self
         if self.typedesc is not vstruct.typedesc:
-            outgoingvarboxes.append(box)
+            outgoingvarboxes.extend(vstruct.substruct_boxes)
             return False
+        contmemo[self] = vstruct
+        contmemo[vstruct] = self
         self_boxes = self.fz_content_boxes
         vstruct_boxes = vstruct.content_boxes
         fullmatch = True
@@ -180,7 +197,7 @@
         self.content_boxes = [desc.redboxcls(desc.gv_resulttype,
                                              desc.gv_default)
                               for desc in typedesc.fielddescs]
-        self.genvar = rgenop.nullvar
+        #self.substruct_boxes = ...
 
     def enter_block(self, newblock, incoming, memo):
         contmemo = memo.containers
@@ -189,9 +206,7 @@
             for box in self.content_boxes:
                 box.enter_block(newblock, incoming, memo)
 
-    def build_runtime_container(self, jitstate):
-        if self.genvar:
-            return self.genvar
+    def force_runtime_container(self, jitstate):
         typedesc = self.typedesc
         boxes = self.content_boxes
         self.content_boxes = None
@@ -199,7 +214,15 @@
         op_args[0] = typedesc.gv_type
         genvar = rgenop.genop(jitstate.curblock, 'malloc', op_args,
                               typedesc.gv_ptrtype)
-        self.genvar = genvar
+        # force all the boxes pointing to this VirtualStruct
+        for box in self.substruct_boxes:
+            # XXX using getsubstruct would be nicer
+            op_args = lltype.malloc(rgenop.VARLIST.TO, 1)
+            op_args[0] = genvar
+            box.genvar = rgenop.genop(jitstate.curblock, 'cast_pointer',
+                                      op_args, box.gv_type)
+            box.content = None
+        self.substruct_boxes = None
         fielddescs = typedesc.fielddescs
         for i in range(len(fielddescs)):
             fielddesc = fielddescs[i]
@@ -207,8 +230,6 @@
             # xxx a bit inefficient
             fielddesc.generate_set(jitstate, genvar, box)
 
-        return genvar
-
     def freeze(self, memo):
         contmemo = memo.containers
         try:
@@ -225,10 +246,10 @@
             return contmemo[self]
         except KeyError:
             result = contmemo[self] = VirtualStruct(self.typedesc)
-            boxcopies = []
-            for box in self.content_boxes:
-                boxcopies.append(box.copy(memo))
-            result.content_boxes = boxcopies
+            result.content_boxes = [box.copy(memo)
+                                    for box in self.content_boxes]
+            result.substruct_boxes = [box.copy(memo)
+                                      for box in self.substruct_boxes]
             return result
 
     def op_getfield(self, jitstate, fielddesc):
@@ -239,4 +260,4 @@
 
     def op_getsubstruct(self, jitstate, fielddesc):
         #assert fielddesc.fieldindex == 0
-        return rvalue.PtrRedBox(fielddesc.gv_resulttype, content=self)
+        return self.substruct_boxes[-fielddesc.structdepth]

Modified: pypy/branch/jit-timeshifter-refactoring/timeshifter/rvalue.py
==============================================================================
--- pypy/branch/jit-timeshifter-refactoring/timeshifter/rvalue.py	(original)
+++ pypy/branch/jit-timeshifter-refactoring/timeshifter/rvalue.py	Mon Apr  3 17:36:12 2006
@@ -161,13 +161,8 @@
     def getgenvar(self, jitstate):
         if not self.genvar:
             assert self.content
-            genvar = self.content.build_runtime_container(jitstate)
-            op_args = lltype.malloc(rgenop.VARLIST.TO, 1)
-            op_args[0] = genvar
-            genvar = rgenop.genop(jitstate.curblock, 'cast_pointer', op_args,
-                                  self.gv_type)
-            self.genvar = genvar
-            self.content = None
+            self.content.force_runtime_container(jitstate)
+            assert self.genvar
         return self.genvar
 
     def enter_block(self, newblock, incoming, memo):
@@ -334,4 +329,5 @@
             outgoingvarboxes.append(box)
             return False
         else:
-            return self.fz_content.exactmatch(box, outgoingvarboxes, memo)
+            return self.fz_content.exactmatch(box.content, outgoingvarboxes,
+                                              memo)

Modified: pypy/branch/jit-timeshifter-refactoring/timeshifter/test/test_timeshift.py
==============================================================================
--- pypy/branch/jit-timeshifter-refactoring/timeshifter/test/test_timeshift.py	(original)
+++ pypy/branch/jit-timeshifter-refactoring/timeshifter/test/test_timeshift.py	Mon Apr  3 17:36:12 2006
@@ -436,6 +436,26 @@
     assert parentindex == 's'
     assert parent.n == 3.25
 
+def test_degenerated_via_substructure():
+    S = lltype.GcStruct('S', ('n', lltype.Signed))
+    T = lltype.GcStruct('T', ('s', S), ('n', lltype.Float))
+
+    def ll_function(flag):
+        t = lltype.malloc(T)
+        t.s.n = 3
+        s = lltype.malloc(S)
+        s.n = 7
+        if flag:
+            pass
+        else:
+            s = t.s
+        t.s.n += 1
+        return s.n * t.s.n
+    insns, res = timeshift(ll_function, [1], [])
+    assert res == 7 * 4
+    insns, res = timeshift(ll_function, [0], [])
+    assert res == 4 * 4
+
 def test_plus_minus_all_inlined():
     def ll_plus_minus(s, x, y):
         acc = x



More information about the Pypy-commit mailing list