1f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// Copyright 2016 the V8 project authors. All rights reserved. 2f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// found in the LICENSE file. 4f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 5f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#include "src/lookup-cache.h" 6f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 7f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#include "src/objects-inl.h" 8f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 9f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochnamespace v8 { 10f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochnamespace internal { 11f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 12f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// static 13f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochint DescriptorLookupCache::Hash(Object* source, Name* name) { 14f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DCHECK(name->IsUniqueName()); 15f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Uses only lower 32 bits if pointers are larger. 16f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch uint32_t source_hash = 17f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static_cast<uint32_t>(reinterpret_cast<uintptr_t>(source)) >> 18f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch kPointerSizeLog2; 19f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch uint32_t name_hash = name->hash_field(); 20f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return (source_hash ^ name_hash) % kLength; 21f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch} 22f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 23f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochint DescriptorLookupCache::Lookup(Map* source, Name* name) { 24f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch int index = Hash(source, name); 25f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Key& key = keys_[index]; 26f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch if ((key.source == source) && (key.name == name)) return results_[index]; 27f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return kAbsent; 28f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch} 29f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 30f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochvoid DescriptorLookupCache::Update(Map* source, Name* name, int result) { 31f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DCHECK(result != kAbsent); 32f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch int index = Hash(source, name); 33f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Key& key = keys_[index]; 34f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch key.source = source; 35f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch key.name = name; 36f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch results_[index] = result; 37f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch} 38f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 39f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch} // namespace internal 40f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch} // namespace v8 41