Home | History | Annotate | Download | only in src
      1 // Copyright 2016 the V8 project authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef V8_LOOKUP_CACHE_H_
      6 #define V8_LOOKUP_CACHE_H_
      7 
      8 #include "src/objects.h"
      9 
     10 namespace v8 {
     11 namespace internal {
     12 
     13 // Cache for mapping (map, property name) into descriptor index.
     14 // The cache contains both positive and negative results.
     15 // Descriptor index equals kNotFound means the property is absent.
     16 // Cleared at startup and prior to any gc.
     17 class DescriptorLookupCache {
     18  public:
     19   // Lookup descriptor index for (map, name).
     20   // If absent, kAbsent is returned.
     21   inline int Lookup(Map* source, Name* name);
     22 
     23   // Update an element in the cache.
     24   inline void Update(Map* source, Name* name, int result);
     25 
     26   // Clear the cache.
     27   void Clear();
     28 
     29   static const int kAbsent = -2;
     30 
     31  private:
     32   DescriptorLookupCache() {
     33     for (int i = 0; i < kLength; ++i) {
     34       keys_[i].source = NULL;
     35       keys_[i].name = NULL;
     36       results_[i] = kAbsent;
     37     }
     38   }
     39 
     40   static inline int Hash(Object* source, Name* name);
     41 
     42   static const int kLength = 64;
     43   struct Key {
     44     Map* source;
     45     Name* name;
     46   };
     47 
     48   Key keys_[kLength];
     49   int results_[kLength];
     50 
     51   friend class Isolate;
     52   DISALLOW_COPY_AND_ASSIGN(DescriptorLookupCache);
     53 };
     54 
     55 }  // namespace internal
     56 }  // namespace v8
     57 
     58 #endif  // V8_LOOKUP_CACHE_H_
     59