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

Side by Side Diff: Source/platform/heap/Visitor.h

Issue 319593004: Oilpan:Allow custom handling of classes that contain weak pointers that are embedded in collections. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 6 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 | Annotate | Revision Log
OLDNEW
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 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
229 } 229 }
230 230
231 // Member version of the one-argument templated trace method. 231 // Member version of the one-argument templated trace method.
232 template<typename T> 232 template<typename T>
233 void trace(const Member<T>& t) 233 void trace(const Member<T>& t)
234 { 234 {
235 t.verifyTypeIsGarbageCollected(); 235 t.verifyTypeIsGarbageCollected();
236 mark(t.get()); 236 mark(t.get());
237 } 237 }
238 238
239 template<typename T>
240 void trace(Member<T>& t)
haraken 2014/06/06 08:03:02 Just help me understand: Why do we have both const
Erik Corry 2014/06/06 08:47:35 We have to have a const and non-const version for
241 {
242 t.verifyTypeIsGarbageCollected();
243 mark(t.get());
244 }
245
239 // Fallback method used only when we need to trace raw pointers of T. 246 // Fallback method used only when we need to trace raw pointers of T.
240 // This is the case when a member is a union where we do not support members . 247 // This is the case when a member is a union where we do not support members .
241 template<typename T> 248 template<typename T>
249 void trace(const T* t)
250 {
251 mark(const_cast<T*>(t));
252 }
253
254 template<typename T>
242 void trace(T* t) 255 void trace(T* t)
243 { 256 {
244 mark(t); 257 mark(t);
245 } 258 }
246 259
247 // WeakMember version of the templated trace method. It doesn't keep 260 // WeakMember version of the templated trace method. It doesn't keep
248 // the traced thing alive, but will write null to the WeakMember later 261 // the traced thing alive, but will write null to the WeakMember later
249 // if the pointed-to object is dead. 262 // if the pointed-to object is dead. It's lying for this to be const,
263 // but the overloading resolver prioritizes constness too high when
264 // picking the correct overload, so all these trace methods have to have
265 // the same constness on their argument to allow the type to decide.
haraken 2014/06/06 08:03:02 I agree that we need a const version of trace(cons
Erik Corry 2014/06/06 08:47:35 If you have only const methods to choose between t
250 template<typename T> 266 template<typename T>
251 void trace(const WeakMember<T>& t) 267 void trace(const WeakMember<T>& t)
252 { 268 {
253 registerWeakCell(t.cell()); 269 registerWeakCell(const_cast<WeakMember<T>&>(t).cell());
254 } 270 }
255 271
256 // Fallback trace method for part objects to allow individual 272 template<typename T>
257 // trace methods to trace through a part object with 273 void traceInCollection(T& t, ShouldWeakPointersBeMarkedStrongly strongify)
258 // visitor->trace(m_partObject). 274 {
275 HashTraits<T>::traceInCollection(this, t, strongify);
276 }
277
278 // Fallback trace method for part objects to allow individual trace methods
279 // to trace through a part object with visitor->trace(m_partObject). This
280 // takes a const argument, because otherwise it will match too eagerly: a
281 // non-const argument would match a non-const Vector<T>& argument better
282 // than the specialization that takes const Vector<T>&. For a similar reason ,
283 // the other specializations take a const argument even though they are
284 // usually used with non-const arguments, otherwise this function would matc h
285 // too well.
259 template<typename T> 286 template<typename T>
260 void trace(const T& t) 287 void trace(const T& t)
261 { 288 {
262 const_cast<T&>(t).trace(this); 289 const_cast<T&>(t).trace(this);
263 } 290 }
264 291
265 // The following trace methods are for off-heap collections. 292 // The following trace methods are for off-heap collections.
266 template<typename T, size_t inlineCapacity> 293 template<typename T, size_t inlineCapacity>
267 void trace(const Vector<T, inlineCapacity, WTF::DefaultAllocator>& vector) 294 void trace(const Vector<T, inlineCapacity>& vector)
268 { 295 {
269 OffHeapCollectionTraceTrait<Vector<T, inlineCapacity, WTF::DefaultAlloca tor> >::trace(this, vector); 296 OffHeapCollectionTraceTrait<Vector<T, inlineCapacity, WTF::DefaultAlloca tor> >::trace(this, vector);
270 } 297 }
271 298
272 template<typename T, typename U, typename V> 299 template<typename T, typename U, typename V>
273 void trace(const HashSet<T, U, V, WTF::DefaultAllocator>& hashSet) 300 void trace(const HashSet<T, U, V>& hashSet)
274 { 301 {
275 OffHeapCollectionTraceTrait<HashSet<T, U, V, WTF::DefaultAllocator> >::t race(this, hashSet); 302 OffHeapCollectionTraceTrait<HashSet<T, U, V> >::trace(this, hashSet);
276 } 303 }
277 304
278 template<typename T, size_t inlineCapacity, typename U> 305 template<typename T, size_t inlineCapacity, typename U>
279 void trace(const ListHashSet<T, inlineCapacity, U>& hashSet) 306 void trace(const ListHashSet<T, inlineCapacity, U>& hashSet)
280 { 307 {
281 OffHeapCollectionTraceTrait<ListHashSet<T, inlineCapacity, U> >::trace(t his, hashSet); 308 OffHeapCollectionTraceTrait<ListHashSet<T, inlineCapacity, U> >::trace(t his, hashSet);
282 } 309 }
283 310
284 template<typename T, typename U> 311 template<typename T, typename U>
285 void trace(const LinkedHashSet<T, U>& hashSet) 312 void trace(const LinkedHashSet<T, U>& hashSet)
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
341 // Remove this once we remove WeakPtrWillBeMember. 368 // Remove this once we remove WeakPtrWillBeMember.
342 template<typename T> 369 template<typename T>
343 void trace(const WeakPtr<T>&) 370 void trace(const WeakPtr<T>&)
344 { 371 {
345 #if ENABLE(OILPAN) 372 #if ENABLE(OILPAN)
346 // WeakPtrs should never be traced. 373 // WeakPtrs should never be traced.
347 ASSERT_NOT_REACHED(); 374 ASSERT_NOT_REACHED();
348 #endif 375 #endif
349 } 376 }
350 377
378 template<typename T>
379 void trace(WeakPtr<T>&)
380 {
381 #if ENABLE(OILPAN)
382 // WeakPtrs should never be traced.
383 ASSERT_NOT_REACHED();
384 #endif
385 }
386
351 // This method marks an object and adds it to the set of objects 387 // This method marks an object and adds it to the set of objects
352 // that should have their trace method called. Since not all 388 // that should have their trace method called. Since not all
353 // objects have vtables we have to have the callback as an 389 // objects have vtables we have to have the callback as an
354 // explicit argument, but we can use the templated one-argument 390 // explicit argument, but we can use the templated one-argument
355 // mark method above to automatically provide the callback 391 // mark method above to automatically provide the callback
356 // function. 392 // function.
357 virtual void mark(const void*, TraceCallback) = 0; 393 virtual void mark(const void*, TraceCallback) = 0;
358 virtual void markNoTracing(const void* pointer) { mark(pointer, reinterpret_ cast<TraceCallback>(0)); } 394 virtual void markNoTracing(const void* pointer) { mark(pointer, reinterpret_ cast<TraceCallback>(0)); }
359 395
360 // Used to mark objects during conservative scanning. 396 // Used to mark objects during conservative scanning.
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
461 template<typename T, typename HashFunctions, typename Traits> 497 template<typename T, typename HashFunctions, typename Traits>
462 struct OffHeapCollectionTraceTrait<WTF::HashSet<T, HashFunctions, Traits, WTF::D efaultAllocator> > { 498 struct OffHeapCollectionTraceTrait<WTF::HashSet<T, HashFunctions, Traits, WTF::D efaultAllocator> > {
463 typedef WTF::HashSet<T, HashFunctions, Traits, WTF::DefaultAllocator> HashSe t; 499 typedef WTF::HashSet<T, HashFunctions, Traits, WTF::DefaultAllocator> HashSe t;
464 500
465 static void trace(Visitor* visitor, const HashSet& set) 501 static void trace(Visitor* visitor, const HashSet& set)
466 { 502 {
467 if (set.isEmpty()) 503 if (set.isEmpty())
468 return; 504 return;
469 if (WTF::ShouldBeTraced<Traits>::value) { 505 if (WTF::ShouldBeTraced<Traits>::value) {
470 HashSet& iterSet = const_cast<HashSet&>(set); 506 HashSet& iterSet = const_cast<HashSet&>(set);
471 for (typename HashSet::iterator it = iterSet.begin(), end = iterSet. end(); it != end; ++it) 507 for (typename HashSet::iterator it = iterSet.begin(), end = iterSet. end(); it != end; ++it) {
472 CollectionBackingTraceTrait<WTF::ShouldBeTraced<Traits>::value, Traits::isWeak, WeakPointersActWeak, T, Traits>::trace(visitor, *it); 508 const T& t = *it;
509 CollectionBackingTraceTrait<WTF::ShouldBeTraced<Traits>::value, Traits::isWeak, WeakPointersActWeak, T, Traits>::trace(visitor, const_cast<T&>(t ));
510 }
473 } 511 }
474 COMPILE_ASSERT(!Traits::isWeak, WeakOffHeapCollectionsConsideredDangerou s0); 512 COMPILE_ASSERT(!Traits::isWeak, WeakOffHeapCollectionsConsideredDangerou s0);
475 } 513 }
476 }; 514 };
477 515
478 template<typename T, size_t inlineCapacity, typename HashFunctions> 516 template<typename T, size_t inlineCapacity, typename HashFunctions>
479 struct OffHeapCollectionTraceTrait<ListHashSet<T, inlineCapacity, HashFunctions> > { 517 struct OffHeapCollectionTraceTrait<ListHashSet<T, inlineCapacity, HashFunctions> > {
480 typedef WTF::ListHashSet<T, inlineCapacity, HashFunctions> ListHashSet; 518 typedef WTF::ListHashSet<T, inlineCapacity, HashFunctions> ListHashSet;
481 519
482 static void trace(Visitor* visitor, const ListHashSet& set) 520 static void trace(Visitor* visitor, const ListHashSet& set)
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after
724 struct GCInfoTrait { 762 struct GCInfoTrait {
725 static const GCInfo* get() 763 static const GCInfo* get()
726 { 764 {
727 return GCInfoAtBase<typename GetGarbageCollectedBase<T>::type>::get(); 765 return GCInfoAtBase<typename GetGarbageCollectedBase<T>::type>::get();
728 } 766 }
729 }; 767 };
730 768
731 } 769 }
732 770
733 #endif 771 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698