Author: Armin Rigo <[email protected]>
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')
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to