def test_ll_arraycopy(self): h = HeapCache() box1 = RefFrontendOp(1) box2 = RefFrontendOp(2) box3 = RefFrontendOp(3) box4 = RefFrontendOp(4) box5 = RefFrontendOp(5) lengthbox1 = IntFrontendOp(11) lengthbox2 = IntFrontendOp(12) h.new_array(box1, lengthbox1) h.setarrayitem(box1, index1, box2, descr1) h.new_array(box2, lengthbox1) # Just need the destination box for this call h.invalidate_caches( rop.CALL_N, arraycopydescr1, [None, box5, box2, index1, index1, index1] ) assert h.getarrayitem(box1, index1, descr1) is box2 h.invalidate_caches( rop.CALL_N, arraycopydescr1, [None, box5, box3, index1, index1, index1] ) assert h.getarrayitem(box1, index1, descr1) is box2 h.setarrayitem(box4, index1, box2, descr1) assert h.getarrayitem(box4, index1, descr1) is box2 h.invalidate_caches( rop.CALL_N, arraycopydescr1, [None, box3, box5, index1, index1, index2] ) assert h.getarrayitem(box4, index1, descr1) is None
def test_ll_arraycopy_differing_descrs(self): h = HeapCache() h.setarrayitem(box1, index1, box2, descr2) assert h.getarrayitem(box1, index1, descr2) is box2 h.new_array(box2, lengthbox2) h.invalidate_caches(rop.CALL, arraycopydescr1, [None, box3, box2, index1, index1, index2]) assert h.getarrayitem(box1, index1, descr2) is box2
def test_ll_arraycopy(self): h = HeapCache() h.new_array(box1, lengthbox1) h.setarrayitem(box1, index1, box2, descr1) h.new_array(box2, lengthbox1) # Just need the destination box for this call h.invalidate_caches( rop.CALL, FakeCallDescr(FakeEffectinfo.EF_CANNOT_RAISE, FakeEffectinfo.OS_ARRAYCOPY, write_descrs_arrays=[descr1]), [None, box5, box2, index1, index1, index1] ) assert h.getarrayitem(box1, index1, descr1) is box2 h.invalidate_caches( rop.CALL, FakeCallDescr(FakeEffectinfo.EF_CANNOT_RAISE, FakeEffectinfo.OS_ARRAYCOPY, write_descrs_arrays=[descr1]), [None, box5, box3, index1, index1, index1] ) assert h.getarrayitem(box1, index1, descr1) is box2 h.setarrayitem(box4, index1, box2, descr1) assert h.getarrayitem(box4, index1, descr1) is box2 h.invalidate_caches( rop.CALL, FakeCallDescr(FakeEffectinfo.EF_CANNOT_RAISE, FakeEffectinfo.OS_ARRAYCOPY, write_descrs_arrays=[descr1]), [None, box3, box5, index1, index1, index2] ) assert h.getarrayitem(box4, index1, descr1) is None
def test_ll_arraycopy(self): h = HeapCache() h.new_array(box1, lengthbox1) h.setarrayitem(box1, index1, box2, descr1) h.new_array(box2, lengthbox1) # Just need the destination box for this call h.invalidate_caches( rop.CALL, arraycopydescr1, [None, box5, box2, index1, index1, index1] ) assert h.getarrayitem(box1, index1, descr1) is box2 h.invalidate_caches( rop.CALL, arraycopydescr1, [None, box5, box3, index1, index1, index1] ) assert h.getarrayitem(box1, index1, descr1) is box2 h.setarrayitem(box4, index1, box2, descr1) assert h.getarrayitem(box4, index1, descr1) is box2 h.invalidate_caches( rop.CALL, arraycopydescr1, [None, box3, box5, index1, index1, index2] ) assert h.getarrayitem(box4, index1, descr1) is None
def test_invalidate_cache(self): h = HeapCache() box1 = RefFrontendOp(1) box2 = RefFrontendOp(2) box4 = RefFrontendOp(4) h.setfield(box1, box2, descr1) h.setarrayitem(box1, index1, box2, descr1) h.setarrayitem(box1, index2, box4, descr1) h.invalidate_caches(rop.INT_ADD, None, []) h.invalidate_caches(rop.INT_ADD_OVF, None, []) h.invalidate_caches(rop.SETFIELD_RAW, None, []) h.invalidate_caches(rop.SETARRAYITEM_RAW, None, []) assert h.getfield(box1, descr1) is box2 assert h.getarrayitem(box1, index1, descr1) is box2 assert h.getarrayitem(box1, index2, descr1) is box4 h.invalidate_caches( rop.CALL_N, FakeCallDescr(FakeEffectinfo.EF_ELIDABLE_CANNOT_RAISE), []) assert h.getfield(box1, descr1) is box2 assert h.getarrayitem(box1, index1, descr1) is box2 assert h.getarrayitem(box1, index2, descr1) is box4 h.invalidate_caches(rop.GUARD_TRUE, None, []) assert h.getfield(box1, descr1) is box2 assert h.getarrayitem(box1, index1, descr1) is box2 assert h.getarrayitem(box1, index2, descr1) is box4 h.invalidate_caches( rop.CALL_LOOPINVARIANT_N, FakeCallDescr(FakeEffectinfo.EF_LOOPINVARIANT), []) h.invalidate_caches( rop.CALL_N, FakeCallDescr(FakeEffectinfo.EF_RANDOM_EFFECTS), []) assert h.getfield(box1, descr1) is None assert h.getarrayitem(box1, index1, descr1) is None assert h.getarrayitem(box1, index2, descr1) is None
def test_invalidate_cache(self): h = HeapCache() h.setfield(box1, box2, descr1) h.setarrayitem(box1, index1, box2, descr1) h.setarrayitem(box1, index2, box4, descr1) h.invalidate_caches(rop.INT_ADD, None, []) h.invalidate_caches(rop.INT_ADD_OVF, None, []) h.invalidate_caches(rop.SETFIELD_RAW, None, []) h.invalidate_caches(rop.SETARRAYITEM_RAW, None, []) assert h.getfield(box1, descr1) is box2 assert h.getarrayitem(box1, index1, descr1) is box2 assert h.getarrayitem(box1, index2, descr1) is box4 h.invalidate_caches( rop.CALL, FakeCallDescr(FakeEffectinfo.EF_ELIDABLE_CANNOT_RAISE), []) assert h.getfield(box1, descr1) is box2 assert h.getarrayitem(box1, index1, descr1) is box2 assert h.getarrayitem(box1, index2, descr1) is box4 h.invalidate_caches(rop.GUARD_TRUE, None, []) assert h.getfield(box1, descr1) is box2 assert h.getarrayitem(box1, index1, descr1) is box2 assert h.getarrayitem(box1, index2, descr1) is box4 h.invalidate_caches( rop.CALL_LOOPINVARIANT, FakeCallDescr(FakeEffectinfo.EF_LOOPINVARIANT), []) h.invalidate_caches( rop.CALL, FakeCallDescr(FakeEffectinfo.EF_RANDOM_EFFECTS), []) assert h.getfield(box1, descr1) is None assert h.getarrayitem(box1, index1, descr1) is None assert h.getarrayitem(box1, index2, descr1) is None
def test_ll_arraycopy_differing_descrs_nonconst_index(self): h = HeapCache() h.setarrayitem(box1, index1, box2, descr2) assert h.getarrayitem(box1, index1, descr2) is box2 h.invalidate_caches(rop.CALL, arraycopydescr1, [None, box3, box2, index1, index1, BoxInt()]) assert h.getarrayitem(box1, index1, descr2) is box2
def test_heapcache_array_nonconst_index(self): h = HeapCache() h.setarrayitem(box1, index1, box2, descr1) h.setarrayitem(box1, index2, box4, descr1) assert h.getarrayitem(box1, index1, descr1) is box2 assert h.getarrayitem(box1, index2, descr1) is box4 h.setarrayitem(box1, box2, box3, descr1) assert h.getarrayitem(box1, index1, descr1) is None assert h.getarrayitem(box1, index2, descr1) is None
def test_ll_arraycopy_differing_descrs_nonconst_index(self): h = HeapCache() box1 = RefFrontendOp(1) box2 = RefFrontendOp(2) box3 = RefFrontendOp(3) h.setarrayitem(box1, index1, box2, descr2) assert h.getarrayitem(box1, index1, descr2) is box2 h.invalidate_caches(rop.CALL_N, arraycopydescr1, [None, box3, box2, index1, index1, InputArgInt()]) assert h.getarrayitem(box1, index1, descr2) is box2
def test_ll_arraycopy_differing_descrs_nonconst_index(self): h = HeapCache() h.setarrayitem(box1, index1, box2, descr2) assert h.getarrayitem(box1, index1, descr2) is box2 h.invalidate_caches( rop.CALL, arraycopydescr1, [None, box3, box2, index1, index1, BoxInt()] ) assert h.getarrayitem(box1, index1, descr2) is box2
def test_ll_arraycopy_differing_descrs(self): h = HeapCache() h.setarrayitem(box1, index1, box2, descr1) assert h.getarrayitem(box1, index1, descr1) is box2 h.new_array(box2, lengthbox2) h.invalidate_caches( rop.CALL, FakeCallDescr(FakeEffectinfo.EF_CANNOT_RAISE, FakeEffectinfo.OS_ARRAYCOPY, write_descrs_arrays=[descr2]), [None, box3, box2, index1, index1, index2] ) assert h.getarrayitem(box1, index1, descr1) is box2
def test_ll_arraycopy_differing_descrs(self): h = HeapCache() box1 = RefFrontendOp(1) box2 = RefFrontendOp(2) box3 = RefFrontendOp(3) lengthbox2 = IntFrontendOp(12) h.setarrayitem(box1, index1, box2, descr2) assert h.getarrayitem(box1, index1, descr2) is box2 h.new_array(box2, lengthbox2) h.invalidate_caches(rop.CALL_N, arraycopydescr1, [None, box3, box2, index1, index1, index2]) assert h.getarrayitem(box1, index1, descr2) is box2
def test_heapcache_array_nonconst_index(self): h = HeapCache() box1 = RefFrontendOp(1) box2 = RefFrontendOp(2) box3 = RefFrontendOp(3) box4 = RefFrontendOp(4) h.setarrayitem(box1, index1, box2, descr1) h.setarrayitem(box1, index2, box4, descr1) assert h.getarrayitem(box1, index1, descr1) is box2 assert h.getarrayitem(box1, index2, descr1) is box4 h.setarrayitem(box1, box2, box3, descr1) assert h.getarrayitem(box1, index1, descr1) is None assert h.getarrayitem(box1, index2, descr1) is None
def test_heapcache_read_fields_multiple_array(self): h = HeapCache() h.getarrayitem_now_known(box1, index1, box2, descr1) h.getarrayitem_now_known(box3, index1, box4, descr1) assert h.getarrayitem(box1, index1, descr1) is box2 assert h.getarrayitem(box1, index1, descr2) is None assert h.getarrayitem(box3, index1, descr1) is box4 assert h.getarrayitem(box3, index1, descr2) is None h.reset() assert h.getarrayitem(box1, index1, descr1) is None assert h.getarrayitem(box1, index1, descr2) is None assert h.getarrayitem(box3, index1, descr1) is None assert h.getarrayitem(box3, index1, descr2) is None
def test_call_doesnt_invalidate_unescaped_array_boxes(self): h = HeapCache() h.new_array(box1, lengthbox1) assert h.is_unescaped(box1) h.setarrayitem(box1, index1, box3, descr1) h.invalidate_caches(rop.CALL, FakeCallDescr(FakeEffectinfo.EF_CAN_RAISE), []) assert h.getarrayitem(box1, index1, descr1) is box3
def test_ll_arraycopy_result_propogated(self): h = HeapCache() box1 = RefFrontendOp(1) box2 = RefFrontendOp(2) box3 = RefFrontendOp(3) h.setarrayitem(box1, index1, box2, descr1) h.invalidate_caches(rop.CALL_N, arraycopydescr1, [None, box1, box3, index1, index1, index2]) assert h.getarrayitem(box3, index1, descr1) is box2
def test_heapcache_write_fields_multiple_array(self): h = HeapCache() h.setarrayitem(box1, index1, box2, descr1) assert h.getarrayitem(box1, index1, descr1) is box2 h.setarrayitem(box3, index1, box4, descr1) assert h.getarrayitem(box3, index1, descr1) is box4 assert h.getarrayitem(box1, index1, descr1) is None # box1 and box3 can alias h = HeapCache() h.new(box1) h.setarrayitem(box1, index1, box2, descr1) assert h.getarrayitem(box1, index1, descr1) is box2 h.setarrayitem(box3, index1, box4, descr1) assert h.getarrayitem(box3, index1, descr1) is box4 assert h.getarrayitem(box1, index1, descr1) is None # box1 and box3 can alias h = HeapCache() h.new(box1) h.new(box3) h.setarrayitem(box1, index1, box2, descr1) assert h.getarrayitem(box1, index1, descr1) is box2 h.setarrayitem(box3, index1, box4, descr1) assert h.getarrayitem(box3, index1, descr1) is box4 assert h.getarrayitem(box1, index1, descr1) is box2 # box1 and box3 cannot alias h.setarrayitem(box1, index1, box3, descr1) assert h.getarrayitem(box3, index1, descr1) is box4 assert h.getarrayitem(box1, index1, descr1) is box3 # box1 and box3 cannot alias
def test_replace_box_with_const_in_array(self): h = HeapCache() box1 = RefFrontendOp(1) lengthbox2 = IntFrontendOp(2) lengthbox2.setint(10) h.arraylen_now_known(box1, lengthbox2) assert h.arraylen(box1) is lengthbox2 c10 = ConstInt(10) h.replace_box(lengthbox2, c10) assert c10.same_constant(h.arraylen(box1)) box2 = IntFrontendOp(2) box2.setint(12) h.setarrayitem(box1, index2, box2, descr1) assert h.getarrayitem(box1, index2, descr1) is box2 c12 = ConstInt(12) h.replace_box(box2, c12) assert c12.same_constant(h.getarrayitem(box1, index2, descr1))
def test_replace_box_array(self): h = HeapCache() h.setarrayitem(box1, index1, box2, descr1) h.setarrayitem(box1, index1, box3, descr2) h.arraylen_now_known(box1, lengthbox1) h.setarrayitem(box2, index2, box1, descr1) h.setarrayitem(box3, index2, box1, descr2) h.setarrayitem(box2, index2, box3, descr3) h.replace_box(box1, box4) assert h.arraylen(box4) is lengthbox1 assert h.getarrayitem(box4, index1, descr1) is box2 assert h.getarrayitem(box4, index1, descr2) is box3 assert h.getarrayitem(box2, index2, descr1) is box4 assert h.getarrayitem(box3, index2, descr2) is box4 assert h.getarrayitem(box2, index2, descr3) is box3 h.replace_box(lengthbox1, lengthbox2) assert h.arraylen(box4) is lengthbox2
def test_ll_arraycopy_result_propogated(self): h = HeapCache() h.setarrayitem(box1, index1, box2, descr1) h.invalidate_caches( rop.CALL, FakeCallDescr(FakeEffectinfo.EF_CANNOT_RAISE, FakeEffectinfo.OS_ARRAYCOPY, write_descrs_arrays=[descr1]), [None, box1, box3, index1, index1, index2] ) assert h.getarrayitem(box3, index1, descr1) is box2
def test_ll_arraycopy_result_propogated(self): h = HeapCache() h.setarrayitem(box1, index1, box2, descr1) h.invalidate_caches( rop.CALL, arraycopydescr1, [None, box1, box3, index1, index1, index2] ) assert h.getarrayitem(box3, index1, descr1) is box2
def test_replace_box_array(self): py.test.skip("replacing a box with another box: not supported any more") h = HeapCache() h.setarrayitem(box1, index1, box2, descr1) h.setarrayitem(box1, index1, box3, descr2) h.arraylen_now_known(box1, lengthbox1) h.setarrayitem(box2, index2, box1, descr1) h.setarrayitem(box3, index2, box1, descr2) h.setarrayitem(box2, index2, box3, descr3) h.replace_box(box1, box4) assert h.arraylen(box4) is lengthbox1 assert h.getarrayitem(box4, index1, descr1) is box2 assert h.getarrayitem(box4, index1, descr2) is box3 assert h.getarrayitem(box2, index2, descr1) is box4 assert h.getarrayitem(box3, index2, descr2) is box4 assert h.getarrayitem(box2, index2, descr3) is box3 h.replace_box(lengthbox1, lengthbox2) assert h.arraylen(box4) is lengthbox2
def test_heapcache_arrays(self): h = HeapCache() assert h.getarrayitem(box1, index1, descr1) is None assert h.getarrayitem(box1, index1, descr2) is None assert h.getarrayitem(box1, index2, descr1) is None assert h.getarrayitem(box1, index2, descr2) is None h.setarrayitem(box1, index1, box2, descr1) assert h.getarrayitem(box1, index1, descr1) is box2 assert h.getarrayitem(box1, index1, descr2) is None assert h.getarrayitem(box1, index2, descr1) is None assert h.getarrayitem(box1, index2, descr2) is None h.setarrayitem(box1, index2, box4, descr1) assert h.getarrayitem(box1, index1, descr1) is box2 assert h.getarrayitem(box1, index1, descr2) is None assert h.getarrayitem(box1, index2, descr1) is box4 assert h.getarrayitem(box1, index2, descr2) is None h.setarrayitem(box1, index1, box3, descr2) assert h.getarrayitem(box1, index1, descr1) is box2 assert h.getarrayitem(box1, index1, descr2) is box3 assert h.getarrayitem(box1, index2, descr1) is box4 assert h.getarrayitem(box1, index2, descr2) is None h.setarrayitem(box1, index1, box3, descr1) assert h.getarrayitem(box1, index1, descr1) is box3 assert h.getarrayitem(box1, index1, descr2) is box3 assert h.getarrayitem(box1, index2, descr1) is box4 assert h.getarrayitem(box1, index2, descr2) is None h.setarrayitem(box3, index1, box1, descr1) assert h.getarrayitem(box3, index1, descr1) is box1 assert h.getarrayitem(box1, index1, descr1) is None assert h.getarrayitem(box1, index1, descr2) is box3 assert h.getarrayitem(box1, index2, descr1) is box4 assert h.getarrayitem(box1, index2, descr2) is None h.reset() assert h.getarrayitem(box1, index1, descr1) is None assert h.getarrayitem(box1, index1, descr2) is None assert h.getarrayitem(box3, index1, descr1) is None
def test_heapcache_arrays(self): h = HeapCache() box1 = RefFrontendOp(1) box2 = RefFrontendOp(2) box3 = RefFrontendOp(3) box4 = RefFrontendOp(4) assert h.getarrayitem(box1, index1, descr1) is None assert h.getarrayitem(box1, index1, descr2) is None assert h.getarrayitem(box1, index2, descr1) is None assert h.getarrayitem(box1, index2, descr2) is None h.setarrayitem(box1, index1, box2, descr1) assert h.getarrayitem(box1, index1, descr1) is box2 assert h.getarrayitem(box1, index1, descr2) is None assert h.getarrayitem(box1, index2, descr1) is None assert h.getarrayitem(box1, index2, descr2) is None h.setarrayitem(box1, index2, box4, descr1) assert h.getarrayitem(box1, index1, descr1) is box2 assert h.getarrayitem(box1, index1, descr2) is None assert h.getarrayitem(box1, index2, descr1) is box4 assert h.getarrayitem(box1, index2, descr2) is None h.setarrayitem(box1, index1, box3, descr2) assert h.getarrayitem(box1, index1, descr1) is box2 assert h.getarrayitem(box1, index1, descr2) is box3 assert h.getarrayitem(box1, index2, descr1) is box4 assert h.getarrayitem(box1, index2, descr2) is None h.setarrayitem(box1, index1, box3, descr1) assert h.getarrayitem(box1, index1, descr1) is box3 assert h.getarrayitem(box1, index1, descr2) is box3 assert h.getarrayitem(box1, index2, descr1) is box4 assert h.getarrayitem(box1, index2, descr2) is None h.setarrayitem(box3, index1, box1, descr1) assert h.getarrayitem(box3, index1, descr1) is box1 assert h.getarrayitem(box1, index1, descr1) is None assert h.getarrayitem(box1, index1, descr2) is box3 assert h.getarrayitem(box1, index2, descr1) is box4 assert h.getarrayitem(box1, index2, descr2) is None h.reset() assert h.getarrayitem(box1, index1, descr1) is None assert h.getarrayitem(box1, index1, descr2) is None assert h.getarrayitem(box3, index1, descr1) is None