Author: Armin Rigo <[email protected]>
Branch: stm-thread-2
Changeset: r57086:ce174865cba4
Date: 2012-09-02 17:23 +0200
http://bitbucket.org/pypy/pypy/changeset/ce174865cba4/
Log: Detect when a barrier has an effect or not.
diff --git a/pypy/translator/stm/test/test_transform2.py
b/pypy/translator/stm/test/test_transform2.py
--- a/pypy/translator/stm/test/test_transform2.py
+++ b/pypy/translator/stm/test/test_transform2.py
@@ -55,22 +55,35 @@
class LLSTMFrame(LLFrame):
+ def all_stm_ptrs(self):
+ for frame in self.llinterpreter.frame_stack:
+ for value in frame.bindings.values():
+ if isinstance(value, _stmptr):
+ yield value
+
def get_category(self, p):
return self.llinterpreter.tester.get_category(p)
def check_category(self, p, expected):
cat = self.get_category(p)
assert cat in MORE_PRECISE_CATEGORIES[expected]
+ return cat
def op_stm_barrier(self, kind, obj):
frm, middledigit, to = kind
assert middledigit == '2'
- self.check_category(obj, frm)
- ptr2 = _stmptr(obj, to)
- if to == 'W':
- self.llinterpreter.tester.writemode.add(ptr2._obj)
- self.llinterpreter.tester.barriers.append(kind)
- return ptr2
+ cat = self.check_category(obj, frm)
+ if cat in MORE_PRECISE_CATEGORIES[to]:
+ # a barrier, but with no effect
+ self.llinterpreter.tester.barriers.append(kind.lower())
+ return obj
+ else:
+ # a barrier, calling a helper
+ ptr2 = _stmptr(obj, to)
+ if to == 'W':
+ self.llinterpreter.tester.writemode.add(ptr2._obj)
+ self.llinterpreter.tester.barriers.append(kind)
+ return ptr2
def op_stm_ptr_eq(self, obj1, obj2):
self.check_category(obj1, 'P')
@@ -84,6 +97,10 @@
def op_setfield(self, obj, fieldname, fieldvalue):
self.check_category(obj, 'W')
+ # convert R -> O all other pointers to the same object we can find
+ for p in self.all_stm_ptrs():
+ if p._category == 'R' and p._T == obj._T and p == obj:
+ _stmptr._category.__set__(p, 'O')
return LLFrame.op_setfield(self, obj, fieldname, fieldvalue)
def op_malloc(self, obj, flags):
@@ -172,7 +189,7 @@
y = lltype.malloc(X, immortal=True)
res = self.interpret(f1, [x, y])
assert res == 36
- assert self.barriers == ['P2R', 'P2W', 'O2R']
+ assert self.barriers == ['P2R', 'P2W', 'o2r']
res = self.interpret(f1, [x, x])
assert res == 42
assert self.barriers == ['P2R', 'P2W', 'O2R']
@@ -207,7 +224,7 @@
x = lltype.malloc(X, immortal=True); x.foo = 6
res = self.interpret(f1, [x])
assert res == 36
- assert self.barriers == ['P2R', 'P2R']
+ assert self.barriers == ['P2R', 'p2r']
def test_call_external_no_random_effects(self):
X = lltype.GcStruct('X', ('foo', lltype.Signed))
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit