[pypy-commit] pypy gc-del: Support raw array manipulations too

arigo noreply at buildbot.pypy.org
Mon Mar 25 23:25:27 CET 2013


Author: Armin Rigo <arigo at tunes.org>
Branch: gc-del
Changeset: r62761:7ce93195ebd3
Date: 2013-03-25 22:00 +0100
http://bitbucket.org/pypy/pypy/changeset/7ce93195ebd3/

Log:	Support raw array manipulations too

diff --git a/rpython/translator/backendopt/destructor.py b/rpython/translator/backendopt/destructor.py
--- a/rpython/translator/backendopt/destructor.py
+++ b/rpython/translator/backendopt/destructor.py
@@ -31,12 +31,13 @@
         if (op.opname.startswith('int_') or op.opname.startswith('float_')
             or op.opname.startswith('cast_')):
             return self.bottom_result()
-        if op.opname == 'setfield' or op.opname == 'bare_setfield':
-            TP = op.args[2].concretetype
+        if (op.opname == 'setfield' or op.opname == 'bare_setfield' or
+            op.opname == 'setarrayitem' or op.opname == 'bare_setarrayitem'):
+            TP = op.args[-1].concretetype
             if not isinstance(TP, lltype.Ptr) or TP.TO._gckind == 'raw':
                 # primitive type
                 return self.bottom_result()
-        if op.opname == 'getfield':
+        if op.opname == 'getfield' or op.opname == 'getarrayitem':
             TP = op.result.concretetype
             if not isinstance(TP, lltype.Ptr) or TP.TO._gckind == 'raw':
                 # primitive type
diff --git a/rpython/translator/backendopt/test/test_destructor.py b/rpython/translator/backendopt/test/test_destructor.py
--- a/rpython/translator/backendopt/test/test_destructor.py
+++ b/rpython/translator/backendopt/test/test_destructor.py
@@ -127,6 +127,15 @@
         r = self.analyze(g, [], f, backendopt=True)
         assert not r
 
+    def test_setarrayitem(self):
+        x = lltype.malloc(lltype.Array(lltype.Signed), 5, flavor='raw',
+                          immortal=True)
+        def f():
+            x[1] += 1
+
+        r = self.analyze(f, [], f)
+        assert not r
+
     def test_chain(self):
         class B(object):
             def __init__(self):


More information about the pypy-commit mailing list