| Index: src/lookup.h
|
| diff --git a/src/lookup.h b/src/lookup.h
|
| index 736cebc0900ef9464db1affcace11d59fdfc0af8..e23183e813884d6d129d5b3c3713d4c321bff593 100644
|
| --- a/src/lookup.h
|
| +++ b/src/lookup.h
|
| @@ -12,6 +12,107 @@
|
| 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);
|
| +};
|
| +
|
| class LookupIterator final BASE_EMBEDDED {
|
| public:
|
| enum Configuration {
|
|
|