Пример #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;
  }
Пример #2
0
  bool InlineCache::update_and_validate_private(STATE, CallFrame* call_frame, Object* recv) {
    if(valid_p(state, recv)) return true;

    set_klass(recv->lookup_begin(state));

    if(!fill_private(state, name, klass())) {
      return false;
    }

    update_seen_classes();
    run_wb(state, call_frame->cm);

    return true;
  }
Пример #3
0
  MethodCacheEntry* InlineCache::update_and_validate_private(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;

    if(!fill_private(state, name, recv_class, recv_class, mce)) return 0;

    update_seen_classes(mce);
    call_frame->cm->write_barrier(state, mce);

    return mce;
  }
Пример #4
0
  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;
  }