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:
parent
eb229994e5
commit
5582c5a232
Notes:
git
2020-11-10 02:44:52 +09:00
1 changed files with 7 additions and 14 deletions
|
@ -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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue