bool GlobalCache::resolve_i(STATE, Symbol* name, Dispatch& msg, LookupData& lookup) { utilities::thread::SpinLock::LockGuard guard(lock_); Module* klass = lookup.from; CacheEntry* entry = this->lookup(state, klass, name); if(entry) { if(lookup.min_visibility == G(sym_private) || entry->visibility == G(sym_public) || lookup.min_visibility == entry->visibility) { msg.method = entry->method; msg.module = entry->module; msg.visibility = entry->visibility; return true; } } if(hierarchy_resolve(state, name, msg, lookup)) { retain_i(state, klass, name, msg.module, msg.method, msg.visibility); return true; } return false; }
bool GlobalCache::resolve(STATE, Symbol* name, Dispatch& msg, LookupData& lookup) { struct GlobalCache::cache_entry* entry; Module* klass = lookup.from; entry = state->global_cache()->lookup(state, klass, name); if(entry) { if(lookup.priv || entry->is_public) { msg.method = entry->method; msg.module = entry->module; msg.method_missing = entry->method_missing; return true; } } bool was_private = false; if(hierarchy_resolve(state, name, msg, lookup, &was_private)) { state->global_cache()->retain(state, lookup.from, name, msg.module, msg.method, msg.method_missing, was_private); return true; } return false; }