1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

Remove iv table size check

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 committed by Aaron Patterson
parent eb229994e5
commit 5582c5a232
Notes: git 2020-11-10 02:44:52 +09:00

View file

@ -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);