Author: Carl Friedrich Bolz <[email protected]>
Branch: improve-heap-caching-tracing
Changeset: r47062:d79a75d32675
Date: 2011-09-04 12:00 +0200
http://bitbucket.org/pypy/pypy/changeset/d79a75d32675/
Log: implement the same logic for getarrayitem as for getfield by reusing
the same code
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
@@ -63,13 +63,16 @@
self.heap_cache.setdefault(descr, {})[box] = fieldbox
def setfield(self, box, descr, fieldbox):
+ d = self.heap_cache.get(descr, None)
+ new_d = self._do_write_with_aliasing(d, box, fieldbox)
+ self.heap_cache[descr] = new_d
+
+ def _do_write_with_aliasing(self, d, box, fieldbox):
# slightly subtle logic here
- d = self.heap_cache.get(descr, None)
# a write to an arbitrary box, all other boxes can alias this one
if not d or box not in self.new_boxes:
# therefore we throw away the cache
- self.heap_cache[descr] = {box: fieldbox}
- return
+ return {box: fieldbox}
# the object we are writing to is freshly allocated
# only remove some boxes from the cache
new_d = {}
@@ -80,7 +83,7 @@
if frombox in self.new_boxes:
new_d[frombox] = tobox
new_d[box] = fieldbox
- self.heap_cache[descr] = new_d
+ return new_d
def getarrayitem(self, box, descr, indexbox):
if not isinstance(indexbox, ConstInt):
@@ -100,7 +103,8 @@
return
index = indexbox.getint()
cache = self.heap_array_cache.setdefault(descr, {})
- cache[index] = {box: valuebox}
+ indexcache = cache.get(index, None)
+ cache[index] = self._do_write_with_aliasing(indexcache, box, valuebox)
def replace_box(self, oldbox, newbox):
for descr, d in self.heap_cache.iteritems():
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
@@ -177,6 +177,36 @@
assert h.getarrayitem(box1, descr1, index1) is None
assert h.getarrayitem(box1, descr1, index2) is None
+
+ def test_heapcache_write_fields_multiple_array(self):
+ h = HeapCache()
+ h.setarrayitem(box1, descr1, index1, box2)
+ assert h.getarrayitem(box1, descr1, index1) is box2
+ h.setarrayitem(box3, descr1, index1, box4)
+ assert h.getarrayitem(box3, descr1, index1) is box4
+ assert h.getarrayitem(box1, descr1, index1) is None # box1 and box3
can alias
+
+ h = HeapCache()
+ h.new(box1)
+ h.setarrayitem(box1, descr1, index1, box2)
+ assert h.getarrayitem(box1, descr1, index1) is box2
+ h.setarrayitem(box3, descr1, index1, box4)
+ assert h.getarrayitem(box3, descr1, index1) is box4
+ assert h.getarrayitem(box1, descr1, index1) is None # box1 and box3
can alias
+
+ h = HeapCache()
+ h.new(box1)
+ h.new(box3)
+ h.setarrayitem(box1, descr1, index1, box2)
+ assert h.getarrayitem(box1, descr1, index1) is box2
+ h.setarrayitem(box3, descr1, index1, box4)
+ assert h.getarrayitem(box3, descr1, index1) is box4
+ assert h.getarrayitem(box1, descr1, index1) is box2 # box1 and box3
cannot alias
+ h.setarrayitem(box1, descr1, index1, box3)
+ assert h.getarrayitem(box3, descr1, index1) is box4
+ assert h.getarrayitem(box1, descr1, index1) is box3 # box1 and box3
cannot alias
+
+
def test_invalidate_cache(self):
h = HeapCache()
h.setfield(box1, descr1, box2)
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit