| 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 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 187 // However, the TraceTrait can be specialized to use a different | 187 // However, the TraceTrait can be specialized to use a different |
| 188 // implementation. A common case where a TraceTrait specialization is | 188 // implementation. A common case where a TraceTrait specialization is |
| 189 // needed is when multiple inheritance leads to pointers that are not | 189 // needed is when multiple inheritance leads to pointers that are not |
| 190 // to the start of the object in the Blink garbage-collected heap. In | 190 // to the start of the object in the Blink garbage-collected heap. In |
| 191 // that case the pointer has to be adjusted before marking. | 191 // that case the pointer has to be adjusted before marking. |
| 192 template<typename T> | 192 template<typename T> |
| 193 class TraceTrait { | 193 class TraceTrait { |
| 194 public: | 194 public: |
| 195 // Default implementation of TraceTrait<T>::trace just statically | 195 // Default implementation of TraceTrait<T>::trace just statically |
| 196 // dispatches to the trace method of the class T. | 196 // dispatches to the trace method of the class T. |
| 197 template<typename TraceDispatcher> | 197 template<typename VisitorDispatcher> |
| 198 static void trace(TraceDispatcher visitor, void* self) | 198 static void trace(VisitorDispatcher visitor, void* self) |
| 199 { | 199 { |
| 200 TraceCompatibilityAdaptor<T>::trace(visitor, static_cast<T*>(self)); | 200 TraceCompatibilityAdaptor<T>::trace(visitor, static_cast<T*>(self)); |
| 201 } | 201 } |
| 202 | 202 |
| 203 static void mark(Visitor* visitor, const T* t) | 203 template<typename VisitorDispatcher> |
| 204 static void mark(VisitorDispatcher visitor, const T* t) |
| 204 { | 205 { |
| 205 DefaultTraceTrait<T>::mark(visitor, t); | 206 DefaultTraceTrait<T>::mark(visitor, t); |
| 206 } | 207 } |
| 207 | 208 |
| 208 #if ENABLE(ASSERT) | 209 #if ENABLE(ASSERT) |
| 209 static void checkGCInfo(const T* t) | 210 static void checkGCInfo(const T* t) |
| 210 { | 211 { |
| 211 DefaultTraceTrait<T>::checkGCInfo(t); | 212 DefaultTraceTrait<T>::checkGCInfo(t); |
| 212 } | 213 } |
| 213 #endif | 214 #endif |
| (...skipping 432 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 646 bool m_isGlobalMarkingVisitor; | 647 bool m_isGlobalMarkingVisitor; |
| 647 }; | 648 }; |
| 648 | 649 |
| 649 // We trace vectors by using the trace trait on each element, which means you | 650 // We trace vectors by using the trace trait on each element, which means you |
| 650 // can have vectors of general objects (not just pointers to objects) that can | 651 // can have vectors of general objects (not just pointers to objects) that can |
| 651 // be traced. | 652 // be traced. |
| 652 template<typename T, size_t N> | 653 template<typename T, size_t N> |
| 653 struct OffHeapCollectionTraceTrait<WTF::Vector<T, N, WTF::DefaultAllocator> > { | 654 struct OffHeapCollectionTraceTrait<WTF::Vector<T, N, WTF::DefaultAllocator> > { |
| 654 typedef WTF::Vector<T, N, WTF::DefaultAllocator> Vector; | 655 typedef WTF::Vector<T, N, WTF::DefaultAllocator> Vector; |
| 655 | 656 |
| 656 static void trace(Visitor* visitor, const Vector& vector) | 657 template<typename VisitorDispatcher> |
| 658 static void trace(VisitorDispatcher visitor, const Vector& vector) |
| 657 { | 659 { |
| 658 if (vector.isEmpty()) | 660 if (vector.isEmpty()) |
| 659 return; | 661 return; |
| 660 for (typename Vector::const_iterator it = vector.begin(), end = vector.e
nd(); it != end; ++it) | 662 for (typename Vector::const_iterator it = vector.begin(), end = vector.e
nd(); it != end; ++it) |
| 661 TraceTrait<T>::trace(visitor, const_cast<T*>(it)); | 663 TraceTrait<T>::trace(visitor, const_cast<T*>(it)); |
| 662 } | 664 } |
| 663 }; | 665 }; |
| 664 | 666 |
| 665 template<typename T, size_t N> | 667 template<typename T, size_t N> |
| 666 struct OffHeapCollectionTraceTrait<WTF::Deque<T, N> > { | 668 struct OffHeapCollectionTraceTrait<WTF::Deque<T, N> > { |
| 667 typedef WTF::Deque<T, N> Deque; | 669 typedef WTF::Deque<T, N> Deque; |
| 668 | 670 |
| 669 static void trace(Visitor* visitor, const Deque& deque) | 671 template<typename VisitorDispatcher> |
| 672 static void trace(VisitorDispatcher visitor, const Deque& deque) |
| 670 { | 673 { |
| 671 if (deque.isEmpty()) | 674 if (deque.isEmpty()) |
| 672 return; | 675 return; |
| 673 for (typename Deque::const_iterator it = deque.begin(), end = deque.end(
); it != end; ++it) | 676 for (typename Deque::const_iterator it = deque.begin(), end = deque.end(
); it != end; ++it) |
| 674 TraceTrait<T>::trace(visitor, const_cast<T*>(&(*it))); | 677 TraceTrait<T>::trace(visitor, const_cast<T*>(&(*it))); |
| 675 } | 678 } |
| 676 }; | 679 }; |
| 677 | 680 |
| 678 template<typename T, typename Traits = WTF::VectorTraits<T> > | 681 template<typename T, typename Traits = WTF::VectorTraits<T> > |
| 679 class HeapVectorBacking; | 682 class HeapVectorBacking; |
| 680 | 683 |
| 681 template<typename Table> | 684 template<typename Table> |
| 682 class HeapHashTableBacking { | 685 class HeapHashTableBacking { |
| 683 public: | 686 public: |
| 684 static void finalize(void* pointer); | 687 static void finalize(void* pointer); |
| 685 }; | 688 }; |
| 686 | 689 |
| 687 template<typename T> | 690 template<typename T> |
| 688 class DefaultTraceTrait<T, false> { | 691 class DefaultTraceTrait<T, false> { |
| 689 public: | 692 public: |
| 690 static void mark(Visitor* visitor, const T* t) | 693 template<typename VisitorDispatcher> |
| 694 static void mark(VisitorDispatcher visitor, const T* t) |
| 691 { | 695 { |
| 692 // Default mark method of the trait just calls the two-argument mark | 696 // Default mark method of the trait just calls the two-argument mark |
| 693 // method on the visitor. The second argument is the static trace method | 697 // method on the visitor. The second argument is the static trace method |
| 694 // of the trait, which by default calls the instance method | 698 // of the trait, which by default calls the instance method |
| 695 // trace(Visitor*) on the object. | 699 // trace(Visitor*) on the object. |
| 696 // | 700 // |
| 697 // If the trait allows it, invoke the trace callback right here on the | 701 // If the trait allows it, invoke the trace callback right here on the |
| 698 // not-yet-marked object. | 702 // not-yet-marked object. |
| 699 if (TraceEagerlyTrait<T>::value) { | 703 if (TraceEagerlyTrait<T>::value) { |
| 700 // Protect against too deep trace call chains, and the | 704 // Protect against too deep trace call chains, and the |
| (...skipping 19 matching lines...) Expand all Loading... |
| 720 static void checkGCInfo(const T* t) | 724 static void checkGCInfo(const T* t) |
| 721 { | 725 { |
| 722 assertObjectHasGCInfo(const_cast<T*>(t), GCInfoTrait<T>::index()); | 726 assertObjectHasGCInfo(const_cast<T*>(t), GCInfoTrait<T>::index()); |
| 723 } | 727 } |
| 724 #endif | 728 #endif |
| 725 }; | 729 }; |
| 726 | 730 |
| 727 template<typename T> | 731 template<typename T> |
| 728 class DefaultTraceTrait<T, true> { | 732 class DefaultTraceTrait<T, true> { |
| 729 public: | 733 public: |
| 730 static void mark(Visitor* visitor, const T* self) | 734 template<typename VisitorDispatcher> |
| 735 static void mark(VisitorDispatcher visitor, const T* self) |
| 731 { | 736 { |
| 732 if (!self) | 737 if (!self) |
| 733 return; | 738 return; |
| 734 | 739 |
| 735 // If you hit this ASSERT, it means that there is a dangling pointer | 740 // If you hit this ASSERT, it means that there is a dangling pointer |
| 736 // from a live thread heap to a dead thread heap. We must eliminate | 741 // from a live thread heap to a dead thread heap. We must eliminate |
| 737 // the dangling pointer. | 742 // the dangling pointer. |
| 738 // Release builds don't have the ASSERT, but it is OK because | 743 // Release builds don't have the ASSERT, but it is OK because |
| 739 // release builds will crash at the following self->adjustAndMark | 744 // release builds will crash at the following self->adjustAndMark |
| 740 // because all the entries of the orphaned heaps are zeroed out and | 745 // because all the entries of the orphaned heaps are zeroed out and |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 884 struct GCInfoTrait { | 889 struct GCInfoTrait { |
| 885 static size_t index() | 890 static size_t index() |
| 886 { | 891 { |
| 887 return GCInfoAtBase<typename GetGarbageCollectedBase<T>::type>::index(); | 892 return GCInfoAtBase<typename GetGarbageCollectedBase<T>::type>::index(); |
| 888 } | 893 } |
| 889 }; | 894 }; |
| 890 | 895 |
| 891 } | 896 } |
| 892 | 897 |
| 893 #endif | 898 #endif |
| OLD | NEW |