| 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> > {
|
|
|