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 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
58 template<typename T> class GarbageCollected; | 58 template<typename T> class GarbageCollected; |
59 template<typename T> class GarbageCollectedFinalized; | 59 template<typename T> class GarbageCollectedFinalized; |
60 class GarbageCollectedMixin; | 60 class GarbageCollectedMixin; |
61 class GeneralHeapObjectHeader; | 61 class GeneralHeapObjectHeader; |
62 class HeapObjectHeader; | 62 class HeapObjectHeader; |
63 template<typename T> class Member; | 63 template<typename T> class Member; |
64 template<typename T> class WeakMember; | 64 template<typename T> class WeakMember; |
65 class Visitor; | 65 class Visitor; |
66 | 66 |
67 template <typename T> struct IsGarbageCollectedType; | 67 template <typename T> struct IsGarbageCollectedType; |
68 #define COMPILE_ASSERT_IS_GARBAGE_COLLECTED(T, ErrorMessage) \ | 68 #define STATIC_ASSERT_IS_GARBAGE_COLLECTED(T, ErrorMessage) \ |
69 COMPILE_ASSERT(IsGarbageCollectedType<T>::value, ErrorMessage) | 69 static_assert(IsGarbageCollectedType<T>::value, ErrorMessage) |
70 #define COMPILE_ASSERT_IS_NOT_GARBAGE_COLLECTED(T, ErrorMessage) \ | 70 #define STATIC_ASSERT_IS_NOT_GARBAGE_COLLECTED(T, ErrorMessage) \ |
71 COMPILE_ASSERT(!IsGarbageCollectedType<T>::value, ErrorMessage) | 71 static_assert(!IsGarbageCollectedType<T>::value, ErrorMessage) |
72 | 72 |
73 template<bool needsTracing, WTF::WeakHandlingFlag weakHandlingFlag, WTF::ShouldW
eakPointersBeMarkedStrongly strongify, typename T, typename Traits> struct Colle
ctionBackingTraceTrait; | 73 template<bool needsTracing, WTF::WeakHandlingFlag weakHandlingFlag, WTF::ShouldW
eakPointersBeMarkedStrongly strongify, typename T, typename Traits> struct Colle
ctionBackingTraceTrait; |
74 | 74 |
75 // The TraceMethodDelegate is used to convert a trace method for type T to a Tra
ceCallback. | 75 // The TraceMethodDelegate is used to convert a trace method for type T to a Tra
ceCallback. |
76 // This allows us to pass a type's trace method as a parameter to the Persistent
Node | 76 // This allows us to pass a type's trace method as a parameter to the Persistent
Node |
77 // constructor. The PersistentNode constructor needs the specific trace method d
ue an issue | 77 // constructor. The PersistentNode constructor needs the specific trace method d
ue an issue |
78 // with the Windows compiler which instantiates even unused variables. This caus
es problems | 78 // with the Windows compiler which instantiates even unused variables. This caus
es problems |
79 // in header files where we have only forward declarations of classes. | 79 // in header files where we have only forward declarations of classes. |
80 template<typename T, void (T::*method)(Visitor*)> | 80 template<typename T, void (T::*method)(Visitor*)> |
81 struct TraceMethodDelegate { | 81 struct TraceMethodDelegate { |
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
277 template<typename T> | 277 template<typename T> |
278 void mark(T* t) | 278 void mark(T* t) |
279 { | 279 { |
280 if (!t) | 280 if (!t) |
281 return; | 281 return; |
282 #if ENABLE(ASSERT) | 282 #if ENABLE(ASSERT) |
283 TraceTrait<T>::checkGCInfo(t); | 283 TraceTrait<T>::checkGCInfo(t); |
284 #endif | 284 #endif |
285 TraceTrait<T>::mark(toDerived(), t); | 285 TraceTrait<T>::mark(toDerived(), t); |
286 | 286 |
287 COMPILE_ASSERT_IS_GARBAGE_COLLECTED(T, AttemptedToMarkNonGarbageCollecte
dObject); | 287 STATIC_ASSERT_IS_GARBAGE_COLLECTED(T, "attempted to mark non garbage col
lected object"); |
288 } | 288 } |
289 | 289 |
290 // Member version of the one-argument templated trace method. | 290 // Member version of the one-argument templated trace method. |
291 template<typename T> | 291 template<typename T> |
292 void trace(const Member<T>& t) | 292 void trace(const Member<T>& t) |
293 { | 293 { |
294 toDerived()->mark(t.get()); | 294 toDerived()->mark(t.get()); |
295 } | 295 } |
296 | 296 |
297 // Fallback method used only when we need to trace raw pointers of T. | 297 // Fallback method used only when we need to trace raw pointers of T. |
(...skipping 13 matching lines...) Expand all Loading... |
311 // WeakMember version of the templated trace method. It doesn't keep | 311 // WeakMember version of the templated trace method. It doesn't keep |
312 // the traced thing alive, but will write null to the WeakMember later | 312 // the traced thing alive, but will write null to the WeakMember later |
313 // if the pointed-to object is dead. It's lying for this to be const, | 313 // if the pointed-to object is dead. It's lying for this to be const, |
314 // but the overloading resolver prioritizes constness too high when | 314 // but the overloading resolver prioritizes constness too high when |
315 // picking the correct overload, so all these trace methods have to have | 315 // picking the correct overload, so all these trace methods have to have |
316 // the same constness on their argument to allow the type to decide. | 316 // the same constness on their argument to allow the type to decide. |
317 template<typename T> | 317 template<typename T> |
318 void trace(const WeakMember<T>& t) | 318 void trace(const WeakMember<T>& t) |
319 { | 319 { |
320 // Check that we actually know the definition of T when tracing. | 320 // Check that we actually know the definition of T when tracing. |
321 COMPILE_ASSERT(sizeof(T), WeNeedToKnowTheDefinitionOfTheTypeWeAreTracing
); | 321 static_assert(sizeof(T), "we need to know the definition of the type we
are tracing"); |
322 registerWeakCell(const_cast<WeakMember<T>&>(t).cell()); | 322 registerWeakCell(const_cast<WeakMember<T>&>(t).cell()); |
323 COMPILE_ASSERT_IS_GARBAGE_COLLECTED(T, AttemptedToWeakTraceNonGarbageCol
lectedObject); | 323 STATIC_ASSERT_IS_GARBAGE_COLLECTED(T, "cannot weak trace non garbage col
lected object"); |
324 } | 324 } |
325 | 325 |
326 template<typename T> | 326 template<typename T> |
327 void traceInCollection(T& t, WTF::ShouldWeakPointersBeMarkedStrongly strongi
fy) | 327 void traceInCollection(T& t, WTF::ShouldWeakPointersBeMarkedStrongly strongi
fy) |
328 { | 328 { |
329 HashTraits<T>::traceInCollection(toDerived(), t, strongify); | 329 HashTraits<T>::traceInCollection(toDerived(), t, strongify); |
330 } | 330 } |
331 | 331 |
332 // Fallback trace method for part objects to allow individual trace methods | 332 // Fallback trace method for part objects to allow individual trace methods |
333 // to trace through a part object with visitor->trace(m_partObject). This | 333 // to trace through a part object with visitor->trace(m_partObject). This |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
387 template<typename T> void trace(const RawPtr<T>&) { } | 387 template<typename T> void trace(const RawPtr<T>&) { } |
388 template<typename T> void trace(const WeakPtr<T>&) { } | 388 template<typename T> void trace(const WeakPtr<T>&) { } |
389 | 389 |
390 // On non-oilpan builds, it is convenient to allow calling trace on | 390 // On non-oilpan builds, it is convenient to allow calling trace on |
391 // WillBeHeap{Vector,Deque}<FooPtrWillBeMember<T>>. | 391 // WillBeHeap{Vector,Deque}<FooPtrWillBeMember<T>>. |
392 // Forbid tracing on-heap objects in off-heap collections. | 392 // Forbid tracing on-heap objects in off-heap collections. |
393 // This is forbidden because convservative marking cannot identify | 393 // This is forbidden because convservative marking cannot identify |
394 // those off-heap collection backing stores. | 394 // those off-heap collection backing stores. |
395 template<typename T, size_t inlineCapacity> void trace(const Vector<OwnPtr<T
>, inlineCapacity>& vector) | 395 template<typename T, size_t inlineCapacity> void trace(const Vector<OwnPtr<T
>, inlineCapacity>& vector) |
396 { | 396 { |
397 COMPILE_ASSERT_IS_NOT_GARBAGE_COLLECTED(T, AttemptedToTraceGarbageCollec
tedObjectInsideVector); | 397 STATIC_ASSERT_IS_NOT_GARBAGE_COLLECTED(T, "cannot trace garbage collecte
d object inside Vector"); |
398 } | 398 } |
399 template<typename T, size_t inlineCapacity> void trace(const Vector<RefPtr<T
>, inlineCapacity>& vector) | 399 template<typename T, size_t inlineCapacity> void trace(const Vector<RefPtr<T
>, inlineCapacity>& vector) |
400 { | 400 { |
401 COMPILE_ASSERT_IS_NOT_GARBAGE_COLLECTED(T, AttemptedToTraceGarbageCollec
tedObjectInsideVector); | 401 STATIC_ASSERT_IS_NOT_GARBAGE_COLLECTED(T, "cannot trace garbage collecte
d object inside Vector"); |
402 } | 402 } |
403 template<typename T, size_t inlineCapacity> void trace(const Vector<RawPtr<T
>, inlineCapacity>& vector) | 403 template<typename T, size_t inlineCapacity> void trace(const Vector<RawPtr<T
>, inlineCapacity>& vector) |
404 { | 404 { |
405 COMPILE_ASSERT_IS_NOT_GARBAGE_COLLECTED(T, AttemptedToTraceGarbageCollec
tedObjectInsideVector); | 405 STATIC_ASSERT_IS_NOT_GARBAGE_COLLECTED(T, "cannot trace garbage collecte
d object inside Vector"); |
406 } | 406 } |
407 template<typename T, size_t inlineCapacity> void trace(const Vector<WeakPtr<
T>, inlineCapacity>& vector) | 407 template<typename T, size_t inlineCapacity> void trace(const Vector<WeakPtr<
T>, inlineCapacity>& vector) |
408 { | 408 { |
409 COMPILE_ASSERT_IS_NOT_GARBAGE_COLLECTED(T, AttemptedToTraceGarbageCollec
tedObjectInsideVector); | 409 STATIC_ASSERT_IS_NOT_GARBAGE_COLLECTED(T, "cannot trace garbage collecte
d object inside Vector"); |
410 } | 410 } |
411 template<typename T, size_t N> void trace(const Deque<OwnPtr<T>, N>& deque) | 411 template<typename T, size_t N> void trace(const Deque<OwnPtr<T>, N>& deque) |
412 { | 412 { |
413 COMPILE_ASSERT_IS_NOT_GARBAGE_COLLECTED(T, AttemptedToTraceGarbageCollec
tedObjectInsideDeque); | 413 STATIC_ASSERT_IS_NOT_GARBAGE_COLLECTED(T, "cannot trace garbage collecte
d object inside Deque"); |
414 } | 414 } |
415 template<typename T, size_t N> void trace(const Deque<RefPtr<T>, N>& deque) | 415 template<typename T, size_t N> void trace(const Deque<RefPtr<T>, N>& deque) |
416 { | 416 { |
417 COMPILE_ASSERT_IS_NOT_GARBAGE_COLLECTED(T, AttemptedToTraceGarbageCollec
tedObjectInsideDeque); | 417 STATIC_ASSERT_IS_NOT_GARBAGE_COLLECTED(T, "cannot trace garbage collecte
d object inside Deque"); |
418 } | 418 } |
419 template<typename T, size_t N> void trace(const Deque<RawPtr<T>, N>& deque) | 419 template<typename T, size_t N> void trace(const Deque<RawPtr<T>, N>& deque) |
420 { | 420 { |
421 COMPILE_ASSERT_IS_NOT_GARBAGE_COLLECTED(T, AttemptedToTraceGarbageCollec
tedObjectInsideDeque); | 421 STATIC_ASSERT_IS_NOT_GARBAGE_COLLECTED(T, "cannot trace garbage collecte
d object inside Deque"); |
422 } | 422 } |
423 template<typename T, size_t N> void trace(const Deque<WeakPtr<T>, N>& deque) | 423 template<typename T, size_t N> void trace(const Deque<WeakPtr<T>, N>& deque) |
424 { | 424 { |
425 COMPILE_ASSERT_IS_NOT_GARBAGE_COLLECTED(T, AttemptedToTraceGarbageCollec
tedObjectInsideDeque); | 425 STATIC_ASSERT_IS_NOT_GARBAGE_COLLECTED(T, "cannot trace garbage collecte
d object inside Deque"); |
426 } | 426 } |
427 #endif | 427 #endif |
428 | 428 |
429 void markNoTracing(const void* pointer) { toDerived()->mark(pointer, reinter
pret_cast<TraceCallback>(0)); } | 429 void markNoTracing(const void* pointer) { toDerived()->mark(pointer, reinter
pret_cast<TraceCallback>(0)); } |
430 void markHeaderNoTracing(HeapObjectHeader* header) { toDerived()->markHeader
(header, reinterpret_cast<TraceCallback>(0)); } | 430 void markHeaderNoTracing(HeapObjectHeader* header) { toDerived()->markHeader
(header, reinterpret_cast<TraceCallback>(0)); } |
431 void markHeaderNoTracing(GeneralHeapObjectHeader* header) { toDerived()->mar
kHeader(header, reinterpret_cast<TraceCallback>(0)); } | 431 void markHeaderNoTracing(GeneralHeapObjectHeader* header) { toDerived()->mar
kHeader(header, reinterpret_cast<TraceCallback>(0)); } |
432 template<typename T> void markNoTracing(const T* pointer) { toDerived()->mar
k(pointer, reinterpret_cast<TraceCallback>(0)); } | 432 template<typename T> void markNoTracing(const T* pointer) { toDerived()->mar
k(pointer, reinterpret_cast<TraceCallback>(0)); } |
433 | 433 |
434 template<typename T> inline bool isAlive(T* obj) | 434 template<typename T> inline bool isAlive(T* obj) |
435 { | 435 { |
436 // Check that we actually know the definition of T when tracing. | 436 // Check that we actually know the definition of T when tracing. |
437 COMPILE_ASSERT(sizeof(T), WeNeedToKnowTheDefinitionOfTheTypeWeAreTracing
); | 437 static_assert(sizeof(T), "T must be fully defined"); |
438 // The strongification of collections relies on the fact that once a | 438 // The strongification of collections relies on the fact that once a |
439 // collection has been strongified, there is no way that it can contain | 439 // collection has been strongified, there is no way that it can contain |
440 // non-live entries, so no entries will be removed. Since you can't set | 440 // non-live entries, so no entries will be removed. Since you can't set |
441 // the mark bit on a null pointer, that means that null pointers are | 441 // the mark bit on a null pointer, that means that null pointers are |
442 // always 'alive'. | 442 // always 'alive'. |
443 if (!obj) | 443 if (!obj) |
444 return true; | 444 return true; |
445 return ObjectAliveTrait<T>::isHeapObjectAlive(toDerived(), obj); | 445 return ObjectAliveTrait<T>::isHeapObjectAlive(toDerived(), obj); |
446 } | 446 } |
447 template<typename T> inline bool isAlive(const Member<T>& member) | 447 template<typename T> inline bool isAlive(const Member<T>& member) |
(...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
751 virtual void adjustAndMark(Visitor*) const = 0; | 751 virtual void adjustAndMark(Visitor*) const = 0; |
752 virtual bool isHeapObjectAlive(Visitor*) const = 0; | 752 virtual bool isHeapObjectAlive(Visitor*) const = 0; |
753 virtual void trace(Visitor*) { } | 753 virtual void trace(Visitor*) { } |
754 }; | 754 }; |
755 | 755 |
756 #define USING_GARBAGE_COLLECTED_MIXIN(TYPE) \ | 756 #define USING_GARBAGE_COLLECTED_MIXIN(TYPE) \ |
757 public: \ | 757 public: \ |
758 virtual void adjustAndMark(blink::Visitor* visitor) const override \ | 758 virtual void adjustAndMark(blink::Visitor* visitor) const override \ |
759 { \ | 759 { \ |
760 typedef WTF::IsSubclassOfTemplate<typename WTF::RemoveConst<TYPE>::Type,
blink::GarbageCollected> IsSubclassOfGarbageCollected; \ | 760 typedef WTF::IsSubclassOfTemplate<typename WTF::RemoveConst<TYPE>::Type,
blink::GarbageCollected> IsSubclassOfGarbageCollected; \ |
761 COMPILE_ASSERT(IsSubclassOfGarbageCollected::value, OnlyGarbageCollected
ObjectsCanHaveGarbageCollectedMixins); \ | 761 static_assert(IsSubclassOfGarbageCollected::value, "only garbage collect
ed objects can have garbage collected mixins"); \ |
762 if (TraceEagerlyTrait<TYPE>::value) {
\ | 762 if (TraceEagerlyTrait<TYPE>::value) {
\ |
763 if (visitor->ensureMarked(static_cast<const TYPE*>(this)))
\ | 763 if (visitor->ensureMarked(static_cast<const TYPE*>(this)))
\ |
764 TraceTrait<TYPE>::trace(visitor, const_cast<TYPE*>(this));
\ | 764 TraceTrait<TYPE>::trace(visitor, const_cast<TYPE*>(this));
\ |
765 return;
\ | 765 return;
\ |
766 }
\ | 766 }
\ |
767 visitor->mark(static_cast<const TYPE*>(this), &blink::TraceTrait<TYPE>::
trace); \ | 767 visitor->mark(static_cast<const TYPE*>(this), &blink::TraceTrait<TYPE>::
trace); \ |
768 } \ | 768 } \ |
769 virtual bool isHeapObjectAlive(blink::Visitor* visitor) const override
\ | 769 virtual bool isHeapObjectAlive(blink::Visitor* visitor) const override
\ |
770 { \ | 770 { \ |
771 return visitor->isAlive(this); \ | 771 return visitor->isAlive(this); \ |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
822 struct GCInfoTrait { | 822 struct GCInfoTrait { |
823 static const GCInfo* get() | 823 static const GCInfo* get() |
824 { | 824 { |
825 return GCInfoAtBase<typename GetGarbageCollectedBase<T>::type>::get(); | 825 return GCInfoAtBase<typename GetGarbageCollectedBase<T>::type>::get(); |
826 } | 826 } |
827 }; | 827 }; |
828 | 828 |
829 } | 829 } |
830 | 830 |
831 #endif | 831 #endif |
OLD | NEW |