[pypy-commit] pypy stmgc-c8: Allow 'with stm_ignored' to disable locally the insertion of

arigo noreply at buildbot.pypy.org
Sun Jun 21 21:38:27 CEST 2015


Author: Armin Rigo <arigo at tunes.org>
Branch: stmgc-c8
Changeset: r78234:df7e39382535
Date: 2015-06-21 21:33 +0200
http://bitbucket.org/pypy/pypy/changeset/df7e39382535/

Log:	Allow 'with stm_ignored' to disable locally the insertion of
	stm_become_inevitable

diff --git a/rpython/translator/stm/inevitable.py b/rpython/translator/stm/inevitable.py
--- a/rpython/translator/stm/inevitable.py
+++ b/rpython/translator/stm/inevitable.py
@@ -169,11 +169,23 @@
 
 def insert_turn_inevitable(graph):
     for block in graph.iterblocks():
+        stm_ignored = False
         for i in range(len(block.operations)-1, -1, -1):
             op = block.operations[i]
             inev = should_turn_inevitable(op, block)
-            if inev:
+            if inev and not stm_ignored:
                 if not isinstance(inev, str):
                     inev = op.opname
                 inev_op = turn_inevitable_op(inev)
                 block.operations.insert(i, inev_op)
+            if op.opname == 'stm_ignored_stop':
+                assert not stm_ignored, "nested stm_ignored_stop"
+                stm_ignored = True      # backward, so "stop" enables it
+            elif op.opname == 'stm_ignored_start':
+                if not stm_ignored:
+                    raise Exception("%r: 'with stm_ignored: stm_ignored start "
+                                    "without end in the same block" % (graph,))
+                stm_ignored = False     # backward, so "start" disables it
+        if stm_ignored:
+            raise Exception("%r: 'with stm_ignored:' code body too complex"
+                            % (graph,))
diff --git a/rpython/translator/stm/test/test_inevitable.py b/rpython/translator/stm/test/test_inevitable.py
--- a/rpython/translator/stm/test/test_inevitable.py
+++ b/rpython/translator/stm/test/test_inevitable.py
@@ -5,6 +5,7 @@
 from rpython.rtyper.test.test_llinterp import get_interpreter, clear_tcache
 from rpython.translator.stm.inevitable import insert_turn_inevitable
 from rpython.translator.stm import inevitable
+from rpython.rlib.rstm import stm_ignored
 from rpython.conftest import option
 import py
 
@@ -410,3 +411,19 @@
 
         res = self.interpret_inevitable(f1, [1])
         assert res == []
+
+
+    def test_stm_ignored(self):
+        X = lltype.Struct('X', ('foo', lltype.Signed))
+        x1 = lltype.malloc(X, flavor='raw', immortal=True)
+
+        def f1():
+            return x1.foo
+        res = self.interpret_inevitable(f1, [])
+        assert res == ['getfield']
+
+        def f2():
+            with stm_ignored:
+                return x1.foo
+        res = self.interpret_inevitable(f2, [])
+        assert res == []


More information about the pypy-commit mailing list