Index: third_party/WebKit/Source/platform/heap/TraceTraits.h |
diff --git a/third_party/WebKit/Source/platform/heap/TraceTraits.h b/third_party/WebKit/Source/platform/heap/TraceTraits.h |
index 5133156993a20da05bf5e72fc550374475caa3bb..3009ac4393bece664377c927fa203615087771cf 100644 |
--- a/third_party/WebKit/Source/platform/heap/TraceTraits.h |
+++ b/third_party/WebKit/Source/platform/heap/TraceTraits.h |
@@ -104,7 +104,7 @@ public: |
} |
}; |
-template<typename T, bool needsTracing> |
+template<typename T, bool isTraceable> |
struct TraceIfEnabled; |
template<typename T> |
@@ -113,7 +113,7 @@ struct TraceIfEnabled<T, false> { |
template<typename VisitorDispatcher> |
static void trace(VisitorDispatcher, T&) |
{ |
- static_assert(!WTF::NeedsTracing<T>::value, "T should not be traced"); |
+ static_assert(!WTF::IsTraceable<T>::value, "T should not be traced"); |
} |
}; |
@@ -123,12 +123,12 @@ struct TraceIfEnabled<T, true> { |
template<typename VisitorDispatcher> |
static void trace(VisitorDispatcher visitor, T& t) |
{ |
- static_assert(WTF::NeedsTracing<T>::value || WTF::IsWeak<T>::value, "T should be traced"); |
+ static_assert(WTF::IsTraceable<T>::value, "T should not be traced"); |
visitor->trace(t); |
} |
}; |
-template<bool needsTracing, WTF::WeakHandlingFlag weakHandlingFlag, WTF::ShouldWeakPointersBeMarkedStrongly strongify, typename T, typename Traits> struct TraceCollectionIfEnabled; |
+template<bool isTraceable, WTF::WeakHandlingFlag weakHandlingFlag, WTF::ShouldWeakPointersBeMarkedStrongly strongify, typename T, typename Traits> struct TraceCollectionIfEnabled; |
template<WTF::ShouldWeakPointersBeMarkedStrongly strongify, typename T, typename Traits> |
struct TraceCollectionIfEnabled<false, WTF::NoWeakHandlingInCollections, strongify, T, Traits> { |
@@ -136,18 +136,18 @@ struct TraceCollectionIfEnabled<false, WTF::NoWeakHandlingInCollections, strongi |
template<typename VisitorDispatcher> |
static bool trace(VisitorDispatcher, T&) |
{ |
- static_assert(!WTF::NeedsTracingTrait<Traits>::value, "Traits should not be traced"); |
+ static_assert(!WTF::IsTraceableInCollectionTrait<Traits>::value, "T should not be traced"); |
return false; |
} |
}; |
-template<bool needsTracing, WTF::WeakHandlingFlag weakHandlingFlag, WTF::ShouldWeakPointersBeMarkedStrongly strongify, typename T, typename Traits> |
+template<bool isTraceable, WTF::WeakHandlingFlag weakHandlingFlag, WTF::ShouldWeakPointersBeMarkedStrongly strongify, typename T, typename Traits> |
struct TraceCollectionIfEnabled { |
STATIC_ONLY(TraceCollectionIfEnabled); |
template<typename VisitorDispatcher> |
static bool trace(VisitorDispatcher visitor, T& t) |
{ |
- static_assert(WTF::NeedsTracingTrait<Traits>::value || weakHandlingFlag == WTF::WeakHandlingInCollections, "Traits should be traced"); |
+ static_assert(WTF::IsTraceableInCollectionTrait<Traits>::value || weakHandlingFlag == WTF::WeakHandlingInCollections, "Traits should be traced"); |
return WTF::TraceInCollectionTrait<weakHandlingFlag, strongify, T, Traits>::trace(visitor, t); |
} |
}; |
@@ -187,7 +187,7 @@ template<typename T> class TraceTrait<const T> : public TraceTrait<T> { }; |
template<typename T> |
void TraceTrait<T>::trace(Visitor* visitor, void* self) |
{ |
- static_assert(WTF::NeedsTracing<T>::value || WTF::IsWeak<T>::value, "T should be traced"); |
+ static_assert(WTF::IsTraceable<T>::value, "T should not be traced"); |
if (visitor->getMarkingMode() == Visitor::GlobalMarking) { |
// Switch to inlined global marking dispatch. |
static_cast<T*>(self)->trace(InlinedGlobalMarkingVisitor(visitor->state())); |
@@ -199,7 +199,7 @@ void TraceTrait<T>::trace(Visitor* visitor, void* self) |
template<typename T> |
void TraceTrait<T>::trace(InlinedGlobalMarkingVisitor visitor, void* self) |
{ |
- static_assert(WTF::NeedsTracing<T>::value || WTF::IsWeak<T>::value, "T should be traced"); |
+ static_assert(WTF::IsTraceable<T>::value, "T should not be traced"); |
static_cast<T*>(self)->trace(visitor); |
} |
@@ -211,8 +211,8 @@ struct TraceTrait<HeapVectorBacking<T, Traits>> { |
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::NeedsTracingTrait<Traits>::value) |
+ static_assert(!WTF::IsWeak<T>::value, "weakness in HeapVectors and HeapDeques are not supported"); |
+ if (WTF::IsTraceableInCollectionTrait<Traits>::value) |
WTF::TraceInCollectionTrait<WTF::NoWeakHandlingInCollections, WTF::WeakPointersActWeak, HeapVectorBacking<T, Traits>, void>::trace(visitor, self); |
} |
@@ -238,7 +238,7 @@ struct TraceTrait<HeapHashTableBacking<Table>> { |
template<typename VisitorDispatcher> |
static void trace(VisitorDispatcher visitor, void* self) |
{ |
- if (WTF::NeedsTracingTrait<Traits>::value || Traits::weakHandlingFlag == WTF::WeakHandlingInCollections) |
+ if (WTF::IsTraceableInCollectionTrait<Traits>::value || Traits::weakHandlingFlag == WTF::WeakHandlingInCollections) |
WTF::TraceInCollectionTrait<WTF::NoWeakHandlingInCollections, WTF::WeakPointersActStrong, Backing, void>::trace(visitor, self); |
} |
@@ -256,13 +256,13 @@ template<typename T, typename U> |
class TraceTrait<std::pair<T, U>> { |
STATIC_ONLY(TraceTrait); |
public: |
- static const bool firstNeedsTracing = WTF::NeedsTracing<T>::value || WTF::IsWeak<T>::value; |
- static const bool secondNeedsTracing = WTF::NeedsTracing<U>::value || WTF::IsWeak<U>::value; |
+ static const bool firstIsTraceable = WTF::IsTraceable<T>::value; |
+ static const bool secondIsTraceable = WTF::IsTraceable<U>::value; |
template<typename VisitorDispatcher> |
static void trace(VisitorDispatcher visitor, std::pair<T, U>* pair) |
{ |
- TraceIfEnabled<T, firstNeedsTracing>::trace(visitor, pair->first); |
- TraceIfEnabled<U, secondNeedsTracing>::trace(visitor, pair->second); |
+ TraceIfEnabled<T, firstIsTraceable>::trace(visitor, pair->first); |
+ TraceIfEnabled<U, secondIsTraceable>::trace(visitor, pair->second); |
} |
}; |
@@ -354,16 +354,8 @@ public: |
static const bool value = false; |
}; |
-template <typename T> struct RemoveHeapPointerWrapperTypes { |
- STATIC_ONLY(RemoveHeapPointerWrapperTypes); |
- using Type = typename WTF::RemoveTemplate<typename WTF::RemoveTemplate<T, Member>::Type, WeakMember>::Type; |
-}; |
- |
-// FIXME: Oilpan: TraceIfNeeded should be implemented ala: |
-// NeedsTracing<T>::value || IsWeakMember<T>::value. It should not need to test |
-// raw pointer types. |
template<typename T> |
-struct TraceIfNeeded : public TraceIfEnabled<T, WTF::NeedsTracing<T>::value || IsGarbageCollectedType<typename RemoveHeapPointerWrapperTypes<typename std::remove_pointer<T>::type>::Type>::value> { |
+struct TraceIfNeeded : public TraceIfEnabled<T, WTF::IsTraceable<T>::value> { |
STATIC_ONLY(TraceIfNeeded); |
}; |
@@ -382,7 +374,7 @@ struct TraceInCollectionTrait<NoWeakHandlingInCollections, strongify, T, Traits> |
template<typename VisitorDispatcher> |
static bool trace(VisitorDispatcher visitor, T& t) |
{ |
- ASSERT(NeedsTracingTrait<Traits>::value); |
+ DCHECK(IsTraceableInCollectionTrait<Traits>::value); |
visitor->trace(t); |
return false; |
} |
@@ -420,13 +412,13 @@ struct TraceInCollectionTrait<NoWeakHandlingInCollections, strongify, blink::Hea |
// This is fine because the fact that the object can be initialized |
// with memset indicates that it is safe to treat the zerod slot |
// as a valid object. |
- static_assert(!NeedsTracingTrait<Traits>::value || Traits::canClearUnusedSlotsWithMemset || std::is_polymorphic<T>::value, "HeapVectorBacking doesn't support objects that cannot be cleared as unused with memset."); |
+ static_assert(!IsTraceableInCollectionTrait<Traits>::value || Traits::canClearUnusedSlotsWithMemset || std::is_polymorphic<T>::value, "HeapVectorBacking doesn't support objects that cannot be cleared as unused with memset."); |
// This trace method is instantiated for vectors where |
- // NeedsTracingTrait<Traits>::value is false, but the trace method |
+ // IsTraceableInCollectionTrait<Traits>::value is false, but the trace method |
// should not be called. Thus we cannot static-assert |
- // NeedsTracingTrait<Traits>::value but should runtime-assert it. |
- ASSERT(NeedsTracingTrait<Traits>::value); |
+ // IsTraceableInCollectionTrait<Traits>::value but should runtime-assert it. |
+ DCHECK(IsTraceableInCollectionTrait<Traits>::value); |
T* array = reinterpret_cast<T*>(self); |
blink::HeapObjectHeader* header = blink::HeapObjectHeader::fromPayload(self); |
@@ -437,7 +429,7 @@ struct TraceInCollectionTrait<NoWeakHandlingInCollections, strongify, blink::Hea |
if (std::is_polymorphic<T>::value) { |
for (size_t i = 0; i < length; ++i) { |
if (blink::vTableInitialized(&array[i])) |
- blink::TraceIfEnabled<T, NeedsTracingTrait<Traits>::value>::trace(visitor, array[i]); |
+ blink::TraceIfEnabled<T, IsTraceableInCollectionTrait<Traits>::value>::trace(visitor, array[i]); |
} |
} else { |
#ifdef ANNOTATE_CONTIGUOUS_CONTAINER |
@@ -446,7 +438,7 @@ struct TraceInCollectionTrait<NoWeakHandlingInCollections, strongify, blink::Hea |
ANNOTATE_CHANGE_SIZE(array, length, 0, length); |
#endif |
for (size_t i = 0; i < length; ++i) |
- blink::TraceIfEnabled<T, NeedsTracingTrait<Traits>::value>::trace(visitor, array[i]); |
+ blink::TraceIfEnabled<T, IsTraceableInCollectionTrait<Traits>::value>::trace(visitor, array[i]); |
} |
return false; |
} |
@@ -464,7 +456,7 @@ struct TraceInCollectionTrait<NoWeakHandlingInCollections, strongify, blink::Hea |
{ |
static_assert(strongify == WTF::WeakPointersActStrong, "An on-stack HeapHashTable needs to be visited strongly."); |
- ASSERT(NeedsTracingTrait<Traits>::value || Traits::weakHandlingFlag == WeakHandlingInCollections); |
+ DCHECK(IsTraceableInCollectionTrait<Traits>::value || Traits::weakHandlingFlag == WeakHandlingInCollections); |
Value* array = reinterpret_cast<Value*>(self); |
blink::HeapObjectHeader* header = blink::HeapObjectHeader::fromPayload(self); |
ASSERT(header->checkHeader()); |
@@ -473,7 +465,7 @@ struct TraceInCollectionTrait<NoWeakHandlingInCollections, strongify, blink::Hea |
size_t length = header->payloadSize() / sizeof(Value); |
for (size_t i = 0; i < length; ++i) { |
if (!HashTableHelper<Value, typename Table::ExtractorType, typename Table::KeyTraitsType>::isEmptyOrDeletedBucket(array[i])) |
- blink::TraceCollectionIfEnabled<NeedsTracingTrait<Traits>::value, Traits::weakHandlingFlag, strongify, Value, Traits>::trace(visitor, array[i]); |
+ blink::TraceCollectionIfEnabled<IsTraceableInCollectionTrait<Traits>::value, Traits::weakHandlingFlag, strongify, Value, Traits>::trace(visitor, array[i]); |
} |
return false; |
} |
@@ -518,9 +510,9 @@ struct TraceInCollectionTrait<NoWeakHandlingInCollections, strongify, KeyValuePa |
template<typename VisitorDispatcher> |
static bool trace(VisitorDispatcher visitor, KeyValuePair<Key, Value>& self) |
{ |
- ASSERT(NeedsTracingTrait<Traits>::value); |
- blink::TraceCollectionIfEnabled<NeedsTracingTrait<typename Traits::KeyTraits>::value, NoWeakHandlingInCollections, strongify, Key, typename Traits::KeyTraits>::trace(visitor, self.key); |
- blink::TraceCollectionIfEnabled<NeedsTracingTrait<typename Traits::ValueTraits>::value, NoWeakHandlingInCollections, strongify, Value, typename Traits::ValueTraits>::trace(visitor, self.value); |
+ DCHECK(IsTraceableInCollectionTrait<Traits>::value); |
+ blink::TraceCollectionIfEnabled<IsTraceableInCollectionTrait<typename Traits::KeyTraits>::value, NoWeakHandlingInCollections, strongify, Key, typename Traits::KeyTraits>::trace(visitor, self.key); |
+ blink::TraceCollectionIfEnabled<IsTraceableInCollectionTrait<typename Traits::ValueTraits>::value, NoWeakHandlingInCollections, strongify, Value, typename Traits::ValueTraits>::trace(visitor, self.value); |
return false; |
} |
}; |
@@ -547,21 +539,21 @@ struct TraceInCollectionTrait<WeakHandlingInCollections, strongify, KeyValuePair |
// reviewers, and we may relax it. |
const bool keyIsWeak = Traits::KeyTraits::weakHandlingFlag == WeakHandlingInCollections; |
const bool valueIsWeak = Traits::ValueTraits::weakHandlingFlag == WeakHandlingInCollections; |
- const bool keyHasStrongRefs = NeedsTracingTrait<typename Traits::KeyTraits>::value; |
- const bool valueHasStrongRefs = NeedsTracingTrait<typename Traits::ValueTraits>::value; |
+ const bool keyHasStrongRefs = IsTraceableInCollectionTrait<typename Traits::KeyTraits>::value; |
+ const bool valueHasStrongRefs = IsTraceableInCollectionTrait<typename Traits::ValueTraits>::value; |
static_assert(!keyIsWeak || !valueIsWeak || !keyHasStrongRefs || !valueHasStrongRefs, "this configuration is disallowed to avoid unexpected leaks"); |
if ((valueIsWeak && !keyIsWeak) || (valueIsWeak && keyIsWeak && !valueHasStrongRefs)) { |
// Check value first. |
- bool deadWeakObjectsFoundOnValueSide = blink::TraceCollectionIfEnabled<NeedsTracingTrait<typename Traits::ValueTraits>::value, Traits::ValueTraits::weakHandlingFlag, strongify, Value, typename Traits::ValueTraits>::trace(visitor, self.value); |
+ bool deadWeakObjectsFoundOnValueSide = blink::TraceCollectionIfEnabled<IsTraceableInCollectionTrait<typename Traits::ValueTraits>::value, Traits::ValueTraits::weakHandlingFlag, strongify, Value, typename Traits::ValueTraits>::trace(visitor, self.value); |
if (deadWeakObjectsFoundOnValueSide) |
return true; |
- return blink::TraceCollectionIfEnabled<NeedsTracingTrait<typename Traits::KeyTraits>::value, Traits::KeyTraits::weakHandlingFlag, strongify, Key, typename Traits::KeyTraits>::trace(visitor, self.key); |
+ return blink::TraceCollectionIfEnabled<IsTraceableInCollectionTrait<typename Traits::KeyTraits>::value, Traits::KeyTraits::weakHandlingFlag, strongify, Key, typename Traits::KeyTraits>::trace(visitor, self.key); |
} |
// Check key first. |
- bool deadWeakObjectsFoundOnKeySide = blink::TraceCollectionIfEnabled<NeedsTracingTrait<typename Traits::KeyTraits>::value, Traits::KeyTraits::weakHandlingFlag, strongify, Key, typename Traits::KeyTraits>::trace(visitor, self.key); |
+ bool deadWeakObjectsFoundOnKeySide = blink::TraceCollectionIfEnabled<IsTraceableInCollectionTrait<typename Traits::KeyTraits>::value, Traits::KeyTraits::weakHandlingFlag, strongify, Key, typename Traits::KeyTraits>::trace(visitor, self.key); |
if (deadWeakObjectsFoundOnKeySide) |
return true; |
- return blink::TraceCollectionIfEnabled<NeedsTracingTrait<typename Traits::ValueTraits>::value, Traits::ValueTraits::weakHandlingFlag, strongify, Value, typename Traits::ValueTraits>::trace(visitor, self.value); |
+ return blink::TraceCollectionIfEnabled<IsTraceableInCollectionTrait<typename Traits::ValueTraits>::value, Traits::ValueTraits::weakHandlingFlag, strongify, Value, typename Traits::ValueTraits>::trace(visitor, self.value); |
} |
}; |
@@ -572,7 +564,7 @@ struct TraceInCollectionTrait<NoWeakHandlingInCollections, strongify, LinkedHash |
template<typename VisitorDispatcher> |
static bool trace(VisitorDispatcher visitor, LinkedHashSetNode<Value, Allocator>& self) |
{ |
- ASSERT(NeedsTracingTrait<Traits>::value); |
+ DCHECK(IsTraceableInCollectionTrait<Traits>::value); |
return TraceInCollectionTrait<NoWeakHandlingInCollections, strongify, Value, typename Traits::ValueTraits>::trace(visitor, self.m_value); |
} |
}; |
@@ -595,7 +587,7 @@ struct TraceInCollectionTrait<NoWeakHandlingInCollections, strongify, ListHashSe |
template<typename VisitorDispatcher> |
static bool trace(VisitorDispatcher visitor, Node* node) |
{ |
- ASSERT(NeedsTracingTrait<Traits>::value); |
+ DCHECK(IsTraceableInCollectionTrait<Traits>::value); |
traceListHashSetValue(visitor, node->m_value); |
// Just mark the node without tracing because we already traced the |
// contents, and there is no need to trace the next and prev fields |