[pypy-svn] r25201 - in pypy/dist/pypy/jit: . test

arigo at codespeak.net arigo at codespeak.net
Sat Apr 1 10:19:18 CEST 2006


Author: arigo
Date: Sat Apr  1 10:19:17 2006
New Revision: 25201

Modified:
   pypy/dist/pypy/jit/rtimeshift.py
   pypy/dist/pypy/jit/test/test_hint_timeshift.py
Log:
(arre, pedronis, arigo)

Substructures start to work.


Modified: pypy/dist/pypy/jit/rtimeshift.py
==============================================================================
--- pypy/dist/pypy/jit/rtimeshift.py	(original)
+++ pypy/dist/pypy/jit/rtimeshift.py	Sat Apr  1 10:19:17 2006
@@ -122,9 +122,7 @@
             op_args[0] = typedesc.gv_type
             self.genvar = rgenop.genop(jitstate.curblock, 'malloc', op_args,
                                        typedesc.gv_ptrtype)
-            for i in range(len(boxes)):
-                RedBox.op_setfield(self, jitstate, typedesc.fielddescs[i],
-                                   boxes[i])
+            typedesc.materialize_content(jitstate, self.genvar, boxes)
         return self.genvar
 
     def is_forced(self):
@@ -145,7 +143,6 @@
         bigbox = VirtualRedBox(self.typedesc)
         memo[self] = bigbox
         for i in range(len(bigbox.content_boxes)):
-            # XXX need a memo for sharing
             gv_fldtype = self.typedesc.fielddescs[i].gv_resulttype
             bigbox.content_boxes[i] = self.content_boxes[i].copybox(newblock,
                                                                     gv_fldtype,
@@ -203,7 +200,6 @@
         bigbox.parentbox = parentcopybox
         typedesc = self.fielddesc.inlined_typedesc
         for i in range(len(bigbox.content_boxes)):
-            # XXX need a memo for sharing
             gv_fldtype = typedesc.fielddescs[i].gv_resulttype
             bigbox.content_boxes[i] = self.content_boxes[i].copybox(newblock,
                                                                     gv_fldtype,
@@ -383,6 +379,30 @@
             clist.append(box)
         return clist
 
+    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]

Modified: pypy/dist/pypy/jit/test/test_hint_timeshift.py
==============================================================================
--- pypy/dist/pypy/jit/test/test_hint_timeshift.py	(original)
+++ pypy/dist/pypy/jit/test/test_hint_timeshift.py	Sat Apr  1 10:19:17 2006
@@ -7,7 +7,7 @@
 from pypy.jit import rtimeshift, hintrtyper
 from pypy.jit.test.test_llabstractinterp import annotation, summary
 from pypy.rpython.lltypesystem import lltype, llmemory
-from pypy.rpython.objectmodel import hint
+from pypy.rpython.objectmodel import hint, keepalive_until_here
 from pypy.rpython import rgenop, rstr
 from pypy.annotation import model as annmodel
 from pypy.rpython.llinterp import LLInterpreter
@@ -386,7 +386,6 @@
     assert insns == {'int_lt': 1, 'int_mul': 1}
 
 def test_red_subcontainer():
-    py.test.skip("in-progress")
     S = lltype.Struct('S', ('n', lltype.Signed))
     T = lltype.GcStruct('T', ('s', S), ('n', lltype.Float))
     def ll_function(k):
@@ -395,7 +394,9 @@
         s.n = k
         if k < 0:
             return -123
-        return s.n * (k-1)
+        result = s.n * (k-1)
+        keepalive_until_here(t)
+        return result
     insns, res = timeshift(ll_function, [7], [], policy=P_NOVIRTUAL)
     assert res == 42
     #assert insns == ...   in-progress



More information about the Pypy-commit mailing list