| // Copyright 2018 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_COMPILER_REFS_MAP_H_ |
| #define V8_COMPILER_REFS_MAP_H_ |
| |
| #include "src/base/hashmap.h" |
| #include "src/common/globals.h" |
| #include "src/zone/zone.h" |
| |
| namespace v8 { |
| namespace internal { |
| namespace compiler { |
| |
| class ObjectData; |
| |
| class AddressMatcher : public base::KeyEqualityMatcher<Address> { |
| public: |
| bool operator()(uint32_t hash1, uint32_t hash2, const Address& key1, |
| const Address& key2) const { |
| return key1 == key2; |
| } |
| }; |
| |
| // This class employs our own implementation of hash map for the purpose of |
| // storing the mapping between canonical Addresses and allocated ObjectData. |
| // It's used as the refs map in JSHeapBroker and as the snapshot in |
| // PerIsolateCompilerCache, as we need a cheap copy between the two and |
| // std::unordered_map doesn't satisfy this requirement, as it rehashes the |
| // whole map and copies all entries one by one. |
| class RefsMap |
| : public base::TemplateHashMapImpl<Address, ObjectData*, AddressMatcher, |
| ZoneAllocationPolicy>, |
| public ZoneObject { |
| public: |
| RefsMap(uint32_t capacity, AddressMatcher match, Zone* zone); |
| RefsMap(const RefsMap* other, Zone* zone); |
| |
| bool IsEmpty() const { return occupancy() == 0; } |
| |
| // Wrappers around methods from UnderlyingMap |
| Entry* Lookup(const Address& key) const; |
| Entry* LookupOrInsert(const Address& key); |
| |
| private: |
| static uint32_t Hash(Address addr); |
| }; |
| |
| } // namespace compiler |
| } // namespace internal |
| } // namespace v8 |
| |
| #endif // V8_COMPILER_REFS_MAP_H_ |