diff --git a/vm_eval.c b/vm_eval.c index f219e7037b..1caa76000b 100644 --- a/vm_eval.c +++ b/vm_eval.c @@ -396,8 +396,7 @@ cc_new(VALUE klass, ID mid, int argc, const rb_callable_method_entry_t *cme) ccs = (struct rb_class_cc_entries *)ccs_data; } else { - ccs = vm_ccs_create(klass, cme); - rb_id_table_insert(cc_tbl, mid, (VALUE)ccs); + ccs = vm_ccs_create(klass, cc_tbl, mid, cme); } for (int i=0; ilen; i++) { diff --git a/vm_insnhelper.c b/vm_insnhelper.c index a53ebf1cd9..acdd21dfc1 100644 --- a/vm_insnhelper.c +++ b/vm_insnhelper.c @@ -1871,7 +1871,7 @@ static VALUE vm_call_general(rb_execution_context_t *ec, rb_control_frame_t *reg static VALUE vm_mtbl_dump(VALUE klass, ID target_mid); static struct rb_class_cc_entries * -vm_ccs_create(VALUE klass, const rb_callable_method_entry_t *cme) +vm_ccs_create(VALUE klass, struct rb_id_table *cc_tbl, ID mid, const rb_callable_method_entry_t *cme) { struct rb_class_cc_entries *ccs = ALLOC(struct rb_class_cc_entries); #if VM_CHECK_MODE > 0 @@ -1879,9 +1879,12 @@ vm_ccs_create(VALUE klass, const rb_callable_method_entry_t *cme) #endif ccs->capa = 0; ccs->len = 0; - RB_OBJ_WRITE(klass, &ccs->cme, cme); + ccs->cme = cme; METHOD_ENTRY_CACHED_SET((rb_callable_method_entry_t *)cme); ccs->entries = NULL; + + rb_id_table_insert(cc_tbl, mid, (VALUE)ccs); + RB_OBJ_WRITTEN(klass, Qundef, cme); return ccs; } @@ -2032,8 +2035,7 @@ vm_search_cc(const VALUE klass, const struct rb_callinfo * const ci) } else { // TODO: required? - ccs = vm_ccs_create(klass, cme); - rb_id_table_insert(cc_tbl, mid, (VALUE)ccs); + ccs = vm_ccs_create(klass, cc_tbl, mid, cme); } } diff --git a/vm_method.c b/vm_method.c index 30241cc9cd..5f7264a53b 100644 --- a/vm_method.c +++ b/vm_method.c @@ -1330,8 +1330,7 @@ cache_callable_method_entry(VALUE klass, ID mid, const rb_callable_method_entry_ VM_ASSERT(ccs->cme == cme); } else { - ccs = vm_ccs_create(klass, cme); - rb_id_table_insert(cc_tbl, mid, (VALUE)ccs); + ccs = vm_ccs_create(klass, cc_tbl, mid, cme); } }