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_OBJECTS_LOOKUP_CACHE_H_
6 #define V8_OBJECTS_LOOKUP_CACHE_H_
7 
8 #include "src/objects/map.h"
9 #include "src/objects/name.h"
10 #include "src/objects/objects.h"
11 
12 namespace v8 {
13 namespace internal {
14 
15 // Cache for mapping (map, property name) into descriptor index.
16 // The cache contains both positive and negative results.
17 // Descriptor index equals kNotFound means the property is absent.
18 // Cleared at startup and prior to any gc.
19 class DescriptorLookupCache {
20  public:
21   DescriptorLookupCache(const DescriptorLookupCache&) = delete;
22   DescriptorLookupCache& operator=(const DescriptorLookupCache&) = delete;
23   // Lookup descriptor index for (map, name).
24   // If absent, kAbsent is returned.
25   inline int Lookup(Map source, Name name);
26 
27   // Update an element in the cache.
28   inline void Update(Map source, Name name, int result);
29 
30   // Clear the cache.
31   void Clear();
32 
33   static const int kAbsent = -2;
34 
35  private:
DescriptorLookupCache()36   DescriptorLookupCache() {
37     for (int i = 0; i < kLength; ++i) {
38       keys_[i].source = Map();
39       keys_[i].name = Name();
40       results_[i] = kAbsent;
41     }
42   }
43 
44   static inline int Hash(Map source, Name name);
45 
46   static const int kLength = 64;
47   struct Key {
48     Map source;
49     Name name;
50   };
51 
52   Key keys_[kLength];
53   int results_[kLength];
54 
55   friend class Isolate;
56 };
57 
58 }  // namespace internal
59 }  // namespace v8
60 
61 #endif  // V8_OBJECTS_LOOKUP_CACHE_H_
62