| Index: src/lookup-cache.h
 | 
| diff --git a/src/lookup-cache.h b/src/lookup-cache.h
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..6da5e5b3d71af4b01f3c6e522e021ade976bec64
 | 
| --- /dev/null
 | 
| +++ b/src/lookup-cache.h
 | 
| @@ -0,0 +1,117 @@
 | 
| +// Copyright 2016 the V8 project authors. All rights reserved.
 | 
| +// Use of this source code is governed by a BSD-style license that can be
 | 
| +// found in the LICENSE file.
 | 
| +
 | 
| +#ifndef V8_LOOKUP_CACHE_H_
 | 
| +#define V8_LOOKUP_CACHE_H_
 | 
| +
 | 
| +#include "src/objects.h"
 | 
| +
 | 
| +namespace v8 {
 | 
| +namespace internal {
 | 
| +
 | 
| +// Cache for mapping (map, property name) into descriptor index.
 | 
| +// The cache contains both positive and negative results.
 | 
| +// Descriptor index equals kNotFound means the property is absent.
 | 
| +// Cleared at startup and prior to any gc.
 | 
| +class DescriptorLookupCache {
 | 
| + public:
 | 
| +  // Lookup descriptor index for (map, name).
 | 
| +  // If absent, kAbsent is returned.
 | 
| +  inline int Lookup(Map* source, Name* name);
 | 
| +
 | 
| +  // Update an element in the cache.
 | 
| +  inline void Update(Map* source, Name* name, int result);
 | 
| +
 | 
| +  // Clear the cache.
 | 
| +  void Clear();
 | 
| +
 | 
| +  static const int kAbsent = -2;
 | 
| +
 | 
| + private:
 | 
| +  DescriptorLookupCache() {
 | 
| +    for (int i = 0; i < kLength; ++i) {
 | 
| +      keys_[i].source = NULL;
 | 
| +      keys_[i].name = NULL;
 | 
| +      results_[i] = kAbsent;
 | 
| +    }
 | 
| +  }
 | 
| +
 | 
| +  static inline int Hash(Object* source, Name* name);
 | 
| +
 | 
| +  static const int kLength = 64;
 | 
| +  struct Key {
 | 
| +    Map* source;
 | 
| +    Name* name;
 | 
| +  };
 | 
| +
 | 
| +  Key keys_[kLength];
 | 
| +  int results_[kLength];
 | 
| +
 | 
| +  friend class Isolate;
 | 
| +  DISALLOW_COPY_AND_ASSIGN(DescriptorLookupCache);
 | 
| +};
 | 
| +
 | 
| +// Cache for mapping (map, property name) into field offset.
 | 
| +// Cleared at startup and prior to mark sweep collection.
 | 
| +class KeyedLookupCache {
 | 
| + public:
 | 
| +  // Lookup field offset for (map, name). If absent, -1 is returned.
 | 
| +  int Lookup(Handle<Map> map, Handle<Name> name);
 | 
| +
 | 
| +  // Update an element in the cache.
 | 
| +  void Update(Handle<Map> map, Handle<Name> name, int field_offset);
 | 
| +
 | 
| +  // Clear the cache.
 | 
| +  void Clear();
 | 
| +
 | 
| +  static const int kLength = 256;
 | 
| +  static const int kCapacityMask = kLength - 1;
 | 
| +  static const int kMapHashShift = 5;
 | 
| +  static const int kHashMask = -4;  // Zero the last two bits.
 | 
| +  static const int kEntriesPerBucket = 4;
 | 
| +  static const int kEntryLength = 2;
 | 
| +  static const int kMapIndex = 0;
 | 
| +  static const int kKeyIndex = 1;
 | 
| +  static const int kNotFound = -1;
 | 
| +
 | 
| +  // kEntriesPerBucket should be a power of 2.
 | 
| +  STATIC_ASSERT((kEntriesPerBucket & (kEntriesPerBucket - 1)) == 0);
 | 
| +  STATIC_ASSERT(kEntriesPerBucket == -kHashMask);
 | 
| +
 | 
| + private:
 | 
| +  KeyedLookupCache() {
 | 
| +    for (int i = 0; i < kLength; ++i) {
 | 
| +      keys_[i].map = NULL;
 | 
| +      keys_[i].name = NULL;
 | 
| +      field_offsets_[i] = kNotFound;
 | 
| +    }
 | 
| +  }
 | 
| +
 | 
| +  static inline int Hash(Handle<Map> map, Handle<Name> name);
 | 
| +
 | 
| +  // Get the address of the keys and field_offsets arrays.  Used in
 | 
| +  // generated code to perform cache lookups.
 | 
| +  Address keys_address() { return reinterpret_cast<Address>(&keys_); }
 | 
| +
 | 
| +  Address field_offsets_address() {
 | 
| +    return reinterpret_cast<Address>(&field_offsets_);
 | 
| +  }
 | 
| +
 | 
| +  struct Key {
 | 
| +    Map* map;
 | 
| +    Name* name;
 | 
| +  };
 | 
| +
 | 
| +  Key keys_[kLength];
 | 
| +  int field_offsets_[kLength];
 | 
| +
 | 
| +  friend class ExternalReference;
 | 
| +  friend class Isolate;
 | 
| +  DISALLOW_COPY_AND_ASSIGN(KeyedLookupCache);
 | 
| +};
 | 
| +
 | 
| +}  // namespace internal
 | 
| +}  // namespace v8
 | 
| +
 | 
| +#endif  // V8_LOOKUP_CACHE_H_
 | 
| 
 |