[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