OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
260 static const bool value = TraceEagerlyTrait<T>::value; | 260 static const bool value = TraceEagerlyTrait<T>::value; |
261 }; | 261 }; |
262 | 262 |
263 template<typename ValueArg, size_t inlineCapacity> class HeapListHashSetAllocato
r; | 263 template<typename ValueArg, size_t inlineCapacity> class HeapListHashSetAllocato
r; |
264 template<typename T, size_t inlineCapacity> | 264 template<typename T, size_t inlineCapacity> |
265 class TraceEagerlyTrait<WTF::ListHashSetNode<T, HeapListHashSetAllocator<T, inli
neCapacity>>> { | 265 class TraceEagerlyTrait<WTF::ListHashSetNode<T, HeapListHashSetAllocator<T, inli
neCapacity>>> { |
266 public: | 266 public: |
267 static const bool value = false; | 267 static const bool value = false; |
268 }; | 268 }; |
269 | 269 |
270 template<typename Collection> | |
271 struct OffHeapCollectionTraceTrait; | |
272 | |
273 template<typename T, bool = NeedsAdjustAndMark<T>::value> class ObjectAliveTrait
; | 270 template<typename T, bool = NeedsAdjustAndMark<T>::value> class ObjectAliveTrait
; |
274 | 271 |
275 template<typename T> | 272 template<typename T> |
276 class ObjectAliveTrait<T, false> { | 273 class ObjectAliveTrait<T, false> { |
277 public: | 274 public: |
278 template<typename VisitorDispatcher> | 275 template<typename VisitorDispatcher> |
279 static bool isHeapObjectAlive(VisitorDispatcher visitor, T* obj) | 276 static bool isHeapObjectAlive(VisitorDispatcher visitor, T* obj) |
280 { | 277 { |
281 return visitor->isMarked(obj); | 278 return visitor->isMarked(obj); |
282 } | 279 } |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
374 // Check that we actually know the definition of T when tracing. | 371 // Check that we actually know the definition of T when tracing. |
375 static_assert(sizeof(T), "T must be fully defined"); | 372 static_assert(sizeof(T), "T must be fully defined"); |
376 if (WTF::IsPolymorphic<T>::value) { | 373 if (WTF::IsPolymorphic<T>::value) { |
377 intptr_t vtable = *reinterpret_cast<const intptr_t*>(&t); | 374 intptr_t vtable = *reinterpret_cast<const intptr_t*>(&t); |
378 if (!vtable) | 375 if (!vtable) |
379 return; | 376 return; |
380 } | 377 } |
381 TraceTrait<T>::trace(Derived::fromHelper(this), &const_cast<T&>(t)); | 378 TraceTrait<T>::trace(Derived::fromHelper(this), &const_cast<T&>(t)); |
382 } | 379 } |
383 | 380 |
384 // The following trace methods are for off-heap collections. | |
385 template<typename T, size_t inlineCapacity> | |
386 void trace(const Vector<T, inlineCapacity>& vector) | |
387 { | |
388 OffHeapCollectionTraceTrait<Vector<T, inlineCapacity, WTF::DefaultAlloca
tor>>::trace(Derived::fromHelper(this), vector); | |
389 } | |
390 | |
391 template<typename T, size_t N> | |
392 void trace(const Deque<T, N>& deque) | |
393 { | |
394 OffHeapCollectionTraceTrait<Deque<T, N>>::trace(Derived::fromHelper(this
), deque); | |
395 } | |
396 | |
397 #if !ENABLE(OILPAN) | 381 #if !ENABLE(OILPAN) |
398 // These trace methods are needed to allow compiling and calling trace on | 382 // These trace methods are needed to allow compiling and calling trace on |
399 // transition types. We need to support calls in the non-oilpan build | 383 // transition types. We need to support calls in the non-oilpan build |
400 // because a fully transitioned type (which will have its trace method | 384 // because a fully transitioned type (which will have its trace method |
401 // called) might trace a field that is in transition. Once transition types | 385 // called) might trace a field that is in transition. Once transition types |
402 // are removed these can be removed. | 386 // are removed these can be removed. |
403 template<typename T> void trace(const OwnPtr<T>&) { } | 387 template<typename T> void trace(const OwnPtr<T>&) { } |
404 template<typename T> void trace(const RefPtr<T>&) { } | 388 template<typename T> void trace(const RefPtr<T>&) { } |
405 template<typename T> void trace(const RawPtr<T>&) { } | 389 template<typename T> void trace(const RawPtr<T>&) { } |
406 template<typename T> void trace(const WeakPtr<T>&) { } | 390 template<typename T> void trace(const WeakPtr<T>&) { } |
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
606 | 590 |
607 template <typename Derived> | 591 template <typename Derived> |
608 template <typename T> | 592 template <typename T> |
609 void VisitorHelper<Derived>::handleWeakCell(Visitor* self, void* obj) | 593 void VisitorHelper<Derived>::handleWeakCell(Visitor* self, void* obj) |
610 { | 594 { |
611 T** cell = reinterpret_cast<T**>(obj); | 595 T** cell = reinterpret_cast<T**>(obj); |
612 if (*cell && !self->isHeapObjectAlive(*cell)) | 596 if (*cell && !self->isHeapObjectAlive(*cell)) |
613 *cell = nullptr; | 597 *cell = nullptr; |
614 } | 598 } |
615 | 599 |
616 // We trace vectors by using the trace trait on each element, which means you | |
617 // can have vectors of general objects (not just pointers to objects) that can | |
618 // be traced. | |
619 template<typename T, size_t N> | |
620 struct OffHeapCollectionTraceTrait<WTF::Vector<T, N, WTF::DefaultAllocator>> { | |
621 typedef WTF::Vector<T, N, WTF::DefaultAllocator> Vector; | |
622 | |
623 template<typename VisitorDispatcher> | |
624 static void trace(VisitorDispatcher visitor, const Vector& vector) | |
625 { | |
626 if (vector.isEmpty()) | |
627 return; | |
628 for (typename Vector::const_iterator it = vector.begin(), end = vector.e
nd(); it != end; ++it) | |
629 TraceTrait<T>::trace(visitor, const_cast<T*>(it)); | |
630 } | |
631 }; | |
632 | |
633 template<typename T, size_t N> | |
634 struct OffHeapCollectionTraceTrait<WTF::Deque<T, N>> { | |
635 typedef WTF::Deque<T, N> Deque; | |
636 | |
637 template<typename VisitorDispatcher> | |
638 static void trace(VisitorDispatcher visitor, const Deque& deque) | |
639 { | |
640 if (deque.isEmpty()) | |
641 return; | |
642 for (typename Deque::const_iterator it = deque.begin(), end = deque.end(
); it != end; ++it) | |
643 TraceTrait<T>::trace(visitor, const_cast<T*>(&(*it))); | |
644 } | |
645 }; | |
646 | |
647 template<typename T> struct GCInfoTrait; | 600 template<typename T> struct GCInfoTrait; |
648 | 601 |
649 template<typename T> | 602 template<typename T> |
650 class DefaultTraceTrait<T, false> { | 603 class DefaultTraceTrait<T, false> { |
651 public: | 604 public: |
652 template<typename VisitorDispatcher> | 605 template<typename VisitorDispatcher> |
653 static void mark(VisitorDispatcher visitor, const T* t) | 606 static void mark(VisitorDispatcher visitor, const T* t) |
654 { | 607 { |
655 // Default mark method of the trait just calls the two-argument mark | 608 // Default mark method of the trait just calls the two-argument mark |
656 // method on the visitor. The second argument is the static trace method | 609 // method on the visitor. The second argument is the static trace method |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
723 { | 676 { |
724 DEFINE_STATIC_LOCAL(String, typenameString, (WTF::extractTypeNameFromFun
ctionName(WTF::extractNameFunction<T>()))); | 677 DEFINE_STATIC_LOCAL(String, typenameString, (WTF::extractTypeNameFromFun
ctionName(WTF::extractNameFunction<T>()))); |
725 return typenameString; | 678 return typenameString; |
726 } | 679 } |
727 }; | 680 }; |
728 #endif | 681 #endif |
729 | 682 |
730 } // namespace blink | 683 } // namespace blink |
731 | 684 |
732 #endif // Visitor_h | 685 #endif // Visitor_h |
OLD | NEW |