bool InlineCache::update_and_validate(STATE, CallFrame* call_frame, Object* recv) { if(valid_p(state, recv)) return true; set_klass(recv->lookup_begin(state)); MethodMissingReason reason = fill_public(state, call_frame->self(), name); if(reason != eNone) return false; update_seen_classes(); run_wb(state, call_frame->cm); return true; }
MethodCacheEntry* InlineCache::update_and_validate(STATE, CallFrame* call_frame, Object* recv) { MethodCacheEntry* mce = cache_; Class* const recv_class = recv->lookup_begin(state); if(likely(mce && mce->receiver_class() == recv_class)) return mce; MethodMissingReason reason = fill_public(state, call_frame->self(), name, recv_class, mce); if(reason != eNone) return 0; update_seen_classes(mce); call_frame->cm->write_barrier(state, mce); return mce; }