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

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

Issue 1609943003: Make platform/heap to use USING_FAST_MALLOC. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed compile error 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"
11 #include "platform/heap/Visitor.h" 11 #include "platform/heap/Visitor.h"
12 #include "wtf/Allocator.h"
12 #include "wtf/Assertions.h" 13 #include "wtf/Assertions.h"
13 #include "wtf/Deque.h" 14 #include "wtf/Deque.h"
14 #include "wtf/HashCountedSet.h" 15 #include "wtf/HashCountedSet.h"
15 #include "wtf/HashMap.h" 16 #include "wtf/HashMap.h"
16 #include "wtf/HashSet.h" 17 #include "wtf/HashSet.h"
17 #include "wtf/HashTable.h" 18 #include "wtf/HashTable.h"
18 #include "wtf/LinkedHashSet.h" 19 #include "wtf/LinkedHashSet.h"
19 #include "wtf/ListHashSet.h" 20 #include "wtf/ListHashSet.h"
20 #include "wtf/TypeTraits.h" 21 #include "wtf/TypeTraits.h"
21 #include "wtf/Vector.h" 22 #include "wtf/Vector.h"
22 23
23 namespace blink { 24 namespace blink {
24 25
25 template<typename T> class CrossThreadPersistent; 26 template<typename T> class CrossThreadPersistent;
26 template<typename T> class CrossThreadWeakPersistent; 27 template<typename T> class CrossThreadWeakPersistent;
27 template<typename T> class Member; 28 template<typename T> class Member;
28 template<typename T> class TraceTrait; 29 template<typename T> class TraceTrait;
29 template<typename T> class WeakMember; 30 template<typename T> class WeakMember;
30 template<typename T> class WeakPersistent; 31 template<typename T> class WeakPersistent;
31 32
32 template<typename T, bool = NeedsAdjustAndMark<T>::value> class AdjustAndMarkTra it; 33 template<typename T, bool = NeedsAdjustAndMark<T>::value> class AdjustAndMarkTra it;
33 34
34 template<typename T> 35 template<typename T>
35 class AdjustAndMarkTrait<T, false> { 36 class AdjustAndMarkTrait<T, false> {
37 STATIC_ONLY(AdjustAndMarkTrait);
36 public: 38 public:
37 template<typename VisitorDispatcher> 39 template<typename VisitorDispatcher>
38 static void mark(VisitorDispatcher visitor, const T* t) 40 static void mark(VisitorDispatcher visitor, const T* t)
39 { 41 {
40 #if ENABLE(ASSERT) 42 #if ENABLE(ASSERT)
41 assertObjectHasGCInfo(const_cast<T*>(t), GCInfoTrait<T>::index()); 43 assertObjectHasGCInfo(const_cast<T*>(t), GCInfoTrait<T>::index());
42 #endif 44 #endif
43 // Default mark method of the trait just calls the two-argument mark 45 // Default mark method of the trait just calls the two-argument mark
44 // method on the visitor. The second argument is the static trace method 46 // method on the visitor. The second argument is the static trace method
45 // of the trait, which by default calls the instance method 47 // of the trait, which by default calls the instance method
(...skipping 21 matching lines...) Expand all
67 } 69 }
68 return; 70 return;
69 } 71 }
70 } 72 }
71 visitor->mark(const_cast<T*>(t), &TraceTrait<T>::trace); 73 visitor->mark(const_cast<T*>(t), &TraceTrait<T>::trace);
72 } 74 }
73 }; 75 };
74 76
75 template<typename T> 77 template<typename T>
76 class AdjustAndMarkTrait<T, true> { 78 class AdjustAndMarkTrait<T, true> {
79 STATIC_ONLY(AdjustAndMarkTrait);
77 public: 80 public:
78 template<typename VisitorDispatcher> 81 template<typename VisitorDispatcher>
79 static void mark(VisitorDispatcher visitor, const T* self) 82 static void mark(VisitorDispatcher visitor, const T* self)
80 { 83 {
81 if (!self) 84 if (!self)
82 return; 85 return;
83 86
84 // If you hit this ASSERT, it means that there is a dangling pointer 87 // If you hit this ASSERT, it means that there is a dangling pointer
85 // from a live thread heap to a dead thread heap. We must eliminate 88 // from a live thread heap to a dead thread heap. We must eliminate
86 // the dangling pointer. 89 // the dangling pointer.
87 // Release builds don't have the ASSERT, but it is OK because 90 // Release builds don't have the ASSERT, but it is OK because
88 // release builds will crash at the following self->adjustAndMark 91 // release builds will crash at the following self->adjustAndMark
89 // because all the entries of the orphaned heaps are zeroed out and 92 // because all the entries of the orphaned heaps are zeroed out and
90 // thus the item does not have a valid vtable. 93 // thus the item does not have a valid vtable.
91 ASSERT(!pageFromObject(self)->orphaned()); 94 ASSERT(!pageFromObject(self)->orphaned());
92 self->adjustAndMark(visitor); 95 self->adjustAndMark(visitor);
93 } 96 }
94 }; 97 };
95 98
96 template<typename T, bool needsTracing> 99 template<typename T, bool needsTracing>
97 struct TraceIfEnabled; 100 struct TraceIfEnabled;
98 101
99 template<typename T> 102 template<typename T>
100 struct TraceIfEnabled<T, false> { 103 struct TraceIfEnabled<T, false> {
104 STATIC_ONLY(TraceIfEnabled);
101 template<typename VisitorDispatcher> 105 template<typename VisitorDispatcher>
102 static void trace(VisitorDispatcher, T&) 106 static void trace(VisitorDispatcher, T&)
103 { 107 {
104 static_assert(!WTF::NeedsTracing<T>::value, "T should not be traced"); 108 static_assert(!WTF::NeedsTracing<T>::value, "T should not be traced");
105 } 109 }
106 }; 110 };
107 111
108 template<typename T> 112 template<typename T>
109 struct TraceIfEnabled<T, true> { 113 struct TraceIfEnabled<T, true> {
114 STATIC_ONLY(TraceIfEnabled);
110 template<typename VisitorDispatcher> 115 template<typename VisitorDispatcher>
111 static void trace(VisitorDispatcher visitor, T& t) 116 static void trace(VisitorDispatcher visitor, T& t)
112 { 117 {
113 static_assert(WTF::NeedsTracing<T>::value || WTF::IsWeak<T>::value, "T s hould be traced"); 118 static_assert(WTF::NeedsTracing<T>::value || WTF::IsWeak<T>::value, "T s hould be traced");
114 visitor->trace(t); 119 visitor->trace(t);
115 } 120 }
116 }; 121 };
117 122
118 template<bool needsTracing, WTF::WeakHandlingFlag weakHandlingFlag, WTF::ShouldW eakPointersBeMarkedStrongly strongify, typename T, typename Traits> struct Trace CollectionIfEnabled; 123 template<bool needsTracing, WTF::WeakHandlingFlag weakHandlingFlag, WTF::ShouldW eakPointersBeMarkedStrongly strongify, typename T, typename Traits> struct Trace CollectionIfEnabled;
119 124
120 template<WTF::ShouldWeakPointersBeMarkedStrongly strongify, typename T, typename Traits> 125 template<WTF::ShouldWeakPointersBeMarkedStrongly strongify, typename T, typename Traits>
121 struct TraceCollectionIfEnabled<false, WTF::NoWeakHandlingInCollections, strongi fy, T, Traits> { 126 struct TraceCollectionIfEnabled<false, WTF::NoWeakHandlingInCollections, strongi fy, T, Traits> {
127 STATIC_ONLY(TraceCollectionIfEnabled);
122 template<typename VisitorDispatcher> 128 template<typename VisitorDispatcher>
123 static bool trace(VisitorDispatcher, T&) 129 static bool trace(VisitorDispatcher, T&)
124 { 130 {
125 static_assert(!WTF::NeedsTracingTrait<Traits>::value, "Traits should not be traced"); 131 static_assert(!WTF::NeedsTracingTrait<Traits>::value, "Traits should not be traced");
126 return false; 132 return false;
127 } 133 }
128 }; 134 };
129 135
130 template<bool needsTracing, WTF::WeakHandlingFlag weakHandlingFlag, WTF::ShouldW eakPointersBeMarkedStrongly strongify, typename T, typename Traits> 136 template<bool needsTracing, WTF::WeakHandlingFlag weakHandlingFlag, WTF::ShouldW eakPointersBeMarkedStrongly strongify, typename T, typename Traits>
131 struct TraceCollectionIfEnabled { 137 struct TraceCollectionIfEnabled {
138 STATIC_ONLY(TraceCollectionIfEnabled);
132 template<typename VisitorDispatcher> 139 template<typename VisitorDispatcher>
133 static bool trace(VisitorDispatcher visitor, T& t) 140 static bool trace(VisitorDispatcher visitor, T& t)
134 { 141 {
135 static_assert(WTF::NeedsTracingTrait<Traits>::value || weakHandlingFlag == WTF::WeakHandlingInCollections, "Traits should be traced"); 142 static_assert(WTF::NeedsTracingTrait<Traits>::value || weakHandlingFlag == WTF::WeakHandlingInCollections, "Traits should be traced");
136 return WTF::TraceInCollectionTrait<weakHandlingFlag, strongify, T, Trait s>::trace(visitor, t); 143 return WTF::TraceInCollectionTrait<weakHandlingFlag, strongify, T, Trait s>::trace(visitor, t);
137 } 144 }
138 }; 145 };
139 146
140 // The TraceTrait is used to specify how to mark an object pointer and 147 // The TraceTrait is used to specify how to mark an object pointer and
141 // how to trace all of the pointers in the object. 148 // how to trace all of the pointers in the object.
142 // 149 //
143 // By default, the 'trace' method implemented on an object itself is 150 // By default, the 'trace' method implemented on an object itself is
144 // used to trace the pointers to other heap objects inside the object. 151 // used to trace the pointers to other heap objects inside the object.
145 // 152 //
146 // However, the TraceTrait can be specialized to use a different 153 // However, the TraceTrait can be specialized to use a different
147 // implementation. A common case where a TraceTrait specialization is 154 // implementation. A common case where a TraceTrait specialization is
148 // needed is when multiple inheritance leads to pointers that are not 155 // needed is when multiple inheritance leads to pointers that are not
149 // to the start of the object in the Blink garbage-collected heap. In 156 // to the start of the object in the Blink garbage-collected heap. In
150 // that case the pointer has to be adjusted before marking. 157 // that case the pointer has to be adjusted before marking.
151 template<typename T> 158 template<typename T>
152 class TraceTrait { 159 class TraceTrait {
160 STATIC_ONLY(TraceTrait);
153 public: 161 public:
154 static void trace(Visitor*, void* self); 162 static void trace(Visitor*, void* self);
155 static void trace(InlinedGlobalMarkingVisitor, void* self); 163 static void trace(InlinedGlobalMarkingVisitor, void* self);
156 164
157 template<typename VisitorDispatcher> 165 template<typename VisitorDispatcher>
158 static void mark(VisitorDispatcher visitor, const T* t) 166 static void mark(VisitorDispatcher visitor, const T* t)
159 { 167 {
160 AdjustAndMarkTrait<T>::mark(visitor, t); 168 AdjustAndMarkTrait<T>::mark(visitor, t);
161 } 169 }
162 }; 170 };
(...skipping 14 matching lines...) Expand all
177 185
178 template<typename T> 186 template<typename T>
179 void TraceTrait<T>::trace(InlinedGlobalMarkingVisitor visitor, void* self) 187 void TraceTrait<T>::trace(InlinedGlobalMarkingVisitor visitor, void* self)
180 { 188 {
181 static_assert(WTF::NeedsTracing<T>::value || WTF::IsWeak<T>::value, "T shoul d be traced"); 189 static_assert(WTF::NeedsTracing<T>::value || WTF::IsWeak<T>::value, "T shoul d be traced");
182 static_cast<T*>(self)->trace(visitor); 190 static_cast<T*>(self)->trace(visitor);
183 } 191 }
184 192
185 template<typename T, typename Traits> 193 template<typename T, typename Traits>
186 struct TraceTrait<HeapVectorBacking<T, Traits>> { 194 struct TraceTrait<HeapVectorBacking<T, Traits>> {
195 STATIC_ONLY(TraceTrait);
187 using Backing = HeapVectorBacking<T, Traits>; 196 using Backing = HeapVectorBacking<T, Traits>;
188 197
189 template<typename VisitorDispatcher> 198 template<typename VisitorDispatcher>
190 static void trace(VisitorDispatcher visitor, void* self) 199 static void trace(VisitorDispatcher visitor, void* self)
191 { 200 {
192 static_assert(!WTF::IsWeak<T>::value, "weakness in HeapVectors and Deque s are not supported"); 201 static_assert(!WTF::IsWeak<T>::value, "weakness in HeapVectors and Deque s are not supported");
193 if (WTF::NeedsTracingTrait<Traits>::value) 202 if (WTF::NeedsTracingTrait<Traits>::value)
194 WTF::TraceInCollectionTrait<WTF::NoWeakHandlingInCollections, WTF::W eakPointersActWeak, HeapVectorBacking<T, Traits>, void>::trace(visitor, self); 203 WTF::TraceInCollectionTrait<WTF::NoWeakHandlingInCollections, WTF::W eakPointersActWeak, HeapVectorBacking<T, Traits>, void>::trace(visitor, self);
195 } 204 }
196 205
197 template<typename VisitorDispatcher> 206 template<typename VisitorDispatcher>
198 static void mark(VisitorDispatcher visitor, const Backing* backing) 207 static void mark(VisitorDispatcher visitor, const Backing* backing)
199 { 208 {
200 AdjustAndMarkTrait<Backing>::mark(visitor, backing); 209 AdjustAndMarkTrait<Backing>::mark(visitor, backing);
201 } 210 }
202 }; 211 };
203 212
204 // The trace trait for the heap hashtable backing is used when we find a 213 // The trace trait for the heap hashtable backing is used when we find a
205 // direct pointer to the backing from the conservative stack scanner. This 214 // direct pointer to the backing from the conservative stack scanner. This
206 // normally indicates that there is an ongoing iteration over the table, and so 215 // normally indicates that there is an ongoing iteration over the table, and so
207 // we disable weak processing of table entries. When the backing is found 216 // we disable weak processing of table entries. When the backing is found
208 // through the owning hash table we mark differently, in order to do weak 217 // through the owning hash table we mark differently, in order to do weak
209 // processing. 218 // processing.
210 template<typename Table> 219 template<typename Table>
211 struct TraceTrait<HeapHashTableBacking<Table>> { 220 struct TraceTrait<HeapHashTableBacking<Table>> {
221 STATIC_ONLY(TraceTrait);
212 using Backing = HeapHashTableBacking<Table>; 222 using Backing = HeapHashTableBacking<Table>;
213 using Traits = typename Table::ValueTraits; 223 using Traits = typename Table::ValueTraits;
214 224
215 template<typename VisitorDispatcher> 225 template<typename VisitorDispatcher>
216 static void trace(VisitorDispatcher visitor, void* self) 226 static void trace(VisitorDispatcher visitor, void* self)
217 { 227 {
218 if (WTF::NeedsTracingTrait<Traits>::value || Traits::weakHandlingFlag == WTF::WeakHandlingInCollections) 228 if (WTF::NeedsTracingTrait<Traits>::value || Traits::weakHandlingFlag == WTF::WeakHandlingInCollections)
219 WTF::TraceInCollectionTrait<WTF::NoWeakHandlingInCollections, WTF::W eakPointersActStrong, Backing, void>::trace(visitor, self); 229 WTF::TraceInCollectionTrait<WTF::NoWeakHandlingInCollections, WTF::W eakPointersActStrong, Backing, void>::trace(visitor, self);
220 } 230 }
221 231
222 template<typename VisitorDispatcher> 232 template<typename VisitorDispatcher>
223 static void mark(VisitorDispatcher visitor, const Backing* backing) 233 static void mark(VisitorDispatcher visitor, const Backing* backing)
224 { 234 {
225 AdjustAndMarkTrait<Backing>::mark(visitor, backing); 235 AdjustAndMarkTrait<Backing>::mark(visitor, backing);
226 } 236 }
227 }; 237 };
228 238
229 // This trace trait for std::pair will null weak members if their referent is 239 // This trace trait for std::pair will null weak members if their referent is
230 // collected. If you have a collection that contain weakness it does not remove 240 // collected. If you have a collection that contain weakness it does not remove
231 // entries from the collection that contain nulled weak members. 241 // entries from the collection that contain nulled weak members.
232 template<typename T, typename U> 242 template<typename T, typename U>
233 class TraceTrait<std::pair<T, U>> { 243 class TraceTrait<std::pair<T, U>> {
244 STATIC_ONLY(TraceTrait);
234 public: 245 public:
235 static const bool firstNeedsTracing = WTF::NeedsTracing<T>::value || WTF::Is Weak<T>::value; 246 static const bool firstNeedsTracing = WTF::NeedsTracing<T>::value || WTF::Is Weak<T>::value;
236 static const bool secondNeedsTracing = WTF::NeedsTracing<U>::value || WTF::I sWeak<U>::value; 247 static const bool secondNeedsTracing = WTF::NeedsTracing<U>::value || WTF::I sWeak<U>::value;
237 template<typename VisitorDispatcher> 248 template<typename VisitorDispatcher>
238 static void trace(VisitorDispatcher visitor, std::pair<T, U>* pair) 249 static void trace(VisitorDispatcher visitor, std::pair<T, U>* pair)
239 { 250 {
240 TraceIfEnabled<T, firstNeedsTracing>::trace(visitor, pair->first); 251 TraceIfEnabled<T, firstNeedsTracing>::trace(visitor, pair->first);
241 TraceIfEnabled<U, secondNeedsTracing>::trace(visitor, pair->second); 252 TraceIfEnabled<U, secondNeedsTracing>::trace(visitor, pair->second);
242 } 253 }
243 }; 254 };
(...skipping 15 matching lines...) Expand all
259 // should invoke |trace()| on not-yet-marked objects deriving from class T 270 // should invoke |trace()| on not-yet-marked objects deriving from class T
260 // right away, and not queue their trace callbacks on its marker stack, 271 // right away, and not queue their trace callbacks on its marker stack,
261 // which it will do if |value| is |false|. 272 // which it will do if |value| is |false|.
262 // 273 //
263 // The trait can be declared to enable/disable eager tracing for a class T 274 // The trait can be declared to enable/disable eager tracing for a class T
264 // and any of its subclasses, or just to the class T, but none of its 275 // and any of its subclasses, or just to the class T, but none of its
265 // subclasses. 276 // subclasses.
266 // 277 //
267 template<typename T> 278 template<typename T>
268 class TraceEagerlyTrait { 279 class TraceEagerlyTrait {
280 STATIC_ONLY(TraceEagerlyTrait);
269 public: 281 public:
270 static const bool value = true; 282 static const bool value = true;
271 }; 283 };
272 284
273 // Disable eager tracing for TYPE, but not any of its subclasses. 285 // Disable eager tracing for TYPE, but not any of its subclasses.
274 #define WILL_NOT_BE_EAGERLY_TRACED_CLASS(TYPE) \ 286 #define WILL_NOT_BE_EAGERLY_TRACED_CLASS(TYPE) \
275 template<> \ 287 template<> \
276 class TraceEagerlyTrait<TYPE> { \ 288 class TraceEagerlyTrait<TYPE> { \
289 STATIC_ONLY(TraceEagerlyTrait); \
277 public: \ 290 public: \
278 static const bool value = false; \ 291 static const bool value = false; \
279 } 292 }
280 293
281 template<typename T> 294 template<typename T>
282 class TraceEagerlyTrait<Member<T>> { 295 class TraceEagerlyTrait<Member<T>> {
296 STATIC_ONLY(TraceEagerlyTrait);
283 public: 297 public:
284 static const bool value = TraceEagerlyTrait<T>::value; 298 static const bool value = TraceEagerlyTrait<T>::value;
285 }; 299 };
286 300
287 template<typename T> 301 template<typename T>
288 class TraceEagerlyTrait<WeakMember<T>> { 302 class TraceEagerlyTrait<WeakMember<T>> {
303 STATIC_ONLY(TraceEagerlyTrait);
289 public: 304 public:
290 static const bool value = TraceEagerlyTrait<T>::value; 305 static const bool value = TraceEagerlyTrait<T>::value;
291 }; 306 };
292 307
293 template<typename T> 308 template<typename T>
294 class TraceEagerlyTrait<Persistent<T>> { 309 class TraceEagerlyTrait<Persistent<T>> {
310 STATIC_ONLY(TraceEagerlyTrait);
295 public: 311 public:
296 static const bool value = TraceEagerlyTrait<T>::value; 312 static const bool value = TraceEagerlyTrait<T>::value;
297 }; 313 };
298 314
299 template<typename T> 315 template<typename T>
300 class TraceEagerlyTrait<WeakPersistent<T>> { 316 class TraceEagerlyTrait<WeakPersistent<T>> {
317 STATIC_ONLY(TraceEagerlyTrait);
301 public: 318 public:
302 static const bool value = TraceEagerlyTrait<T>::value; 319 static const bool value = TraceEagerlyTrait<T>::value;
303 }; 320 };
304 321
305 template<typename T> 322 template<typename T>
306 class TraceEagerlyTrait<CrossThreadPersistent<T>> { 323 class TraceEagerlyTrait<CrossThreadPersistent<T>> {
324 STATIC_ONLY(TraceEagerlyTrait);
307 public: 325 public:
308 static const bool value = TraceEagerlyTrait<T>::value; 326 static const bool value = TraceEagerlyTrait<T>::value;
309 }; 327 };
310 328
311 template<typename T> 329 template<typename T>
312 class TraceEagerlyTrait<CrossThreadWeakPersistent<T>> { 330 class TraceEagerlyTrait<CrossThreadWeakPersistent<T>> {
331 STATIC_ONLY(TraceEagerlyTrait);
313 public: 332 public:
314 static const bool value = TraceEagerlyTrait<T>::value; 333 static const bool value = TraceEagerlyTrait<T>::value;
315 }; 334 };
316 335
317 template<typename ValueArg, size_t inlineCapacity> class HeapListHashSetAllocato r; 336 template<typename ValueArg, size_t inlineCapacity> class HeapListHashSetAllocato r;
318 template<typename T, size_t inlineCapacity> 337 template<typename T, size_t inlineCapacity>
319 class TraceEagerlyTrait<WTF::ListHashSetNode<T, HeapListHashSetAllocator<T, inli neCapacity>>> { 338 class TraceEagerlyTrait<WTF::ListHashSetNode<T, HeapListHashSetAllocator<T, inli neCapacity>>> {
339 STATIC_ONLY(TraceEagerlyTrait);
320 public: 340 public:
321 static const bool value = false; 341 static const bool value = false;
322 }; 342 };
323 343
324 template <typename T> struct RemoveHeapPointerWrapperTypes { 344 template <typename T> struct RemoveHeapPointerWrapperTypes {
345 STATIC_ONLY(RemoveHeapPointerWrapperTypes);
325 using Type = typename WTF::RemoveTemplate<typename WTF::RemoveTemplate<typen ame WTF::RemoveTemplate<T, Member>::Type, WeakMember>::Type, RawPtr>::Type; 346 using Type = typename WTF::RemoveTemplate<typename WTF::RemoveTemplate<typen ame WTF::RemoveTemplate<T, Member>::Type, WeakMember>::Type, RawPtr>::Type;
326 }; 347 };
327 348
328 // FIXME: Oilpan: TraceIfNeeded should be implemented ala: 349 // FIXME: Oilpan: TraceIfNeeded should be implemented ala:
329 // NeedsTracing<T>::value || IsWeakMember<T>::value. It should not need to test 350 // NeedsTracing<T>::value || IsWeakMember<T>::value. It should not need to test
330 // raw pointer types. To remove these tests, we may need support for 351 // raw pointer types. To remove these tests, we may need support for
331 // instantiating a template with a RawPtrOrMember'ish template. 352 // instantiating a template with a RawPtrOrMember'ish template.
332 template<typename T> 353 template<typename T>
333 struct TraceIfNeeded : public TraceIfEnabled<T, WTF::NeedsTracing<T>::value || I sGarbageCollectedType<typename RemoveHeapPointerWrapperTypes<typename std::remov e_pointer<T>::type>::Type>::value> { }; 354 struct TraceIfNeeded : public TraceIfEnabled<T, WTF::NeedsTracing<T>::value || I sGarbageCollectedType<typename RemoveHeapPointerWrapperTypes<typename std::remov e_pointer<T>::type>::Type>::value> {
355 STATIC_ONLY(TraceIfNeeded);
356 };
334 357
335 } // namespace blink 358 } // namespace blink
336 359
337 namespace WTF { 360 namespace WTF {
338 361
339 // Catch-all for types that have a way to trace that don't have special 362 // Catch-all for types that have a way to trace that don't have special
340 // handling for weakness in collections. This means that if this type 363 // handling for weakness in collections. This means that if this type
341 // contains WeakMember fields, they will simply be zeroed, but the entry 364 // contains WeakMember fields, they will simply be zeroed, but the entry
342 // will not be removed from the collection. This always happens for 365 // will not be removed from the collection. This always happens for
343 // things in vectors, which don't currently support special handling of 366 // things in vectors, which don't currently support special handling of
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after
567 // since iterating over the hash table backing will find the whole 590 // since iterating over the hash table backing will find the whole
568 // chain. 591 // chain.
569 visitor->markNoTracing(node); 592 visitor->markNoTracing(node);
570 return false; 593 return false;
571 } 594 }
572 }; 595 };
573 596
574 } // namespace WTF 597 } // namespace WTF
575 598
576 #endif 599 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698