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_circular_virtuals(self): h = HeapCache() h.new(box1) h.new(box2) h.invalidate_caches(rop.SETFIELD_GC, None, [box1, box2]) h.invalidate_caches(rop.SETFIELD_GC, None, [box2, box1]) h.invalidate_caches(rop.SETFIELD_GC, None, [box3, box1]) # does not crash
def test_unescaped(self): h = HeapCache() assert not h.is_unescaped(box1) h.new(box2) assert h.is_unescaped(box2) h.invalidate_caches(rop.SETFIELD_GC, None, [box2, box1]) assert h.is_unescaped(box2) h.invalidate_caches(rop.SETFIELD_GC, None, [box1, box2]) assert not h.is_unescaped(box2)
def test_unescaped_testing(self): h = HeapCache() h.new(box1) h.new(box2) assert h.is_unescaped(box1) assert h.is_unescaped(box2) # Putting a virtual inside of another virtual doesn't escape it. h.invalidate_caches(rop.SETFIELD_GC, None, [box1, box2]) assert h.is_unescaped(box2) # Reading a field from a virtual doesn't escape it. h.invalidate_caches(rop.GETFIELD_GC, None, [box1]) assert h.is_unescaped(box1) # Escaping a virtual transitively escapes anything inside of it. assert not h.is_unescaped(box3) h.invalidate_caches(rop.SETFIELD_GC, None, [box3, box1]) assert not h.is_unescaped(box1) assert not h.is_unescaped(box2)
def test_unescaped_array(self): h = HeapCache() h.new_array(box1, lengthbox1) assert h.is_unescaped(box1) h.invalidate_caches(rop.SETARRAYITEM_GC, None, [box1, index1, box2]) assert h.is_unescaped(box1) h.invalidate_caches(rop.SETARRAYITEM_GC, None, [box2, index1, box1]) assert not h.is_unescaped(box1) h = HeapCache() h.new_array(box1, lengthbox1) h.new(box2) assert h.is_unescaped(box1) assert h.is_unescaped(box2) h.invalidate_caches(rop.SETARRAYITEM_GC, None, [box1, lengthbox2, box2]) assert h.is_unescaped(box1) assert h.is_unescaped(box2) h.invalidate_caches( rop.CALL, FakeCallDescr(FakeEffektinfo.EF_RANDOM_EFFECTS), [box1] ) assert not h.is_unescaped(box1) assert not h.is_unescaped(box2)