summaryrefslogtreecommitdiff
path: root/vm_insnhelper.c
diff options
context:
space:
mode:
Diffstat (limited to 'vm_insnhelper.c')
-rw-r--r--vm_insnhelper.c13
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)));