Index: Source/core/dom/WeakIdentifierMap.h |
diff --git a/Source/core/dom/WeakIdentifierMap.h b/Source/core/dom/WeakIdentifierMap.h |
index 8dd2c9555e96199855d0a543174eaf04f988cf27..8a04aa8812d0a8033bc4af59fe0ccb3e2cf277d5 100644 |
--- a/Source/core/dom/WeakIdentifierMap.h |
+++ b/Source/core/dom/WeakIdentifierMap.h |
@@ -5,9 +5,13 @@ |
#ifndef WeakIdentifierMap_h |
#define WeakIdentifierMap_h |
+#include "platform/heap/Handle.h" |
#include "wtf/HashMap.h" |
+#include "wtf/Vector.h" |
namespace blink { |
+ |
+#if !ENABLE(OILPAN) |
template<typename T> struct WeakIdentifierMapTraits { |
static void removedFromIdentifierMap(T*) { } |
static void addedToIdentifierMap(T*) { } |
@@ -25,20 +29,15 @@ public: |
} |
} |
- void put(T* object, int identifier) |
- { |
- ASSERT(object && !m_objectToIdentifier.contains(object)); |
- m_objectToIdentifier.set(object, identifier); |
- m_identifierToObject.set(identifier, object); |
- |
- ObjectToWeakIdentifierMaps& maps = ObjectToWeakIdentifierMaps::instance(); |
- if (maps.addedToMap(object, this)) |
- Traits::addedToIdentifierMap(object); |
- } |
- |
int identifier(T* object) |
{ |
- return m_objectToIdentifier.get(object); |
+ int result = m_objectToIdentifier.get(object); |
+ if (!result) { |
+ static int s_lastId = 0; |
+ result = ++s_lastId; |
+ put(object, result); |
+ } |
+ return result; |
} |
T* lookup(int identifier) |
@@ -52,6 +51,17 @@ public: |
} |
private: |
+ void put(T* object, int identifier) |
+ { |
+ ASSERT(object && !m_objectToIdentifier.contains(object)); |
+ m_objectToIdentifier.set(object, identifier); |
+ m_identifierToObject.set(identifier, object); |
+ |
+ ObjectToWeakIdentifierMaps& maps = ObjectToWeakIdentifierMaps::instance(); |
+ if (maps.addedToMap(object, this)) |
+ Traits::addedToIdentifierMap(object); |
+ } |
+ |
class ObjectToWeakIdentifierMaps { |
typedef WeakIdentifierMap<T> IdentifierMap; |
public: |
@@ -106,10 +116,63 @@ private: |
} |
typedef HashMap<T*, int> ObjectToIdentifier; |
- ObjectToIdentifier m_objectToIdentifier; |
typedef HashMap<int, T*> IdentifierToObject; |
+ |
+ ObjectToIdentifier m_objectToIdentifier; |
IdentifierToObject m_identifierToObject; |
}; |
+#else // ENABLE(OILPAN) |
+ |
+template<typename T> class WeakIdentifierMap : public GarbageCollected<WeakIdentifierMap<T>> { |
+public: |
+ WeakIdentifierMap() |
+ : m_objectToIdentifier(new ObjectToIdentifier()) |
+ , m_identifierToObject(new IdentifierToObject()) |
+ { |
+ } |
+ |
+ int identifier(T* object) |
+ { |
+ int result = m_objectToIdentifier->get(object); |
+ if (!result) { |
+ static int s_lastId = 0; |
+ result = ++s_lastId; |
+ put(object, result); |
+ } |
+ return result; |
+ } |
+ |
+ T* lookup(int identifier) |
+ { |
+ return m_identifierToObject->get(identifier); |
+ } |
+ |
+ static void notifyObjectDestroyed(T* object) { } |
+ |
+ DEFINE_INLINE_TRACE() |
+ { |
+ visitor->trace(m_objectToIdentifier); |
+ visitor->trace(m_identifierToObject); |
+ } |
+ |
+private: |
+ void put(T* object, int identifier) |
+ { |
+ ASSERT(object && !m_objectToIdentifier->contains(object)); |
+ m_objectToIdentifier->set(object, identifier); |
+ m_identifierToObject->set(identifier, object); |
+ } |
+ |
+ typedef HeapHashMap<WeakMember<T>, int> ObjectToIdentifier; |
+ typedef HeapHashMap<int, WeakMember<T>> IdentifierToObject; |
+ |
+ Member<ObjectToIdentifier> m_objectToIdentifier; |
+ Member<IdentifierToObject> m_identifierToObject; |
+}; |
+ |
+#endif // ENABLE(OILPAN) |
+ |
} |
+ |
#endif // WeakIdentifierMap_h |