diff options
Diffstat (limited to 'vm_insnhelper.c')
-rw-r--r-- | vm_insnhelper.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/vm_insnhelper.c b/vm_insnhelper.c index 5cb7f1687c..8b44a44420 100644 --- a/vm_insnhelper.c +++ b/vm_insnhelper.c @@ -1603,12 +1603,19 @@ rb_vm_search_method_slowpath(VALUE cd_owner, struct rb_call_data *cd, VALUE klas { const struct rb_callcache *cc = vm_search_cc(klass, cd->ci); - if (cd_owner) { - RB_OBJ_WRITE(cd_owner, &cd->cc, cc); + VM_ASSERT(cc); + VM_ASSERT(IMEMO_TYPE_P(cc, imemo_callcache)); + + if (! cd_owner) { + cd->cc = cc; } - else { + else if (cc == &vm_empty_cc) { cd->cc = cc; } + else { + VM_ASSERT(vm_cc_markable(cc)); + RB_OBJ_WRITE(cd_owner, &cd->cc, cc); + } VM_ASSERT(cc == vm_cc_empty() || cc->klass == klass); VM_ASSERT(cc == vm_cc_empty() || callable_method_entry_p(vm_cc_cme(cc))); |