| Index: Source/platform/heap/Heap.h
|
| diff --git a/Source/platform/heap/Heap.h b/Source/platform/heap/Heap.h
|
| index d38311352861476dd2cdb577e0d8340b3976ad74..10187f5a50ddedfc1d89b8cf9455fe151d32fdd7 100644
|
| --- a/Source/platform/heap/Heap.h
|
| +++ b/Source/platform/heap/Heap.h
|
| @@ -1462,25 +1462,29 @@ public:
|
| return ThreadState::current()->isAllocationAllowed();
|
| }
|
|
|
| - static void markNoTracing(Visitor* visitor, const void* t) { visitor->markNoTracing(t); }
|
| + template<typename VisitorDispatcher>
|
| + static void markNoTracing(VisitorDispatcher visitor, const void* t) { visitor->markNoTracing(t); }
|
|
|
| - template<typename T, typename Traits>
|
| - static void trace(Visitor* visitor, T& t)
|
| + template<typename VisitorDispatcher, typename T, typename Traits>
|
| + static void trace(VisitorDispatcher visitor, T& t)
|
| {
|
| CollectionBackingTraceTrait<WTF::ShouldBeTraced<Traits>::value, Traits::weakHandlingFlag, WTF::WeakPointersActWeak, T, Traits>::trace(visitor, t);
|
| }
|
|
|
| - static void registerDelayedMarkNoTracing(Visitor* visitor, const void* object)
|
| + template<typename VisitorDispatcher>
|
| + static void registerDelayedMarkNoTracing(VisitorDispatcher visitor, const void* object)
|
| {
|
| visitor->registerDelayedMarkNoTracing(object);
|
| }
|
|
|
| - static void registerWeakMembers(Visitor* visitor, const void* closure, const void* object, WeakPointerCallback callback)
|
| + template<typename VisitorDispatcher>
|
| + static void registerWeakMembers(VisitorDispatcher visitor, const void* closure, const void* object, WeakPointerCallback callback)
|
| {
|
| visitor->registerWeakMembers(closure, object, callback);
|
| }
|
|
|
| - static void registerWeakTable(Visitor* visitor, const void* closure, EphemeronCallback iterationCallback, EphemeronCallback iterationDoneCallback)
|
| + template<typename VisitorDispatcher>
|
| + static void registerWeakTable(VisitorDispatcher visitor, const void* closure, EphemeronCallback iterationCallback, EphemeronCallback iterationDoneCallback)
|
| {
|
| visitor->registerWeakTable(closure, iterationCallback, iterationDoneCallback);
|
| }
|
| @@ -2037,7 +2041,8 @@ namespace WTF {
|
| // weak elements.
|
| template<ShouldWeakPointersBeMarkedStrongly strongify, typename T, typename Traits>
|
| struct TraceInCollectionTrait<NoWeakHandlingInCollections, strongify, T, Traits> {
|
| - static bool trace(blink::Visitor* visitor, T& t)
|
| + template<typename VisitorDispatcher>
|
| + static bool trace(VisitorDispatcher visitor, T& t)
|
| {
|
| blink::TraceTrait<T>::trace(visitor, &t);
|
| return false;
|
| @@ -2046,7 +2051,8 @@ struct TraceInCollectionTrait<NoWeakHandlingInCollections, strongify, T, Traits>
|
|
|
| template<ShouldWeakPointersBeMarkedStrongly strongify, typename T, typename Traits>
|
| struct TraceInCollectionTrait<NoWeakHandlingInCollections, strongify, blink::Member<T>, Traits> {
|
| - static bool trace(blink::Visitor* visitor, blink::Member<T>& t)
|
| + template<typename VisitorDispatcher>
|
| + static bool trace(VisitorDispatcher visitor, blink::Member<T>& t)
|
| {
|
| blink::TraceTrait<T>::mark(visitor, const_cast<typename RemoveConst<T>::Type*>(t.get()));
|
| return false;
|
| @@ -2056,7 +2062,8 @@ struct TraceInCollectionTrait<NoWeakHandlingInCollections, strongify, blink::Mem
|
| // Catch-all for things that have HashTrait support for tracing with weakness.
|
| template<ShouldWeakPointersBeMarkedStrongly strongify, typename T, typename Traits>
|
| struct TraceInCollectionTrait<WeakHandlingInCollections, strongify, T, Traits> {
|
| - static bool trace(blink::Visitor* visitor, T& t)
|
| + template<typename VisitorDispatcher>
|
| + static bool trace(VisitorDispatcher visitor, T& t)
|
| {
|
| return Traits::traceInCollection(visitor, t, strongify);
|
| }
|
| @@ -2065,7 +2072,8 @@ struct TraceInCollectionTrait<WeakHandlingInCollections, strongify, T, Traits> {
|
| // Vector backing that needs marking. We don't support weak members in vectors.
|
| template<ShouldWeakPointersBeMarkedStrongly strongify, typename T, typename Traits>
|
| struct TraceInCollectionTrait<NoWeakHandlingInCollections, strongify, blink::HeapVectorBacking<T, Traits>, void> {
|
| - static bool trace(blink::Visitor* visitor, void* self)
|
| + template<typename VisitorDispatcher>
|
| + static bool trace(VisitorDispatcher visitor, void* self)
|
| {
|
| // The allocator can oversize the allocation a little, according to
|
| // the allocation granularity. The extra size is included in the
|
| @@ -2090,7 +2098,9 @@ template<ShouldWeakPointersBeMarkedStrongly strongify, typename Table>
|
| struct TraceInCollectionTrait<NoWeakHandlingInCollections, strongify, blink::HeapHashTableBacking<Table>, void> {
|
| using Value = typename Table::ValueType;
|
| using Traits = typename Table::ValueTraits;
|
| - static bool trace(blink::Visitor* visitor, void* self)
|
| +
|
| + template<typename VisitorDispatcher>
|
| + static bool trace(VisitorDispatcher visitor, void* self)
|
| {
|
| Value* array = reinterpret_cast<Value*>(self);
|
| blink::HeapObjectHeader* header = blink::HeapObjectHeader::fromPayload(self);
|
| @@ -2112,7 +2122,9 @@ template<ShouldWeakPointersBeMarkedStrongly strongify, typename NodeContents, si
|
| struct TraceInCollectionTrait<NoWeakHandlingInCollections, strongify, blink::HeapHashTableBacking<HashTable<ListHashSetNode<NodeContents, blink::HeapListHashSetAllocator<T, inlineCapacity>>*, U, V, W, X, Y, blink::HeapAllocator>>, void> {
|
| using Node = ListHashSetNode<NodeContents, blink::HeapListHashSetAllocator<T, inlineCapacity>>;
|
| using Table = HashTable<Node*, U, V, W, X, Y, blink::HeapAllocator>;
|
| - static bool trace(blink::Visitor* visitor, void* self)
|
| +
|
| + template<typename VisitorDispatcher>
|
| + static bool trace(VisitorDispatcher visitor, void* self)
|
| {
|
| Node** array = reinterpret_cast<Node**>(self);
|
| blink::HeapObjectHeader* header = blink::HeapObjectHeader::fromPayload(self);
|
| @@ -2136,7 +2148,8 @@ struct TraceInCollectionTrait<NoWeakHandlingInCollections, strongify, blink::Hea
|
| // one with weak handling.
|
| template<ShouldWeakPointersBeMarkedStrongly strongify, typename Key, typename Value, typename Traits>
|
| struct TraceInCollectionTrait<NoWeakHandlingInCollections, strongify, KeyValuePair<Key, Value>, Traits> {
|
| - static bool trace(blink::Visitor* visitor, KeyValuePair<Key, Value>& self)
|
| + template<typename VisitorDispatcher>
|
| + static bool trace(VisitorDispatcher visitor, KeyValuePair<Key, Value>& self)
|
| {
|
| ASSERT(ShouldBeTraced<Traits>::value);
|
| blink::CollectionBackingTraceTrait<ShouldBeTraced<typename Traits::KeyTraits>::value, NoWeakHandlingInCollections, strongify, Key, typename Traits::KeyTraits>::trace(visitor, self.key);
|
| @@ -2147,7 +2160,8 @@ struct TraceInCollectionTrait<NoWeakHandlingInCollections, strongify, KeyValuePa
|
|
|
| template<ShouldWeakPointersBeMarkedStrongly strongify, typename Key, typename Value, typename Traits>
|
| struct TraceInCollectionTrait<WeakHandlingInCollections, strongify, KeyValuePair<Key, Value>, Traits> {
|
| - static bool trace(blink::Visitor* visitor, KeyValuePair<Key, Value>& self)
|
| + template<typename VisitorDispatcher>
|
| + static bool trace(VisitorDispatcher visitor, KeyValuePair<Key, Value>& self)
|
| {
|
| // This is the core of the ephemeron-like functionality. If there is
|
| // weakness on the key side then we first check whether there are
|
| @@ -2188,7 +2202,8 @@ struct TraceInCollectionTrait<WeakHandlingInCollections, strongify, KeyValuePair
|
| // template.
|
| template<ShouldWeakPointersBeMarkedStrongly strongify, typename Value, typename Allocator, typename Traits>
|
| struct TraceInCollectionTrait<NoWeakHandlingInCollections, strongify, LinkedHashSetNode<Value, Allocator>, Traits> {
|
| - static bool trace(blink::Visitor* visitor, LinkedHashSetNode<Value, Allocator>& self)
|
| + template<typename VisitorDispatcher>
|
| + static bool trace(VisitorDispatcher visitor, LinkedHashSetNode<Value, Allocator>& self)
|
| {
|
| ASSERT(ShouldBeTraced<Traits>::value);
|
| return TraceInCollectionTrait<NoWeakHandlingInCollections, strongify, Value, typename Traits::ValueTraits>::trace(visitor, self.m_value);
|
| @@ -2197,7 +2212,8 @@ struct TraceInCollectionTrait<NoWeakHandlingInCollections, strongify, LinkedHash
|
|
|
| template<ShouldWeakPointersBeMarkedStrongly strongify, typename Value, typename Allocator, typename Traits>
|
| struct TraceInCollectionTrait<WeakHandlingInCollections, strongify, LinkedHashSetNode<Value, Allocator>, Traits> {
|
| - static bool trace(blink::Visitor* visitor, LinkedHashSetNode<Value, Allocator>& self)
|
| + template<typename VisitorDispatcher>
|
| + static bool trace(VisitorDispatcher visitor, LinkedHashSetNode<Value, Allocator>& self)
|
| {
|
| return TraceInCollectionTrait<WeakHandlingInCollections, strongify, Value, typename Traits::ValueTraits>::trace(visitor, self.m_value);
|
| }
|
| @@ -2208,7 +2224,9 @@ struct TraceInCollectionTrait<WeakHandlingInCollections, strongify, LinkedHashSe
|
| template<ShouldWeakPointersBeMarkedStrongly strongify, typename Value, size_t inlineCapacity, typename Traits>
|
| struct TraceInCollectionTrait<NoWeakHandlingInCollections, strongify, ListHashSetNode<Value, blink::HeapListHashSetAllocator<Value, inlineCapacity>>*, Traits> {
|
| using Node = ListHashSetNode<Value, blink::HeapListHashSetAllocator<Value, inlineCapacity>>;
|
| - static bool trace(blink::Visitor* visitor, Node* node)
|
| +
|
| + template<typename VisitorDispatcher>
|
| + static bool trace(VisitorDispatcher visitor, Node* node)
|
| {
|
| traceListHashSetValue(visitor, node->m_value);
|
| // Just mark the node without tracing because we already traced the
|
| @@ -2231,7 +2249,8 @@ namespace blink {
|
| // We do nothing, even if WTF::WeakPointersActStrong.
|
| template<WTF::ShouldWeakPointersBeMarkedStrongly strongify, typename T, typename Traits>
|
| struct CollectionBackingTraceTrait<false, WTF::NoWeakHandlingInCollections, strongify, T, Traits> {
|
| - static bool trace(Visitor*, T&) { return false; }
|
| + template<typename VisitorDispatcher>
|
| + static bool trace(VisitorDispatcher, T&) { return false; }
|
| };
|
|
|
| template<typename T>
|
| @@ -2249,7 +2268,8 @@ static void verifyGarbageCollectedIfMember(Member<T>* t)
|
| // both.
|
| template<bool needsTracing, WTF::WeakHandlingFlag weakHandlingFlag, WTF::ShouldWeakPointersBeMarkedStrongly strongify, typename T, typename Traits>
|
| struct CollectionBackingTraceTrait {
|
| - static bool trace(Visitor* visitor, T&t)
|
| + template<typename VisitorDispatcher>
|
| + static bool trace(VisitorDispatcher visitor, T&t)
|
| {
|
| verifyGarbageCollectedIfMember(reinterpret_cast<T*>(0));
|
| return WTF::TraceInCollectionTrait<weakHandlingFlag, strongify, T, Traits>::trace(visitor, t);
|
| @@ -2276,7 +2296,8 @@ template<typename T> struct WeakHandlingHashTraits : WTF::SimpleClassHashTraits<
|
| // suddenly disappear during iteration. Returns true if weak pointers to
|
| // dead objects were found: In this case any strong pointers were not yet
|
| // traced and the entry should be removed from the collection.
|
| - static bool traceInCollection(Visitor* visitor, T& t, WTF::ShouldWeakPointersBeMarkedStrongly strongify)
|
| + template<typename VisitorDispatcher>
|
| + static bool traceInCollection(VisitorDispatcher visitor, T& t, WTF::ShouldWeakPointersBeMarkedStrongly strongify)
|
| {
|
| return t.traceInCollection(visitor, strongify);
|
| }
|
| @@ -2285,13 +2306,17 @@ template<typename T> struct WeakHandlingHashTraits : WTF::SimpleClassHashTraits<
|
| template<typename T, typename Traits>
|
| struct TraceTrait<HeapVectorBacking<T, Traits>> {
|
| using Backing = HeapVectorBacking<T, Traits>;
|
| - static void trace(Visitor* visitor, void* self)
|
| +
|
| + template<typename VisitorDispatcher>
|
| + static void trace(VisitorDispatcher visitor, void* self)
|
| {
|
| static_assert(!WTF::IsWeak<T>::value, "weakness in HeapVectors and Deques are not supported");
|
| if (WTF::ShouldBeTraced<Traits>::value)
|
| WTF::TraceInCollectionTrait<WTF::NoWeakHandlingInCollections, WTF::WeakPointersActWeak, HeapVectorBacking<T, Traits>, void>::trace(visitor, self);
|
| }
|
| - static void mark(Visitor* visitor, const Backing* backing)
|
| +
|
| + template<typename VisitorDispatcher>
|
| + static void mark(VisitorDispatcher visitor, const Backing* backing)
|
| {
|
| visitor->mark(backing, &trace);
|
| }
|
| @@ -2313,12 +2338,16 @@ template<typename Table>
|
| struct TraceTrait<HeapHashTableBacking<Table>> {
|
| using Backing = HeapHashTableBacking<Table>;
|
| using Traits = typename Table::ValueTraits;
|
| - static void trace(Visitor* visitor, void* self)
|
| +
|
| + template<typename VisitorDispatcher>
|
| + static void trace(VisitorDispatcher visitor, void* self)
|
| {
|
| if (WTF::ShouldBeTraced<Traits>::value || Traits::weakHandlingFlag == WTF::WeakHandlingInCollections)
|
| WTF::TraceInCollectionTrait<WTF::NoWeakHandlingInCollections, WTF::WeakPointersActStrong, Backing, void>::trace(visitor, self);
|
| }
|
| - static void mark(Visitor* visitor, const Backing* backing)
|
| +
|
| + template<typename VisitorDispatcher>
|
| + static void mark(VisitorDispatcher visitor, const Backing* backing)
|
| {
|
| if (WTF::ShouldBeTraced<Traits>::value || Traits::weakHandlingFlag == WTF::WeakHandlingInCollections)
|
| visitor->mark(backing, &trace);
|
|
|