| Index: Source/platform/heap/Handle.h
|
| diff --git a/Source/platform/heap/Handle.h b/Source/platform/heap/Handle.h
|
| index d4768b0b68ba5f17e0c5613b2d6dad3f17f6dc71..2653f6393a88fcc34d435b14b7a442cbe7ea6853 100644
|
| --- a/Source/platform/heap/Handle.h
|
| +++ b/Source/platform/heap/Handle.h
|
| @@ -69,31 +69,34 @@ struct IsGarbageCollectedMixin {
|
| static bool const value = (sizeof(TrueType) == sizeof(hasAdjustAndMark<T>(0))) && (sizeof(TrueType) == sizeof(hasIsAlive<T>(0)));
|
| };
|
|
|
| -#define COMPILE_ASSERT_IS_GARBAGE_COLLECTED(T, ErrorMessage) \
|
| - do { \
|
| - typedef typename WTF::RemoveConst<T>::Type NonConstType; \
|
| - typedef WTF::IsSubclassOfTemplate<NonConstType, GarbageCollected> GarbageCollectedSubclass; \
|
| - typedef IsGarbageCollectedMixin<NonConstType> GarbageCollectedMixinSubclass; \
|
| - typedef WTF::IsSubclassOfTemplate3<NonConstType, HeapHashSet> HeapHashSetSubclass; \
|
| - typedef WTF::IsSubclassOfTemplate3<NonConstType, HeapLinkedHashSet> HeapLinkedHashSetSubclass; \
|
| - typedef WTF::IsSubclassOfTemplateTypenameSizeTypename<NonConstType, HeapListHashSet> HeapListHashSetSubclass; \
|
| - typedef WTF::IsSubclassOfTemplate5<NonConstType, HeapHashMap> HeapHashMapSubclass; \
|
| - typedef WTF::IsSubclassOfTemplateTypenameSize<NonConstType, HeapVector> HeapVectorSubclass; \
|
| - typedef WTF::IsSubclassOfTemplateTypenameSize<NonConstType, HeapDeque> HeapDequeSubclass; \
|
| - typedef WTF::IsSubclassOfTemplate3<NonConstType, HeapHashCountedSet> HeapHashCountedSetSubclass; \
|
| - typedef WTF::IsSubclassOfTemplate<NonConstType, HeapTerminatedArray> HeapTerminatedArraySubclass; \
|
| - COMPILE_ASSERT(GarbageCollectedSubclass::value || \
|
| - GarbageCollectedMixinSubclass::value || \
|
| - HeapHashSetSubclass::value || \
|
| - HeapLinkedHashSetSubclass::value || \
|
| - HeapListHashSetSubclass::value || \
|
| - HeapHashMapSubclass::value || \
|
| - HeapVectorSubclass::value || \
|
| - HeapDequeSubclass::value || \
|
| - HeapHashCountedSetSubclass::value || \
|
| - HeapTerminatedArraySubclass::value, \
|
| - ErrorMessage); \
|
| - } while (0)
|
| +template <typename T>
|
| +struct IsGarbageCollectedType {
|
| + typedef typename WTF::RemoveConst<T>::Type NonConstType;
|
| + typedef WTF::IsSubclassOfTemplate<NonConstType, GarbageCollected> GarbageCollectedSubclass;
|
| + typedef IsGarbageCollectedMixin<NonConstType> GarbageCollectedMixinSubclass;
|
| + typedef WTF::IsSubclassOfTemplate3<NonConstType, HeapHashSet> HeapHashSetSubclass;
|
| + typedef WTF::IsSubclassOfTemplate3<NonConstType, HeapLinkedHashSet> HeapLinkedHashSetSubclass;
|
| + typedef WTF::IsSubclassOfTemplateTypenameSizeTypename<NonConstType, HeapListHashSet> HeapListHashSetSubclass;
|
| + typedef WTF::IsSubclassOfTemplate5<NonConstType, HeapHashMap> HeapHashMapSubclass;
|
| + typedef WTF::IsSubclassOfTemplateTypenameSize<NonConstType, HeapVector> HeapVectorSubclass;
|
| + typedef WTF::IsSubclassOfTemplateTypenameSize<NonConstType, HeapDeque> HeapDequeSubclass;
|
| + typedef WTF::IsSubclassOfTemplate3<NonConstType, HeapHashCountedSet> HeapHashCountedSetSubclass;
|
| + typedef WTF::IsSubclassOfTemplate<NonConstType, HeapTerminatedArray> HeapTerminatedArraySubclass;
|
| + static const bool value =
|
| + GarbageCollectedSubclass::value
|
| + || GarbageCollectedMixinSubclass::value
|
| + || HeapHashSetSubclass::value
|
| + || HeapLinkedHashSetSubclass::value
|
| + || HeapListHashSetSubclass::value
|
| + || HeapHashMapSubclass::value
|
| + || HeapVectorSubclass::value
|
| + || HeapDequeSubclass::value
|
| + || HeapHashCountedSetSubclass::value
|
| + || HeapTerminatedArraySubclass::value;
|
| +};
|
| +
|
| +#define COMPILE_ASSERT_IS_GARBAGE_COLLECTED(T, ErrorMessage) \
|
| + COMPILE_ASSERT(IsGarbageCollectedType<T>::value, ErrorMessage)
|
|
|
| template<typename T> class Member;
|
|
|
| @@ -1160,31 +1163,28 @@ struct NeedsTracing<ListHashSetNode<T, WebCore::HeapListHashSetAllocator<T, inli
|
| // For wtf/Functional.h
|
| template<typename T, bool isGarbageCollected> struct PointerParamStorageTraits;
|
|
|
| -template<typename T> struct PointerParamStorageTraits<T*, false> {
|
| +template<typename T>
|
| +struct PointerParamStorageTraits<T*, false> {
|
| typedef T* StorageType;
|
|
|
| static StorageType wrap(T* value) { return value; }
|
| static T* unwrap(const StorageType& value) { return value; }
|
| };
|
|
|
| -template<typename T> struct PointerParamStorageTraits<T*, true> {
|
| +template<typename T>
|
| +struct PointerParamStorageTraits<T*, true> {
|
| typedef WebCore::CrossThreadPersistent<T> StorageType;
|
|
|
| static StorageType wrap(T* value) { return value; }
|
| static T* unwrap(const StorageType& value) { return value.get(); }
|
| };
|
|
|
| -// FIXME: This doesn't support collections and const types. See
|
| -// COMPILE_ASSERT_IS_GARBAGE_COLLECTED.
|
| -template<typename T> struct ParamStorageTraits<T*> : public PointerParamStorageTraits<T*, WTF::IsSubclassOfTemplate<T, WebCore::GarbageCollected>::value || WebCore::IsGarbageCollectedMixin<T>::value> {
|
| +template<typename T>
|
| +struct ParamStorageTraits<T*> : public PointerParamStorageTraits<T*, WebCore::IsGarbageCollectedType<T>::value> {
|
| };
|
|
|
| -// We assume RawPtr<T> is used only for garbage-collected types.
|
| -template<typename T> struct ParamStorageTraits<RawPtr<T> > {
|
| - typedef WebCore::CrossThreadPersistent<T> StorageType;
|
| -
|
| - static StorageType wrap(RawPtr<T> value) { return value.get(); }
|
| - static T* unwrap(const StorageType& value) { return value.get(); }
|
| +template<typename T>
|
| +struct ParamStorageTraits<RawPtr<T> > : public PointerParamStorageTraits<T*, WebCore::IsGarbageCollectedType<T>::value> {
|
| };
|
|
|
| } // namespace WTF
|
|
|