[pypy-commit] pypy stm: transform.py should not touch immutable getfields

arigo noreply at buildbot.pypy.org
Thu Oct 27 19:36:48 CEST 2011


Author: Armin Rigo <arigo at tunes.org>
Branch: stm
Changeset: r48530:df4fdd533f50
Date: 2011-10-27 17:14 +0200
http://bitbucket.org/pypy/pypy/changeset/df4fdd533f50/

Log:	transform.py should not touch immutable getfields

diff --git a/pypy/translator/stm/test/test_transform.py b/pypy/translator/stm/test/test_transform.py
--- a/pypy/translator/stm/test/test_transform.py
+++ b/pypy/translator/stm/test/test_transform.py
@@ -1,5 +1,6 @@
 from pypy.rpython.lltypesystem import lltype
 from pypy.rpython.test.test_llinterp import get_interpreter
+from pypy.objspace.flow.model import summary
 from pypy.translator.stm.llstminterp import eval_stm_graph
 from pypy.translator.stm.transform import transform_graph
 
@@ -12,5 +13,18 @@
         return p.x
     interp, graph = get_interpreter(func, [p])
     transform_graph(graph)
+    assert summary(graph) == {'stm_getfield': 1}
     res = eval_stm_graph(interp, graph, [p], stm_mode="regular_transaction")
     assert res == 42
+
+def test_immutable_field():
+    S = lltype.GcStruct('S', ('x', lltype.Signed), hints = {'immutable': True})
+    p = lltype.malloc(S, immortal=True)
+    p.x = 42
+    def func(p):
+        return p.x
+    interp, graph = get_interpreter(func, [p])
+    transform_graph(graph)
+    assert summary(graph) == {'getfield': 1}
+    res = eval_stm_graph(interp, graph, [p], stm_mode="regular_transaction")
+    assert res == 42
diff --git a/pypy/translator/stm/transform.py b/pypy/translator/stm/transform.py
--- a/pypy/translator/stm/transform.py
+++ b/pypy/translator/stm/transform.py
@@ -17,7 +17,11 @@
             self.transform_block(block)
 
     def stt_getfield(self, newoperations, op):
-        op1 = SpaceOperation('stm_getfield', op.args, op.result)
+        STRUCT = op.args[0].concretetype.TO
+        if STRUCT._immutable_field(op.args[1].value):
+            op1 = op
+        else:
+            op1 = SpaceOperation('stm_getfield', op.args, op.result)
         newoperations.append(op1)
 
     def stt_setfield(self, newoperations, op):


More information about the pypy-commit mailing list