// 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_OBJECTS_LOOKUP_CACHE_H_
#define V8_OBJECTS_LOOKUP_CACHE_H_

#include "src/objects/map.h"
#include "src/objects/name.h"
#include "src/objects/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:
  DescriptorLookupCache(const DescriptorLookupCache&) = delete;
  DescriptorLookupCache& operator=(const DescriptorLookupCache&) = delete;
  // 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 = Map();
      keys_[i].name = Name();
      results_[i] = kAbsent;
    }
  }

  static inline int Hash(Map source, Name name);

  static const int kLength = 64;
  struct Key {
    Map source;
    Name name;
  };

  Key keys_[kLength];
  int results_[kLength];

  friend class Isolate;
};

}  // namespace internal
}  // namespace v8

#endif  // V8_OBJECTS_LOOKUP_CACHE_H_
