[pypy-svn] r25393 - in pypy/dist/pypy/rpython/memory: . test
mwh at codespeak.net
mwh at codespeak.net
Wed Apr 5 16:52:55 CEST 2006
Author: mwh
Date: Wed Apr 5 16:52:53 2006
New Revision: 25393
Modified:
pypy/dist/pypy/rpython/memory/gctransform.py
pypy/dist/pypy/rpython/memory/test/test_gctransform.py
Log:
(mwh, pedronis)
implement replace_set{arrayitem,field} for pyobject*s in the base
gctransformer, as these always need write-barrier style protection.
Modified: pypy/dist/pypy/rpython/memory/gctransform.py
==============================================================================
--- pypy/dist/pypy/rpython/memory/gctransform.py (original)
+++ pypy/dist/pypy/rpython/memory/gctransform.py Wed Apr 5 16:52:53 2006
@@ -190,6 +190,30 @@
needs to overwrite this"""
raise NotImplementedError("gc_protect does not make sense for this gc")
+ def replace_setfield(self, op, livevars, block):
+ if not var_ispyobj(op.args[2]):
+ return [op]
+ oldval = varoftype(op.args[2].concretetype)
+ getoldvalop = SpaceOperation("getfield",
+ [op.args[0], op.args[1]], oldval)
+ result = [getoldvalop]
+ result.extend(self.push_alive(op.args[2]))
+ result.append(op)
+ result.extend(self.pop_alive(oldval))
+ return result
+
+ def replace_setarrayitem(self, op, livevars, block):
+ if not var_ispyobj(op.args[2]):
+ return [op]
+ oldval = varoftype(op.args[2].concretetype)
+ getoldvalop = SpaceOperation("getarrayitem",
+ [op.args[0], op.args[1]], oldval)
+ result = [getoldvalop]
+ result.extend(self.push_alive(op.args[2]))
+ result.append(op)
+ result.extend(self.pop_alive(oldval))
+ return result
+
def annotate_helper(self, ll_helper, ll_args, ll_result):
assert not self.finished
args_s = map(annmodel.lltype_to_annotation, ll_args)
Modified: pypy/dist/pypy/rpython/memory/test/test_gctransform.py
==============================================================================
--- pypy/dist/pypy/rpython/memory/test/test_gctransform.py (original)
+++ pypy/dist/pypy/rpython/memory/test/test_gctransform.py Wed Apr 5 16:52:53 2006
@@ -214,8 +214,10 @@
pyobj_getfields += 1
elif op.opname == 'setfield' and var_ispyobj(op.args[2]):
pyobj_setfields += 1
- assert pyobj_getfields > 0
- assert pyobj_setfields > 0
+ # although there's only one explicit getfield in the code, a
+ # setfield on a pyobj must get the old value out and decref it
+ assert pyobj_getfields >= 2
+ assert pyobj_setfields >= 1
def test_pass_gc_pointer():
S = lltype.GcStruct("S", ('x', lltype.Signed))
More information about the Pypy-commit
mailing list