Exemple #1
0
  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;
  }