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);
}