iv tables cannot shrink.  If the inline cache was ever set, then there
must be an entry for the instance variable in the iv table.  Just set
the iv list on the object to be equal to the iv index table size, then
set the iv.
This commit is contained in:
Aaron Patterson 2020-11-06 11:33:43 -08:00 коммит произвёл Aaron Patterson
Родитель eb229994e5
Коммит 5582c5a232
1 изменённых файлов: 7 добавлений и 14 удалений

Просмотреть файл

@ -1213,21 +1213,14 @@ vm_setivar(VALUE obj, ID id, VALUE val, const rb_iseq_t *iseq, IVC ic, const str
VALUE *ptr = ROBJECT_IVPTR(obj);
index = !is_attr ? ic->entry->index : vm_cc_attr_index(cc)-1;
if (index < ROBJECT_NUMIV(obj)) {
RB_OBJ_WRITE(obj, &ptr[index], val);
RB_DEBUG_COUNTER_INC(ivar_set_ic_hit);
return val; /* inline cache hit */
} else {
st_table * iv_idx_tbl = RCLASS_IV_INDEX_TBL(rb_class_real(klass));
if (index < iv_idx_tbl->num_entries) {
rb_init_iv_list(obj, ROBJECT_NUMIV(obj), iv_idx_tbl->num_entries, iv_idx_tbl);
ptr = ROBJECT_IVPTR(obj);
RB_OBJ_WRITE(obj, &ptr[index], val);
RB_DEBUG_COUNTER_INC(ivar_set_ic_hit);
return val; /* inline cache hit */
}
if (index >= ROBJECT_NUMIV(obj)) {
st_table * iv_idx_tbl = ROBJECT_IV_INDEX_TBL(obj);
rb_init_iv_list(obj, ROBJECT_NUMIV(obj), (uint32_t)iv_idx_tbl->num_entries, iv_idx_tbl);
ptr = ROBJECT_IVPTR(obj);
}
RB_DEBUG_COUNTER_INC(ivar_set_ic_miss_oorange);
RB_OBJ_WRITE(obj, &ptr[index], val);
RB_DEBUG_COUNTER_INC(ivar_set_ic_hit);
return val; /* inline cache hit */
}
else {
struct st_table *iv_index_tbl = ROBJECT_IV_INDEX_TBL(obj);