Object* RespondToCache::check_cache(STATE, CallSite* call_site, CallFrame* call_frame,
                                    Arguments& args) {
    RespondToCache* cache = static_cast<RespondToCache*>(call_site);

    Class* const recv_class = args.recv()->direct_class(state);
    if(args.total() > 0) {
        Object* const message   = args.get_argument(0);
        Object* visibility      = cFalse;
        if(args.total() > 1) {
            visibility            = args.get_argument(1);
        }

        uint64_t recv_data = recv_class->data_raw();
        if(likely(recv_data == cache->receiver_data_raw() && message == cache->message_ && visibility == cache->visibility_)) {
            cache->hit();
            return cache->responds_;
        }
    }

    return cache->fallback_call_site_->execute(state, call_frame, args);
}
RespondToCache* RespondToCache::create(STATE, CallSite* fallback,
                                       Object* recv, Symbol* msg, Object* priv, Object* res, int hits) {

    RespondToCache* cache =
        state->vm()->new_object<RespondToCache>(G(respond_to_cache));

    Class* recv_class = recv->direct_class(state);
    cache->fallback_call_site(state, fallback);
    cache->executable(state, fallback->executable());
    cache->name(state, fallback->name());
    cache->receiver_class(state, recv_class);
    cache->visibility(state, priv);
    cache->message(state, msg);
    cache->responds(state, res);
    cache->ip_              = fallback->ip();
    cache->executor_        = check_cache;
    cache->fallback_        = check_cache;
    cache->updater_         = NULL;
    cache->hits_            = hits;
    uint64_t recv_data = recv_class->data_raw();
    cache->set_receiver_data(recv_data);
    return cache;
}
  RespondToCache* RespondToCache::create(STATE, CallSite* fallback,
                    Object* recv, Symbol* msg, Object* priv, Object* res, int hits) {

    RespondToCache* cache =
      state->memory()->new_object<RespondToCache>(state, G(respond_to_cache));

    Class* recv_class = recv->direct_class(state);

    cache->fallback_call_site(state, fallback);
    cache->executable(state, fallback->executable());
    cache->name(state, fallback->name());
    cache->receiver_class(state, recv_class);
    cache->visibility(state, priv);
    cache->message(state, msg);
    cache->responds(state, res);

    cache->ip(fallback->ip());
    cache->executor(check_cache);
    cache->fallback(check_cache);
    cache->updater(NULL);
    cache->hits(hits);
    cache->receiver_data(recv_class->class_data());

    return cache;
  }