[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