Ejemplo n.º 1
0
  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;
  }
Ejemplo n.º 2
0
  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;
  }