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

ac at codespeak.net ac at codespeak.net
Thu Jan 25 16:25:49 CET 2007


Author: ac
Date: Thu Jan 25 16:25:48 2007
New Revision: 37338

Modified:
   pypy/dist/pypy/jit/timeshifter/rcontainer.py
   pypy/dist/pypy/jit/timeshifter/rvirtualizable.py
   pypy/dist/pypy/jit/timeshifter/test/test_virtualizable.py
Log:
(pedronis,arre) Fist test with setting pointers.

Modified: pypy/dist/pypy/jit/timeshifter/rcontainer.py
==============================================================================
--- pypy/dist/pypy/jit/timeshifter/rcontainer.py	(original)
+++ pypy/dist/pypy/jit/timeshifter/rcontainer.py	Thu Jan 25 16:25:48 2007
@@ -137,7 +137,8 @@
             for desc in descs:
                 v = vrti._read_field(vablerti, desc, base, i)
                 i += 1
-                setattr(s, desc.fieldname, v)
+                tgt = lltype.cast_pointer(desc.PTRTYPE, s)
+                setattr(tgt, desc.fieldname, v)
                 
         self.fill_into = fill_into
 
@@ -357,6 +358,7 @@
     virtualizable = False
     gv_default = None
     canbevirtual = False
+    gcref = False
 
     def __init__(self, hrtyper, PTRTYPE, RESTYPE):
         RGenOp = hrtyper.RGenOp
@@ -369,8 +371,9 @@
             T = RESTYPE.TO
             if hasattr(T, '_hints'):
                 self.virtualizable = T._hints.get('virtualizable', False)
+            self.gcref = T._gckind == 'gc'
             if isinstance(T, lltype.ContainerType):
-                if isinstance(T, lltype.Struct) and T._arrayfld is None:
+                if not T._is_varsize():
                     self.canbevirtual = True
             else:
                 T = None

Modified: pypy/dist/pypy/jit/timeshifter/rvirtualizable.py
==============================================================================
--- pypy/dist/pypy/jit/timeshifter/rvirtualizable.py	(original)
+++ pypy/dist/pypy/jit/timeshifter/rvirtualizable.py	Thu Jan 25 16:25:48 2007
@@ -21,6 +21,7 @@
         vinfo = self.vrtis[index]
         assert isinstance(T, lltype.Ptr)
         assert fielddesc.canbevirtual
+        assert fielddesc.gcref
         return vinfo.get_forced(vablerti, fielddesc, base)
     _read_field._annspecialcase_ = "specialize:arg(2)"
 

Modified: pypy/dist/pypy/jit/timeshifter/test/test_virtualizable.py
==============================================================================
--- pypy/dist/pypy/jit/timeshifter/test/test_virtualizable.py	(original)
+++ pypy/dist/pypy/jit/timeshifter/test/test_virtualizable.py	Thu Jan 25 16:25:48 2007
@@ -821,3 +821,36 @@
         call_count = sum([count for graph, count in calls.iteritems()
                           if not graph.name.startswith('rpyexc_')])
         assert call_count == 3
+
+
+    def test_setting_pointer_in_residual_call(self):
+        class S(object):
+            def __init__(self, x, y):
+                self.x = x
+                self.y = y
+            
+        class V(object):
+            _virtualizable_ = True
+            def __init__(self, s):
+                self.s = s
+
+        def g(v):
+            assert v.s is None
+            s = S(1, 7)
+            v.s = s
+            
+        def f(v):
+            hint(None, global_merge_point=True)
+            g(v)
+            s = v.s
+            return s.x + s.y
+
+        def main():
+            S(5, 5)
+            v = V(None)
+            return f(v)
+
+        res = self.timeshift_from_portal(main, f, [], policy=StopAtXPolicy(g))
+        assert res == 8
+
+        



More information about the Pypy-commit mailing list