Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6)

Side by Side Diff: third_party/WebKit/Source/platform/heap/TraceTraits.h

Issue 1477213003: More switching to standard type traits (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Excluded WTF::IsSubclass from the patch Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef TraceTraits_h 5 #ifndef TraceTraits_h
6 #define TraceTraits_h 6 #define TraceTraits_h
7 7
8 #include "platform/heap/GCInfo.h" 8 #include "platform/heap/GCInfo.h"
9 #include "platform/heap/Heap.h" 9 #include "platform/heap/Heap.h"
10 #include "platform/heap/InlinedGlobalMarkingVisitor.h" 10 #include "platform/heap/InlinedGlobalMarkingVisitor.h"
(...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after
378 // traces only slots that are not zeroed out. This is because if 378 // traces only slots that are not zeroed out. This is because if
379 // the object has a vtable, the zeroed slot means that it is 379 // the object has a vtable, the zeroed slot means that it is
380 // an unused slot (Remember that the unused slots are guaranteed 380 // an unused slot (Remember that the unused slots are guaranteed
381 // to be zeroed out by VectorUnusedSlotClearer). 381 // to be zeroed out by VectorUnusedSlotClearer).
382 // 382 //
383 // - An object that can be initialized with memset. In this case, 383 // - An object that can be initialized with memset. In this case,
384 // HeapVectorBacking traces all slots including unused slots. 384 // HeapVectorBacking traces all slots including unused slots.
385 // This is fine because the fact that the object can be initialized 385 // This is fine because the fact that the object can be initialized
386 // with memset indicates that it is safe to treat the zerod slot 386 // with memset indicates that it is safe to treat the zerod slot
387 // as a valid object. 387 // as a valid object.
388 static_assert(!NeedsTracingTrait<Traits>::value || Traits::canClearUnuse dSlotsWithMemset || WTF::IsPolymorphic<T>::value, "HeapVectorBacking doesn't sup port objects that cannot be cleared as unused with memset."); 388 static_assert(!NeedsTracingTrait<Traits>::value || Traits::canClearUnuse dSlotsWithMemset || std::is_polymorphic<T>::value, "HeapVectorBacking doesn't su pport objects that cannot be cleared as unused with memset.");
389 389
390 // This trace method is instantiated for vectors where 390 // This trace method is instantiated for vectors where
391 // NeedsTracingTrait<Traits>::value is false, but the trace method 391 // NeedsTracingTrait<Traits>::value is false, but the trace method
392 // should not be called. Thus we cannot static-assert 392 // should not be called. Thus we cannot static-assert
393 // NeedsTracingTrait<Traits>::value but should runtime-assert it. 393 // NeedsTracingTrait<Traits>::value but should runtime-assert it.
394 ASSERT(NeedsTracingTrait<Traits>::value); 394 ASSERT(NeedsTracingTrait<Traits>::value);
395 395
396 T* array = reinterpret_cast<T*>(self); 396 T* array = reinterpret_cast<T*>(self);
397 blink::HeapObjectHeader* header = blink::HeapObjectHeader::fromPayload(s elf); 397 blink::HeapObjectHeader* header = blink::HeapObjectHeader::fromPayload(s elf);
398 ASSERT(header->checkHeader()); 398 ASSERT(header->checkHeader());
399 // Use the payload size as recorded by the heap to determine how many 399 // Use the payload size as recorded by the heap to determine how many
400 // elements to trace. 400 // elements to trace.
401 size_t length = header->payloadSize() / sizeof(T); 401 size_t length = header->payloadSize() / sizeof(T);
402 if (WTF::IsPolymorphic<T>::value) { 402 if (std::is_polymorphic<T>::value) {
403 for (size_t i = 0; i < length; ++i) { 403 for (size_t i = 0; i < length; ++i) {
404 if (blink::vTableInitialized(&array[i])) 404 if (blink::vTableInitialized(&array[i]))
405 blink::TraceIfEnabled<T, NeedsTracingTrait<Traits>::value>:: trace(visitor, array[i]); 405 blink::TraceIfEnabled<T, NeedsTracingTrait<Traits>::value>:: trace(visitor, array[i]);
406 } 406 }
407 } else { 407 } else {
408 #ifdef ANNOTATE_CONTIGUOUS_CONTAINER 408 #ifdef ANNOTATE_CONTIGUOUS_CONTAINER
409 // As commented above, HeapVectorBacking can trace unused slots 409 // As commented above, HeapVectorBacking can trace unused slots
410 // (which are already zeroed out). 410 // (which are already zeroed out).
411 ANNOTATE_CHANGE_SIZE(array, length, 0, length); 411 ANNOTATE_CHANGE_SIZE(array, length, 0, length);
412 #endif 412 #endif
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
567 // since iterating over the hash table backing will find the whole 567 // since iterating over the hash table backing will find the whole
568 // chain. 568 // chain.
569 visitor->markNoTracing(node); 569 visitor->markNoTracing(node);
570 return false; 570 return false;
571 } 571 }
572 }; 572 };
573 573
574 } // namespace WTF 574 } // namespace WTF
575 575
576 #endif 576 #endif
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/platform/heap/HeapAllocator.h ('k') | third_party/WebKit/Source/platform/heap/Visitor.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698