Chromium Code Reviews| 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 285c6d7ccd5d59a48bdfc414fcbdf91c5f3e3f4d..110b7d5466f4816e9440a26e33b1a677e5487360 100644 |
| --- a/third_party/WebKit/Source/platform/heap/TraceTraits.h |
| +++ b/third_party/WebKit/Source/platform/heap/TraceTraits.h |
| @@ -101,7 +101,10 @@ struct TraceIfEnabled; |
| template<typename T> |
| struct TraceIfEnabled<T, false> { |
| template<typename VisitorDispatcher> |
| - static void trace(VisitorDispatcher, T&) { } |
| + static void trace(VisitorDispatcher, T&) |
| + { |
| + static_assert(!WTF::NeedsTracing<T>::value, "T should not be traced"); |
| + } |
| }; |
| template<typename T> |
| @@ -109,6 +112,7 @@ 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"); |
| visitor->trace(t); |
| } |
| }; |
| @@ -118,7 +122,11 @@ template<bool needsTracing, WTF::WeakHandlingFlag weakHandlingFlag, WTF::ShouldW |
| template<WTF::ShouldWeakPointersBeMarkedStrongly strongify, typename T, typename Traits> |
| struct TraceCollectionIfEnabled<false, WTF::NoWeakHandlingInCollections, strongify, T, Traits> { |
| template<typename VisitorDispatcher> |
| - static bool trace(VisitorDispatcher, T&) { return false; } |
| + static bool trace(VisitorDispatcher, T&) |
| + { |
| + static_assert(!WTF::NeedsTracingTrait<Traits>::value, "Traits should not be traced"); |
| + return false; |
| + } |
| }; |
| template<bool needsTracing, WTF::WeakHandlingFlag weakHandlingFlag, WTF::ShouldWeakPointersBeMarkedStrongly strongify, typename T, typename Traits> |
| @@ -126,6 +134,7 @@ struct TraceCollectionIfEnabled { |
| template<typename VisitorDispatcher> |
| static bool trace(VisitorDispatcher visitor, T& t) |
| { |
| + static_assert(WTF::NeedsTracingTrait<Traits>::value || weakHandlingFlag == WTF::WeakHandlingInCollections, "Traits should be traced"); |
| return WTF::TraceInCollectionTrait<weakHandlingFlag, strongify, T, Traits>::trace(visitor, t); |
| } |
| }; |
| @@ -159,6 +168,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"); |
| if (visitor->markingMode() == Visitor::GlobalMarking) { |
| // Switch to inlined global marking dispatch. |
| static_cast<T*>(self)->trace(InlinedGlobalMarkingVisitor(visitor)); |
| @@ -170,6 +180,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"); |
|
sof
2015/10/19 06:33:18
What is this assert for (in this context)? NeedsTr
|
| static_cast<T*>(self)->trace(visitor); |
| } |
| @@ -338,6 +349,7 @@ struct TraceInCollectionTrait<NoWeakHandlingInCollections, strongify, T, Traits> |
| template<typename VisitorDispatcher> |
| static bool trace(VisitorDispatcher visitor, T& t) |
| { |
| + ASSERT(NeedsTracingTrait<Traits>::value); |
| visitor->trace(t); |
| return false; |
| } |
| @@ -419,6 +431,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); |
| Value* array = reinterpret_cast<Value*>(self); |
| blink::HeapObjectHeader* header = blink::HeapObjectHeader::fromPayload(self); |
| ASSERT(header->checkHeader()); |
| @@ -549,6 +562,7 @@ struct TraceInCollectionTrait<NoWeakHandlingInCollections, strongify, ListHashSe |
| template<typename VisitorDispatcher> |
| static bool trace(VisitorDispatcher visitor, Node* node) |
| { |
| + ASSERT(NeedsTracingTrait<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 |