If the ivar index table exists, we can avoid the slowest path for
setting ivars.
This commit is contained in:
Aaron Patterson 2020-11-09 11:20:29 -08:00 коммит произвёл Aaron Patterson
Родитель 6778ba48fd
Коммит f259906eab
1 изменённых файлов: 11 добавлений и 0 удалений

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

@ -1237,6 +1237,17 @@ vm_setivar(VALUE obj, ID id, VALUE val, const rb_iseq_t *iseq, IVC ic, const str
else {
vm_cc_attr_index_set(cc, (int)(ent->index + 1));
}
index = ent->index;
VALUE *ptr = ROBJECT_IVPTR(obj);
if (index >= ROBJECT_NUMIV(obj)) {
rb_init_iv_list(obj, ROBJECT_NUMIV(obj), (uint32_t)iv_index_tbl->num_entries, iv_index_tbl);
ptr = ROBJECT_IVPTR(obj);
}
RB_OBJ_WRITE(obj, &ptr[index], val);
return val;
}
/* fall through */
}