[pypy-commit] pypy stmgc-c7: With STM, lightweight finalizers must not contain any setfield.

arigo noreply at buildbot.pypy.org
Wed Nov 12 11:24:32 CET 2014


Author: Armin Rigo <arigo at tunes.org>
Branch: stmgc-c7
Changeset: r74474:0c90b2da771b
Date: 2014-11-12 11:24 +0100
http://bitbucket.org/pypy/pypy/changeset/0c90b2da771b/

Log:	With STM, lightweight finalizers must not contain any setfield.

diff --git a/rpython/translator/backendopt/finalizer.py b/rpython/translator/backendopt/finalizer.py
--- a/rpython/translator/backendopt/finalizer.py
+++ b/rpython/translator/backendopt/finalizer.py
@@ -33,11 +33,13 @@
         if (op.opname.startswith('int_') or op.opname.startswith('float_')
             or op.opname.startswith('uint_') or op.opname.startswith('cast_')):
             return self.bottom_result()
-        if op.opname == 'setfield' or op.opname == 'bare_setfield':
-            TP = op.args[2].concretetype
-            if not isinstance(TP, lltype.Ptr) or TP.TO._gckind == 'raw':
-                # primitive type
-                return self.bottom_result()
+        ## # All setfields are forbidden.  Commented out in test_finalizer too.
+        ## # This is needed for STM and could maybe be justified in general.
+        ## if op.opname == 'setfield' or op.opname == 'bare_setfield':
+        ##     TP = op.args[2].concretetype
+        ##     if not isinstance(TP, lltype.Ptr) or TP.TO._gckind == 'raw':
+        ##         # primitive type
+        ##         return self.bottom_result()
         if op.opname == 'getfield':
             TP = op.result.concretetype
             if not isinstance(TP, lltype.Ptr) or TP.TO._gckind == 'raw':
diff --git a/rpython/translator/backendopt/test/test_finalizer.py b/rpython/translator/backendopt/test/test_finalizer.py
--- a/rpython/translator/backendopt/test/test_finalizer.py
+++ b/rpython/translator/backendopt/test/test_finalizer.py
@@ -53,12 +53,12 @@
     v2 = varoftype(lltype.Signed)
     v3 = varoftype(X)
     v4 = varoftype(Z)
-    assert not f.analyze(SpaceOperation('bare_setfield', [v1, Constant('x'),
-                                                          v2], None))
+    ## assert not f.analyze(SpaceOperation('bare_setfield', [v1, Constant('x'),
+    ##                                                       v2], None))
     assert     f.analyze(SpaceOperation('bare_setfield', [v1, Constant('y'),
                                                           v3], None))
-    assert not f.analyze(SpaceOperation('bare_setfield', [v1, Constant('z'),
-                                                          v4], None))
+    ## assert not f.analyze(SpaceOperation('bare_setfield', [v1, Constant('z'),
+    ##                                                       v4], None))
 
     def test_malloc(self):
         S = lltype.GcStruct('S')


More information about the pypy-commit mailing list