[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