Skip to content

Commit

Permalink
Remove iv table size check
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
tenderlove committed Nov 9, 2020
1 parent eb22999 commit 5582c5a
Showing 1 changed file with 7 additions and 14 deletions.
21 changes: 7 additions & 14 deletions vm_insnhelper.c
Expand Up @@ -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);
Expand Down

0 comments on commit 5582c5a

Please sign in to comment.