[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