| Index: third_party/WebKit/Source/core/dom/WeakIdentifierMap.h
|
| diff --git a/third_party/WebKit/Source/core/dom/WeakIdentifierMap.h b/third_party/WebKit/Source/core/dom/WeakIdentifierMap.h
|
| index aa0791a7da332549d67e25fc24a8576c7fce50a0..b430f3375b52a2d7527c8546b54b8c28488de2d8 100644
|
| --- a/third_party/WebKit/Source/core/dom/WeakIdentifierMap.h
|
| +++ b/third_party/WebKit/Source/core/dom/WeakIdentifierMap.h
|
| @@ -8,97 +8,48 @@
|
| #include "platform/heap/Handle.h"
|
| #include "wtf/Allocator.h"
|
| #include "wtf/HashMap.h"
|
| -#include "wtf/Vector.h"
|
|
|
| namespace blink {
|
|
|
| -template<typename T> struct IdentifierGenerator;
|
| +// TODO(sof): WeakIdentifierMap<> belongs (out) in wtf/, but
|
| +// cannot until GarbageCollected<> can be used from WTF.
|
|
|
| -template<> struct IdentifierGenerator<int> {
|
| - STATIC_ONLY(IdentifierGenerator);
|
| - using IdentifierType = int;
|
| - static IdentifierType next()
|
| - {
|
| - static int s_lastId = 0;
|
| - return ++s_lastId;
|
| - }
|
| -};
|
| +template<typename T, typename IdentifierType, bool isGarbageCollected>
|
| +class WeakIdentifierMapBase {
|
| + USING_FAST_MALLOC(WeakIdentifierMapBase);
|
| +protected:
|
| + using ObjectToIdentifier = HashMap<T*, IdentifierType>;
|
| + using IdentifierToObject = HashMap<IdentifierType, T*>;
|
|
|
| -template<typename T> struct WeakIdentifierMapTraits {
|
| - STATIC_ONLY(WeakIdentifierMapTraits);
|
| - static void removedFromIdentifierMap(T*) { }
|
| - static void addedToIdentifierMap(T*) { }
|
| + ObjectToIdentifier m_objectToIdentifier;
|
| + IdentifierToObject m_identifierToObject;
|
| };
|
|
|
| -template<typename T,
|
| - typename Generator = IdentifierGenerator<int>,
|
| - typename Traits = WeakIdentifierMapTraits<T>,
|
| - bool isGarbageCollected = IsGarbageCollectedType<T>::value> class WeakIdentifierMap;
|
| -
|
| -template<typename T, typename Generator, typename Traits> class WeakIdentifierMap<T, Generator, Traits, false> {
|
| - USING_FAST_MALLOC(WeakIdentifierMap);
|
| +template<typename T, typename IdentifierType>
|
| +class WeakIdentifierMapBase<T, IdentifierType, true> : public GarbageCollected<WeakIdentifierMapBase<T, IdentifierType, true>> {
|
| public:
|
| - using IdentifierType = typename Generator::IdentifierType;
|
| -
|
| - static IdentifierType identifier(T* object)
|
| - {
|
| - IdentifierType result = instance().m_objectToIdentifier.get(object);
|
| -
|
| - if (WTF::isHashTraitsEmptyValue<HashTraits<IdentifierType>>(result)) {
|
| - result = Generator::next();
|
| - instance().put(object, result);
|
| - }
|
| - return result;
|
| - }
|
| -
|
| - static T* lookup(IdentifierType identifier)
|
| - {
|
| - return instance().m_identifierToObject.get(identifier);
|
| - }
|
| -
|
| - static void notifyObjectDestroyed(T* object)
|
| - {
|
| - instance().objectDestroyed(object);
|
| - }
|
| -
|
| -private:
|
| - static WeakIdentifierMap<T, Generator, Traits>& instance();
|
| - WeakIdentifierMap() { }
|
| - ~WeakIdentifierMap();
|
| -
|
| - void put(T* object, IdentifierType identifier)
|
| - {
|
| - DCHECK(object && !m_objectToIdentifier.contains(object));
|
| - m_objectToIdentifier.set(object, identifier);
|
| - m_identifierToObject.set(identifier, object);
|
| - Traits::addedToIdentifierMap(object);
|
| - }
|
| -
|
| - void objectDestroyed(T* object)
|
| + DEFINE_INLINE_TRACE()
|
| {
|
| - IdentifierType identifier = m_objectToIdentifier.take(object);
|
| - if (!WTF::isHashTraitsEmptyValue<HashTraits<IdentifierType>>(identifier))
|
| - m_identifierToObject.remove(identifier);
|
| + visitor->trace(m_objectToIdentifier);
|
| + visitor->trace(m_identifierToObject);
|
| }
|
| -
|
| - using ObjectToIdentifier = HashMap<T*, IdentifierType>;
|
| - using IdentifierToObject = HashMap<IdentifierType, T*>;
|
| +protected:
|
| + using ObjectToIdentifier = HeapHashMap<WeakMember<T>, IdentifierType>;
|
| + using IdentifierToObject = HeapHashMap<IdentifierType, WeakMember<T>>;
|
|
|
| ObjectToIdentifier m_objectToIdentifier;
|
| IdentifierToObject m_identifierToObject;
|
| };
|
|
|
| -template<typename T, typename Generator, typename Traits> class WeakIdentifierMap<T, Generator, Traits, true>
|
| - : public GarbageCollected<WeakIdentifierMap<T, Generator, Traits, true>> {
|
| +template<typename T, typename IdentifierType = int>
|
| +class WeakIdentifierMap final : public WeakIdentifierMapBase<T, IdentifierType, IsGarbageCollectedType<T>::value> {
|
| public:
|
| - using IdentifierType = typename Generator::IdentifierType;
|
| -
|
| static IdentifierType identifier(T* object)
|
| {
|
| - IdentifierType result = instance().m_objectToIdentifier->get(object);
|
| + IdentifierType result = instance().m_objectToIdentifier.get(object);
|
|
|
| if (WTF::isHashTraitsEmptyValue<HashTraits<IdentifierType>>(result)) {
|
| - result = Generator::next();
|
| + result = next();
|
| instance().put(object, result);
|
| }
|
| return result;
|
| @@ -106,38 +57,38 @@ public:
|
|
|
| static T* lookup(IdentifierType identifier)
|
| {
|
| - return instance().m_identifierToObject->get(identifier);
|
| + return instance().m_identifierToObject.get(identifier);
|
| }
|
|
|
| - static void notifyObjectDestroyed(T* object) { }
|
| -
|
| - DEFINE_INLINE_TRACE()
|
| + static void notifyObjectDestroyed(T* object)
|
| {
|
| - visitor->trace(m_objectToIdentifier);
|
| - visitor->trace(m_identifierToObject);
|
| + instance().objectDestroyed(object);
|
| }
|
|
|
| private:
|
| - static WeakIdentifierMap<T, Generator, Traits>& instance();
|
| + static WeakIdentifierMap<T, IdentifierType>& instance();
|
| +
|
| + WeakIdentifierMap() { }
|
|
|
| - WeakIdentifierMap()
|
| - : m_objectToIdentifier(new ObjectToIdentifier())
|
| - , m_identifierToObject(new IdentifierToObject())
|
| + static IdentifierType next()
|
| {
|
| + static IdentifierType s_lastId = 0;
|
| + return ++s_lastId;
|
| }
|
|
|
| void put(T* object, IdentifierType identifier)
|
| {
|
| - DCHECK(object && !m_objectToIdentifier->contains(object));
|
| - m_objectToIdentifier->set(object, identifier);
|
| - m_identifierToObject->set(identifier, object);
|
| + DCHECK(object && !this->m_objectToIdentifier.contains(object));
|
| + this->m_objectToIdentifier.set(object, identifier);
|
| + this->m_identifierToObject.set(identifier, object);
|
| }
|
|
|
| - using ObjectToIdentifier = HeapHashMap<WeakMember<T>, IdentifierType>;
|
| - using IdentifierToObject = HeapHashMap<IdentifierType, WeakMember<T>>;
|
| -
|
| - Member<ObjectToIdentifier> m_objectToIdentifier;
|
| - Member<IdentifierToObject> m_identifierToObject;
|
| + void objectDestroyed(T* object)
|
| + {
|
| + IdentifierType identifier = this->m_objectToIdentifier.take(object);
|
| + if (!WTF::isHashTraitsEmptyValue<HashTraits<IdentifierType>>(identifier))
|
| + this->m_identifierToObject.remove(identifier);
|
| + }
|
| };
|
|
|
| #define DECLARE_WEAK_IDENTIFIER_MAP(T, ...) \
|
|
|