Author: Carl Friedrich Bolz <cfb...@gmx.de>
Branch: improve-heap-caching-tracing
Changeset: r47060:feecefe7686f
Date: 2011-09-04 11:30 +0200
http://bitbucket.org/pypy/pypy/changeset/feecefe7686f/

Log:    fix XXX in replace_box

diff --git a/pypy/jit/metainterp/heapcache.py b/pypy/jit/metainterp/heapcache.py
--- a/pypy/jit/metainterp/heapcache.py
+++ b/pypy/jit/metainterp/heapcache.py
@@ -111,4 +111,13 @@
                     tobox = newbox
                 new_d[frombox] = tobox
             self.heap_cache[descr] = new_d
-        # XXX what about self.heap_array_cache?
+        for descr, d in self.heap_array_cache.iteritems():
+            for index, cache in d.iteritems():
+                new_cache = {}
+                for frombox, tobox in cache.iteritems():
+                    if frombox is oldbox:
+                        frombox = newbox
+                    if tobox is oldbox:
+                        tobox = newbox
+                    new_cache[frombox] = tobox
+                d[index] = new_cache
diff --git a/pypy/jit/metainterp/test/test_heapcache.py 
b/pypy/jit/metainterp/test/test_heapcache.py
--- a/pypy/jit/metainterp/test/test_heapcache.py
+++ b/pypy/jit/metainterp/test/test_heapcache.py
@@ -8,6 +8,7 @@
 box4 = object()
 descr1 = object()
 descr2 = object()
+descr3 = object()
 
 index1 = ConstInt(0)
 index2 = ConstInt(1)
@@ -202,17 +203,26 @@
         h = HeapCache()
         h.setfield(box1, descr1, box2)
         h.setfield(box1, descr2, box3)
+        h.setfield(box2, descr3, box3)
         h.replace_box(box1, box4)
         assert h.getfield(box1, descr1) is None
         assert h.getfield(box1, descr2) is None
         assert h.getfield(box4, descr1) is box2
         assert h.getfield(box4, descr2) is box3
+        assert h.getfield(box2, descr3) is box3
 
+    def test_replace_box_array(self):
         h = HeapCache()
-        h.setfield(box1, descr1, box2)
-        h.setfield(box1, descr2, box3)
+        h.setarrayitem(box1, descr1, index1, box2)
+        h.setarrayitem(box1, descr2, index1, box3)
+        h.setarrayitem(box2, descr1, index2, box1)
+        h.setarrayitem(box3, descr2, index2, box1)
+        h.setarrayitem(box2, descr3, index2, box3)
         h.replace_box(box1, box4)
-        assert h.getfield(box1, descr1) is None
-        assert h.getfield(box1, descr2) is None
-        assert h.getfield(box4, descr1) is box2
-        assert h.getfield(box4, descr2) is box3
+        assert h.getarrayitem(box1, descr1, index1) is None
+        assert h.getarrayitem(box1, descr2, index1) is None
+        assert h.getarrayitem(box4, descr1, index1) is box2
+        assert h.getarrayitem(box4, descr2, index1) is box3
+        assert h.getarrayitem(box2, descr1, index2) is box4
+        assert h.getarrayitem(box3, descr2, index2) is box4
+        assert h.getarrayitem(box2, descr3, index2) is box3
diff --git a/pypy/jit/metainterp/test/test_tracingopts.py 
b/pypy/jit/metainterp/test/test_tracingopts.py
--- a/pypy/jit/metainterp/test/test_tracingopts.py
+++ b/pypy/jit/metainterp/test/test_tracingopts.py
@@ -257,6 +257,28 @@
         self.check_operations_history(setarrayitem_gc=2, setfield_gc=2,
                                       getarrayitem_gc=0, getfield_gc=2)
 
+    def test_promote_changes_array_cache(self):
+        a1 = [0, 0]
+        a2 = [0, 0]
+        def fn(n):
+            if n > 0:
+                a = a1
+            else:
+                a = a2
+            a[0] = n
+            jit.hint(n, promote=True)
+            x1 = a[0]
+            jit.hint(x1, promote=True)
+            a[n - n] = n + 1
+            return a[0] + x1
+        res = self.interp_operations(fn, [7])
+        assert res == 7 + 7 + 1
+        self.check_operations_history(getarrayitem_gc=0, guard_value=1)
+        res = self.interp_operations(fn, [-7])
+        assert res == -7 - 7 + 1
+        self.check_operations_history(getarrayitem_gc=0, guard_value=1)
+
+
     def test_list_caching(self):
         a1 = [0, 0]
         a2 = [0, 0]
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to