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

ac at codespeak.net ac at codespeak.net
Thu Jan 25 13:59:08 CET 2007


Author: ac
Date: Thu Jan 25 13:59:06 2007
New Revision: 37327

Modified:
   pypy/dist/pypy/jit/timeshifter/rcontainer.py
   pypy/dist/pypy/jit/timeshifter/rtimeshift.py
   pypy/dist/pypy/jit/timeshifter/rvirtualizable.py
   pypy/dist/pypy/jit/timeshifter/test/test_virtualizable.py
Log:
(pedronis, arre) Support for setting of non pointer fields of virtualizables
in residual calls.


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 13:59:06 2007
@@ -213,14 +213,14 @@
 
         annhelper = hrtyper.annhelper
 
-        self.my_redirected_getters = {}
+        self.my_redirected_getsetters = {}
         self.my_redirected_names = my_redirected_names = []
         j = 0
         for fielddesc, _  in self.redirected_fielddescs:
             if fielddesc.PTRTYPE != self.PTRTYPE:
                 continue
             my_redirected_names.append(fielddesc.fieldname)
-            self._define_get_field_ptr(hrtyper, fielddesc, j)
+            self._define_getset_field_ptr(hrtyper, fielddesc, j)
             j += 1
 
         self._define_getset_rti_ptrs(hrtyper)
@@ -233,21 +233,32 @@
         self._define_collect_residual_args()
 
 
-    def _define_get_field_ptr(self, hrtyper, fielddesc, j):
+    def _define_getset_field_ptr(self, hrtyper, fielddesc, j):
         annhelper = hrtyper.annhelper
+        s_lltype = annmodel.lltype_to_annotation(fielddesc.RESTYPE)
         def get_field(struc):
             vable_rti = struc.vable_rti
             vable_rti = cast_base_ptr_to_instance(rvirtualizable.VirtualRTI,
                                                   vable_rti)
             return vable_rti.read_field(fielddesc, struc.vable_base, j)
 
-        s_lltype = annmodel.lltype_to_annotation(fielddesc.RESTYPE)
         get_field_ptr = annhelper.delayedfunction(get_field,
                                                   [self.s_structtype],
                                                   s_lltype,
                                                   needtype = True)
-        self.my_redirected_getters[fielddesc.fieldname] = get_field_ptr        
+        def set_field(struc, value):
+            vable_rti = struc.vable_rti
+            vable_rti = cast_base_ptr_to_instance(rvirtualizable.VirtualRTI,
+                                                  vable_rti)
+            vable_rti.write_field(fielddesc, struc.vable_base, j, value)
 
+        set_field_ptr = annhelper.delayedfunction(set_field,
+                                                  [self.s_structtype,
+                                                   s_lltype],
+                                                  annmodel.s_None,
+                                                  needtype = True)
+        self.my_redirected_getsetters[fielddesc.fieldname] = (get_field_ptr,
+                                                              set_field_ptr)
     def _define_getset_rti_ptrs(self, hrtyper):
         RGenOp = hrtyper.RGenOp
         annhelper = hrtyper.annhelper
@@ -281,9 +292,11 @@
         if (firstsubstructdesc is not None and 
             isinstance(firstsubstructdesc, VirtualizableStructTypeDesc)):
             firstsubstructdesc._fill_access(access.parent)
-        for name, get_field_ptr in self.my_redirected_getters.iteritems():
+        getsetters = self.my_redirected_getsetters.iteritems()
+        for name, (get_field_ptr, set_field_ptr) in getsetters:
             setattr(access, 'get_'+name, get_field_ptr)
-            
+            setattr(access, 'set_'+name, set_field_ptr)
+ 
     def _define_collect_residual_args(self):
         my_redirected_names = unrolling_iterable(self.my_redirected_names)
         TOPPTR = self.access_desc.PTRTYPE
@@ -585,7 +598,7 @@
         vrti = rvirtualizable.VirtualStructRTI(rgenop, bitmask)
         memo.containers[self] = vrti
 
-        vars_gv = memo.framevars_gv
+        varboxes = memo.framevarboxes
         varindexes = vrti.varindexes
         vrtis = vrti.vrtis
         j = -1
@@ -593,7 +606,7 @@
             if box.genvar:
                 varindexes.append(memo.frameindex)
                 memo.frameindex += 1
-                vars_gv.append(box.genvar)
+                varboxes.append(box)
             else:
                 varindexes.append(j)
                 assert isinstance(box, rvalue.PtrRedBox)
@@ -675,7 +688,8 @@
 
     def make_rti(self, jitstate, memo):
         typedesc = self.typedesc
-        gv_outside = self.content_boxes[-1].genvar
+        outsidebox = self.content_boxes[-1]
+        gv_outside = outsidebox.genvar
         if gv_outside is typedesc.gv_null:
             return None
         try:
@@ -687,8 +701,9 @@
         vable_rti = rvirtualizable.VirtualizableRTI(rgenop, 0)
         memo.containers[self] = vable_rti
         
-        vars_gv = memo.framevars_gv
-        vars_gv.append(gv_outside)
+        in_virtualizable_varboxes = memo.in_virtualizable_framevarboxes
+        varboxes = memo.framevarboxes
+        varboxes.append(outsidebox)
         getset_rti = (memo.frameindex,
                       typedesc.get_rti_ptr,
                       typedesc.set_rti_ptr)
@@ -703,7 +718,8 @@
             if box.genvar:
                 varindexes.append(memo.frameindex)
                 memo.frameindex += 1
-                vars_gv.append(box.genvar)
+                in_virtualizable_varboxes[box] = None
+                varboxes.append(box)
             else:
                 varindexes.append(j)
                 assert isinstance(box, rvalue.PtrRedBox)

Modified: pypy/dist/pypy/jit/timeshifter/rtimeshift.py
==============================================================================
--- pypy/dist/pypy/jit/timeshifter/rtimeshift.py	(original)
+++ pypy/dist/pypy/jit/timeshifter/rtimeshift.py	Thu Jan 25 13:59:06 2007
@@ -903,7 +903,8 @@
             memo = rvalue.make_vinfo_memo()
             memo.bitcount = 0
             memo.frameindex = 0
-            memo.framevars_gv = []
+            memo.in_virtualizable_framevarboxes = {}
+            memo.framevarboxes = []
             memo.vable_getset_rtis = []
             vable_rtis = []
             for virtualizable_box in virtualizables:
@@ -912,7 +913,14 @@
                 vable_rtis.append(content.make_rti(self, memo))
             assert memo.bitcount < 32
             gv_base = builder.genop_get_frame_base()
-            frameinfo = builder.get_frame_info(memo.framevars_gv)
+            for varbox in memo.in_virtualizable_framevarboxes:
+                if varbox.genvar.is_const:
+                    gvar = builder.genop_same_as(varbox.kind, varbox.genvar)
+                    varbox.genvar = gvar
+            framevars_gv = []
+            for varbox in memo.framevarboxes:
+                framevars_gv.append(varbox.genvar)
+            frameinfo = builder.get_frame_info(framevars_gv)
             vable_getset_rtis = memo.vable_getset_rtis
             for i in range(len(virtualizables)):
                 vable_rti = vable_rtis[i]

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 13:59:06 2007
@@ -24,6 +24,14 @@
         return vinfo.get_forced(vablerti, fielddesc, base)
     _read_field._annspecialcase_ = "specialize:arg(2)"
 
+    def _write_field(self, vablerti, fielddesc, base, index, value):
+        T = fielddesc.RESTYPE
+        frameindex = self.varindexes[index]
+        if frameindex >= 0:
+            return vablerti.write_frame_var(T, base, frameindex, value)
+        raise NotImplementedError
+    _write_field._annspecialcase_ = "specialize:arg(2)"
+
     def get_forced(self, vablerti, fielddesc, base):
         T = fielddesc.RESTYPE
         assert isinstance(T, lltype.Ptr)
@@ -53,6 +61,15 @@
         return self._read_field(self, fielddesc, base, index)
     read_field._annspecialcase_ = "specialize:arg(1)"
 
+    def write_frame_var(self, T, base, frameindex, value):
+        return self.rgenop.write_frame_var(T, base, self.frameinfo, frameindex,
+                                           value)
+    write_frame_var._annspecialcase_ = "specialize:arg(1)"
+
+    def write_field(self, fielddesc, base, index, value):
+        return self._write_field(self, fielddesc, base, index, value)
+    write_field._annspecialcase_ = "specialize:arg(1)"
+
     def getforcestate(self, base):
         state = {}
         for i, get, set in self.vable_getset_rtis:
@@ -66,7 +83,8 @@
 
 class WithForcedStateVirtualizableRTI(VirtualizableRTI):
     _attrs_ = "state"
-
+    state = {}
+    
     def __init__(self, vablerti, state):
         self.rgenop = vablerti.rgenop
         self.varindexes = vablerti.varindexes
@@ -85,6 +103,7 @@
         return bitmask
 
     def read_forced(self, bitkey):
+        assert self.state
         return self.state[bitkey]
 
 

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 13:59:06 2007
@@ -694,6 +694,33 @@
                                          policy=StopAtXPolicy(g))
 
         assert res == 42
+
+    def test_setting_in_residual_call(self):
+        def g(xy):
+            x = xy_get_x(xy)
+            y = xy_get_y(xy)
+            xy_set_x(xy, y)
+            xy_set_y(xy, x)
+
+        def f(x):
+            hint(None, global_merge_point=True)
+            xy = lltype.malloc(XY)
+            xy.vable_access = lltype.nullptr(XY_ACCESS)
+            xy.x = x
+            xy.y = 11
+            g(xy)
+            x = xy_get_x(xy)
+            y = xy_get_y(xy)
+            return x*2 + y
+
+        
+        def main(x):
+            return f(x)
+        
+        res = self.timeshift_from_portal(main, f, [20],
+                                         policy=StopAtXPolicy(g))
+
+        assert res == 42
         
 class TestVirtualizableImplicit(PortalTest):
 



More information about the Pypy-commit mailing list