Index: Source/platform/CrossThreadCopier.h |
diff --git a/Source/platform/CrossThreadCopier.h b/Source/platform/CrossThreadCopier.h |
index 7c0e48c4fb73243adf4adda8645dee495d0ac9ab..5860309cfdb16b1359235d82e9ee675ac816cf00 100644 |
--- a/Source/platform/CrossThreadCopier.h |
+++ b/Source/platform/CrossThreadCopier.h |
@@ -32,6 +32,7 @@ |
#define CrossThreadCopier_h |
#include "platform/PlatformExport.h" |
+#include "platform/heap/Handle.h" |
#include "wtf/Assertions.h" |
#include "wtf/Forward.h" |
#include "wtf/PassOwnPtr.h" |
@@ -61,28 +62,28 @@ namespace WebCore { |
} |
}; |
- template<bool isConvertibleToInteger, bool isThreadSafeRefCounted, typename T> struct CrossThreadCopierBase; |
+ template<bool isConvertibleToInteger, bool isThreadSafeRefCounted, bool isGarbageCollected, typename T> struct CrossThreadCopierBase; |
// Integers get passed through without any changes. |
- template<typename T> struct CrossThreadCopierBase<true, false, T> : public CrossThreadCopierPassThrough<T> { |
+ template<typename T> struct CrossThreadCopierBase<true, false, false, T> : public CrossThreadCopierPassThrough<T> { |
}; |
// To allow a type to be passed across threads using its copy constructor, add a forward declaration of the type and |
// a CopyThreadCopierBase<false, false, TypeName> : public CrossThreadCopierPassThrough<TypeName> { }; to this file. |
- template<> struct CrossThreadCopierBase<false, false, ThreadableLoaderOptions> : public CrossThreadCopierPassThrough<ThreadableLoaderOptions> { |
+ template<> struct CrossThreadCopierBase<false, false, false, ThreadableLoaderOptions> : public CrossThreadCopierPassThrough<ThreadableLoaderOptions> { |
}; |
- template<> struct CrossThreadCopierBase<false, false, ResourceLoaderOptions> : public CrossThreadCopierPassThrough<ResourceLoaderOptions> { |
+ template<> struct CrossThreadCopierBase<false, false, false, ResourceLoaderOptions> : public CrossThreadCopierPassThrough<ResourceLoaderOptions> { |
}; |
- template<> struct CrossThreadCopierBase<false, false, IntRect> : public CrossThreadCopierPassThrough<IntRect> { |
+ template<> struct CrossThreadCopierBase<false, false, false, IntRect> : public CrossThreadCopierPassThrough<IntRect> { |
}; |
- template<> struct CrossThreadCopierBase<false, false, IntSize> : public CrossThreadCopierPassThrough<IntSize> { |
+ template<> struct CrossThreadCopierBase<false, false, false, IntSize> : public CrossThreadCopierPassThrough<IntSize> { |
}; |
// Custom copy methods. |
- template<typename T> struct CrossThreadCopierBase<false, true, T> { |
+ template<typename T> struct CrossThreadCopierBase<false, true, false, T> { |
typedef typename WTF::RemoveTemplate<T, RefPtr>::Type TypeWithoutRefPtr; |
typedef typename WTF::RemoveTemplate<TypeWithoutRefPtr, PassRefPtr>::Type TypeWithoutPassRefPtr; |
typedef typename WTF::RemovePointer<TypeWithoutPassRefPtr>::Type RefCountedType; |
@@ -100,7 +101,7 @@ namespace WebCore { |
} |
}; |
- template<typename T> struct CrossThreadCopierBase<false, false, PassOwnPtr<T> > { |
+ template<typename T> struct CrossThreadCopierBase<false, false, false, PassOwnPtr<T> > { |
typedef PassOwnPtr<T> Type; |
static Type copy(Type ownPtr) |
{ |
@@ -108,36 +109,46 @@ namespace WebCore { |
} |
}; |
- template<> struct CrossThreadCopierBase<false, false, KURL> { |
+ template<> struct CrossThreadCopierBase<false, false, false, KURL> { |
typedef KURL Type; |
PLATFORM_EXPORT static Type copy(const KURL&); |
}; |
- template<> struct CrossThreadCopierBase<false, false, String> { |
+ template<> struct CrossThreadCopierBase<false, false, false, String> { |
typedef String Type; |
PLATFORM_EXPORT static Type copy(const String&); |
}; |
- template<> struct CrossThreadCopierBase<false, false, ResourceError> { |
+ template<> struct CrossThreadCopierBase<false, false, false, ResourceError> { |
typedef ResourceError Type; |
PLATFORM_EXPORT static Type copy(const ResourceError&); |
}; |
- template<> struct CrossThreadCopierBase<false, false, ResourceRequest> { |
+ template<> struct CrossThreadCopierBase<false, false, false, ResourceRequest> { |
typedef PassOwnPtr<CrossThreadResourceRequestData> Type; |
PLATFORM_EXPORT static Type copy(const ResourceRequest&); |
}; |
- template<> struct CrossThreadCopierBase<false, false, ResourceResponse> { |
+ template<> struct CrossThreadCopierBase<false, false, false, ResourceResponse> { |
typedef PassOwnPtr<CrossThreadResourceResponseData> Type; |
PLATFORM_EXPORT static Type copy(const ResourceResponse&); |
}; |
+ template<typename T> struct CrossThreadCopierBase<false, false, true, T> { |
+ typedef typename WTF::RemovePointer<T>::Type TypeWithoutPointer; |
+ typedef PassRefPtrWillBeRawPtr<TypeWithoutPointer> Type; |
+ static Type copy(const T& ptr) |
+ { |
+ return ptr; |
+ } |
+ }; |
+ |
template<typename T> struct CrossThreadCopier : public CrossThreadCopierBase<WTF::IsConvertibleToInteger<T>::value, |
- WTF::IsSubclassOfTemplate<typename WTF::RemoveTemplate<T, RefPtr>::Type, ThreadSafeRefCounted>::value |
- || WTF::IsSubclassOfTemplate<typename WTF::RemovePointer<T>::Type, ThreadSafeRefCounted>::value |
- || WTF::IsSubclassOfTemplate<typename WTF::RemoveTemplate<T, PassRefPtr>::Type, ThreadSafeRefCounted>::value, |
- T> { |
+ WTF::IsSubclassOfTemplate<typename WTF::RemoveTemplate<T, RefPtr>::Type, ThreadSafeRefCounted>::value |
+ || WTF::IsSubclassOfTemplate<typename WTF::RemovePointer<T>::Type, ThreadSafeRefCounted>::value |
+ || WTF::IsSubclassOfTemplate<typename WTF::RemoveTemplate<T, PassRefPtr>::Type, ThreadSafeRefCounted>::value, |
+ WTF::IsSubclassOfTemplate<typename WTF::RemovePointer<T>::Type, GarbageCollected>::value, |
+ T> { |
}; |
template<typename T> struct AllowCrossThreadAccessWrapper { |
@@ -148,7 +159,7 @@ namespace WebCore { |
T* m_value; |
}; |
- template<typename T> struct CrossThreadCopierBase<false, false, AllowCrossThreadAccessWrapper<T> > { |
+ template<typename T> struct CrossThreadCopierBase<false, false, false, AllowCrossThreadAccessWrapper<T> > { |
typedef T* Type; |
static Type copy(const AllowCrossThreadAccessWrapper<T>& wrapper) { return wrapper.value(); } |
}; |
@@ -168,7 +179,7 @@ namespace WebCore { |
T* m_value; |
}; |
- template<typename T> struct CrossThreadCopierBase<false, false, AllowAccessLaterWrapper<T> > { |
+ template<typename T> struct CrossThreadCopierBase<false, false, false, AllowAccessLaterWrapper<T> > { |
typedef T* Type; |
static Type copy(const AllowAccessLaterWrapper<T>& wrapper) { return wrapper.value(); } |
}; |