[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