Index: Source/platform/Supplementable.h |
diff --git a/Source/platform/Supplementable.h b/Source/platform/Supplementable.h |
index a15d59cabe3ade8cb9958434e6fa48b60b83ee02..25f0cf7ccfe7883537e9ba671dcb6a05cccb5e41 100644 |
--- a/Source/platform/Supplementable.h |
+++ b/Source/platform/Supplementable.h |
@@ -100,13 +100,11 @@ struct SupplementableTraits; |
template<typename T> |
struct SupplementableTraits<T, true> { |
typedef RawPtr<SupplementBase<T, true> > SupplementArgumentType; |
- typedef HeapHashMap<const char*, Member<SupplementBase<T, true> >, PtrHash<const char*> > SupplementMap; |
}; |
template<typename T> |
struct SupplementableTraits<T, false> { |
typedef PassOwnPtr<SupplementBase<T, false> > SupplementArgumentType; |
- typedef HashMap<const char*, OwnPtr<SupplementBase<T, false> >, PtrHash<const char*> > SupplementMap; |
}; |
template<bool> |
@@ -119,6 +117,12 @@ template<> |
class SupplementTracing<false> { |
public: |
virtual ~SupplementTracing() { } |
+ // FIXME: Oilpan: this trace() method is only provided to minimize |
+ // the use of ENABLE(OILPAN) for Supplements deriving from the |
+ // transition type WillBeHeapSupplement<>. |
+ // |
+ // When that transition type is removed (or its use is substantially |
+ // reduced), remove this dummy trace method also. |
virtual void trace(Visitor*) { } |
}; |
@@ -145,9 +149,32 @@ public: |
} |
}; |
+template<typename T, bool isGarbageCollected> |
+class SupplementableTracing; |
+ |
+template<typename T> |
+class SupplementableTracing<T, true> : public GarbageCollectedMixin { |
+public: |
+ virtual void trace(Visitor* visitor) |
+ { |
+ visitor->trace(m_supplements); |
+ } |
+ |
+protected: |
+ typedef HeapHashMap<const char*, Member<SupplementBase<T, true> >, PtrHash<const char*> > SupplementMap; |
+ SupplementMap m_supplements; |
+}; |
+ |
+template<typename T> |
+class SupplementableTracing<T, false> { |
+protected: |
+ typedef HashMap<const char*, OwnPtr<SupplementBase<T, false> >, PtrHash<const char*> > SupplementMap; |
+ SupplementMap m_supplements; |
+}; |
+ |
// Helper class for implementing Supplementable and HeapSupplementable. |
template<typename T, bool isGarbageCollected = false> |
-class SupplementableBase { |
+class SupplementableBase : public SupplementableTracing<T, isGarbageCollected> { |
public: |
void provideSupplement(const char* key, typename SupplementableTraits<T, isGarbageCollected>::SupplementArgumentType supplement) |
{ |
@@ -175,17 +202,6 @@ public: |
#endif |
} |
- // We have a trace method in the SupplementableBase class to ensure we have |
- // the vtable at the first word of the object. However we don't trace the |
- // m_supplements here, but in the partially specialized template subclasses |
- // since we only want to trace it for garbage collected classes. |
- virtual void trace(Visitor*) { } |
- |
- // FIXME: Oilpan: Make private and remove this ignore once PersistentHeapSupplementable is removed again. |
-protected: |
- GC_PLUGIN_IGNORE("") |
- typename SupplementableTraits<T, isGarbageCollected>::SupplementMap m_supplements; |
- |
#if ENABLE(ASSERT) |
protected: |
SupplementableBase() : m_threadId(currentThread()) { } |
@@ -195,38 +211,17 @@ private: |
#endif |
}; |
-// This class is used to make an on-heap class supplementable. Its supplements |
-// must be HeapSupplement. |
template<typename T> |
class HeapSupplement : public SupplementBase<T, true> { }; |
-// FIXME: Oilpan: Move GarbageCollectedMixin to SupplementableBase<T, true> once PersistentHeapSupplementable is removed again. |
template<typename T> |
-class GC_PLUGIN_IGNORE("http://crbug.com/395036") HeapSupplementable : public SupplementableBase<T, true>, public GarbageCollectedMixin { |
-public: |
- virtual void trace(Visitor* visitor) OVERRIDE |
- { |
- visitor->trace(this->m_supplements); |
- SupplementableBase<T, true>::trace(visitor); |
- } |
-}; |
+class HeapSupplementable : public SupplementableBase<T, true> { }; |
template<typename T> |
class Supplement : public SupplementBase<T, false> { }; |
-// This class is used to make an off-heap class supplementable with off-heap |
-// supplements (Supplement). |
template<typename T> |
-class GC_PLUGIN_IGNORE("http://crbug.com/395036") Supplementable : public SupplementableBase<T, false> { |
-public: |
- virtual void trace(Visitor* visitor) |
- { |
- // No tracing of off-heap supplements. We should not have any Supplementable |
- // object on the heap. |
- COMPILE_ASSERT(!IsGarbageCollectedType<T>::value, GarbageCollectedObjectMustBeHeapSupplementable); |
- SupplementableBase<T, false>::trace(visitor); |
- } |
-}; |
+class Supplementable : public SupplementableBase<T, false> { }; |
template<typename T> |
struct ThreadingTrait<SupplementBase<T, true> > { |