[pypy-commit] pypy stm: void fields.
arigo
noreply at buildbot.pypy.org
Fri Jan 20 10:03:05 CET 2012
Author: Armin Rigo <arigo at tunes.org>
Branch: stm
Changeset: r51508:5c885d90cfd1
Date: 2012-01-19 22:20 +0100
http://bitbucket.org/pypy/pypy/changeset/5c885d90cfd1/
Log: void fields.
diff --git a/pypy/translator/stm/test/test_llstm.py b/pypy/translator/stm/test/test_llstm.py
--- a/pypy/translator/stm/test/test_llstm.py
+++ b/pypy/translator/stm/test/test_llstm.py
@@ -9,7 +9,7 @@
('c1', lltype.Char), ('c2', lltype.Char),
('c3', lltype.Char), ('l', lltype.SignedLongLong),
('f', lltype.Float), ('sa', lltype.SingleFloat),
- ('sb', lltype.SingleFloat))
+ ('sb', lltype.SingleFloat), ('v', lltype.Void))
rll1 = r_longlong(-10000000000003)
rll2 = r_longlong(-300400500600700)
rf1 = -12.38976129
@@ -29,6 +29,7 @@
assert a.f == rf1
assert float(a.sa) == float(rs1a)
assert float(a.sb) == float(rs1b)
+ assert a.v == None
assert stm_getfield(a, 'x') == -611
assert stm_getfield(a, 'c2') == '\\'
assert stm_getfield(a, 'c1') == '/'
@@ -58,6 +59,7 @@
a.f = rf1
a.sa = rs1a
a.sb = rs1b
+ a.v = None
stm_descriptor_init()
stm_perform_transaction(llhelper(CALLBACK, callback1),
rffi.cast(rffi.VOIDP, a))
@@ -70,6 +72,7 @@
assert a.f == rf1
assert float(a.sa) == float(rs1a)
assert float(a.sb) == float(rs1b)
+ assert a.v == None
assert a.y == 10
lltype.free(a, flavor='raw')
@@ -83,6 +86,7 @@
assert a.f == rf1
assert float(a.sa) == float(rs1a)
assert float(a.sb) == float(rs1b)
+ assert a.v == None
assert stm_getfield(a, 'x') == -611
assert stm_getfield(a, 'c1') == '&'
assert stm_getfield(a, 'c2') == '*'
@@ -115,6 +119,7 @@
assert a.f == rf1
assert float(a.sa) == float(rs1a)
assert float(a.sb) == float(rs1b)
+ assert a.v == None
if a.y < 10:
a.y += 1 # non-transactionally
stm_abort_and_retry()
@@ -131,6 +136,7 @@
a.f = rf1
a.sa = rs1a
a.sb = rs1b
+ a.v = None
stm_descriptor_init()
stm_perform_transaction(llhelper(CALLBACK, callback2),
rffi.cast(rffi.VOIDP, a))
@@ -143,5 +149,6 @@
assert a.f == rf2
assert float(a.sa) == float(rs2a)
assert float(a.sb) == float(rs2b)
+ assert a.v == None
assert a.y == 10
lltype.free(a, flavor='raw')
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
@@ -53,6 +53,16 @@
res = eval_stm_graph(interp, graph, [p], stm_mode="regular_transaction")
assert res == 42
+def test_void_field():
+ S = lltype.GcStruct('S', ('v', lltype.Void))
+ p = lltype.malloc(S, immortal=True)
+ def func(p):
+ p.v = None
+ return p.v
+ interp, graph = get_interpreter(func, [p])
+ transform_graph(graph)
+ assert summary(graph) == {'getfield': 1, 'setfield': 1}
+
def test_getarraysize():
A = lltype.GcArray(lltype.Signed)
p = lltype.malloc(A, 100, immortal=True)
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
@@ -109,7 +109,9 @@
def stt_getfield(self, newoperations, op):
STRUCT = op.args[0].concretetype.TO
- if STRUCT._immutable_field(op.args[1].value):
+ if op.result.concretetype is lltype.Void:
+ op1 = op
+ elif STRUCT._immutable_field(op.args[1].value):
op1 = op
elif STRUCT._gckind == 'raw':
turn_inevitable(newoperations, "getfield-raw")
@@ -120,7 +122,9 @@
def stt_setfield(self, newoperations, op):
STRUCT = op.args[0].concretetype.TO
- if STRUCT._immutable_field(op.args[1].value):
+ if op.args[2].concretetype is lltype.Void:
+ op1 = op
+ elif STRUCT._immutable_field(op.args[1].value):
op1 = op
elif STRUCT._gckind == 'raw':
turn_inevitable(newoperations, "setfield-raw")
@@ -131,7 +135,9 @@
def stt_getarrayitem(self, newoperations, op):
ARRAY = op.args[0].concretetype.TO
- if ARRAY._immutable_field():
+ if op.result.concretetype is lltype.Void:
+ op1 = op
+ elif ARRAY._immutable_field():
op1 = op
elif ARRAY._gckind == 'raw':
turn_inevitable(newoperations, "getarrayitem-raw")
@@ -142,7 +148,9 @@
def stt_setarrayitem(self, newoperations, op):
ARRAY = op.args[0].concretetype.TO
- if ARRAY._immutable_field():
+ if op.args[2].concretetype is lltype.Void:
+ op1 = op
+ elif ARRAY._immutable_field():
op1 = op
elif ARRAY._gckind == 'raw':
turn_inevitable(newoperations, "setarrayitem-raw")
@@ -153,7 +161,9 @@
def stt_getinteriorfield(self, newoperations, op):
OUTER = op.args[0].concretetype.TO
- if OUTER._hints.get('immutable'):
+ if op.result.concretetype is lltype.Void:
+ op1 = op
+ elif OUTER._hints.get('immutable'):
op1 = op
elif OUTER._gckind == 'raw':
turn_inevitable(newoperations, "getinteriorfield-raw")
@@ -164,7 +174,9 @@
def stt_setinteriorfield(self, newoperations, op):
OUTER = op.args[0].concretetype.TO
- if OUTER._hints.get('immutable'):
+ if op.args[-1].concretetype is lltype.Void:
+ op1 = op
+ elif OUTER._hints.get('immutable'):
op1 = op
elif OUTER._gckind == 'raw':
turn_inevitable(newoperations, "setinteriorfield-raw")
More information about the pypy-commit
mailing list