| 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 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 123 | 123 |
| 124 // The FinalizerTrait is used to determine if a type requires | 124 // The FinalizerTrait is used to determine if a type requires |
| 125 // finalization and what finalization means. | 125 // finalization and what finalization means. |
| 126 // | 126 // |
| 127 // By default classes that inherit from GarbageCollectedFinalized need | 127 // By default classes that inherit from GarbageCollectedFinalized need |
| 128 // finalization and finalization means calling the 'finalize' method | 128 // finalization and finalization means calling the 'finalize' method |
| 129 // of the object. The FinalizerTrait can be specialized if the default | 129 // of the object. The FinalizerTrait can be specialized if the default |
| 130 // behavior is not desired. | 130 // behavior is not desired. |
| 131 template<typename T> | 131 template<typename T> |
| 132 struct FinalizerTrait { | 132 struct FinalizerTrait { |
| 133 static const bool nonTrivialFinalizer = WTF::IsSubclassOfTemplate<T, Garbage
CollectedFinalized>::value; | 133 static const bool nonTrivialFinalizer = WTF::IsSubclassOfTemplate<typename W
TF::RemoveConst<T>::Type, GarbageCollectedFinalized>::value; |
| 134 static void finalize(void* obj) { FinalizerTraitImpl<T, nonTrivialFinalizer>
::finalize(obj); } | 134 static void finalize(void* obj) { FinalizerTraitImpl<T, nonTrivialFinalizer>
::finalize(obj); } |
| 135 }; | 135 }; |
| 136 | 136 |
| 137 // The VTableTrait is used to determine if a type has at least one virtual metho
d. | 137 // The VTableTrait is used to determine if a type has at least one virtual metho
d. |
| 138 template<typename T> | 138 template<typename T> |
| 139 struct VTableTrait { | 139 struct VTableTrait { |
| 140 static const bool hasVTable = __is_polymorphic(T); | 140 static const bool hasVTable = __is_polymorphic(T); |
| 141 }; | 141 }; |
| 142 | 142 |
| 143 // Trait to get the GCInfo structure for types that have their | 143 // Trait to get the GCInfo structure for types that have their |
| 144 // instances allocated in the Blink garbage-collected heap. | 144 // instances allocated in the Blink garbage-collected heap. |
| 145 template<typename T> struct GCInfoTrait; | 145 template<typename T> struct GCInfoTrait; |
| 146 | 146 |
| 147 template<typename T> class GarbageCollected; | 147 template<typename T> class GarbageCollected; |
| 148 class GarbageCollectedMixin; | 148 class GarbageCollectedMixin; |
| 149 template<typename T, bool = WTF::IsSubclassOfTemplate<T, GarbageCollected>::valu
e> class NeedsAdjustAndMark; | 149 template<typename T, bool = WTF::IsSubclassOfTemplate<typename WTF::RemoveConst<
T>::Type, GarbageCollected>::value> class NeedsAdjustAndMark; |
| 150 | 150 |
| 151 template<typename T> | 151 template<typename T> |
| 152 class NeedsAdjustAndMark<T, true> { | 152 class NeedsAdjustAndMark<T, true> { |
| 153 public: | 153 public: |
| 154 static const bool value = false; | 154 static const bool value = false; |
| 155 }; | 155 }; |
| 156 | 156 |
| 157 template<typename T> | 157 template<typename T> |
| 158 class NeedsAdjustAndMark<T, false> { | 158 class NeedsAdjustAndMark<T, false> { |
| 159 public: | 159 public: |
| 160 static const bool value = WTF::IsSubclass<T, GarbageCollectedMixin>::value; | 160 static const bool value = WTF::IsSubclass<typename WTF::RemoveConst<T>::Type
, GarbageCollectedMixin>::value; |
| 161 }; | 161 }; |
| 162 | 162 |
| 163 template<typename T, bool = NeedsAdjustAndMark<T>::value> class DefaultTraceTrai
t; | 163 template<typename T, bool = NeedsAdjustAndMark<T>::value> class DefaultTraceTrai
t; |
| 164 | 164 |
| 165 // The TraceTrait is used to specify how to mark an object pointer and | 165 // The TraceTrait is used to specify how to mark an object pointer and |
| 166 // how to trace all of the pointers in the object. | 166 // how to trace all of the pointers in the object. |
| 167 // | 167 // |
| 168 // By default, the 'trace' method implemented on an object itself is | 168 // By default, the 'trace' method implemented on an object itself is |
| 169 // used to trace the pointers to other heap objects inside the object. | 169 // used to trace the pointers to other heap objects inside the object. |
| 170 // | 170 // |
| (...skipping 491 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 662 class GarbageCollectedMixin { | 662 class GarbageCollectedMixin { |
| 663 public: | 663 public: |
| 664 virtual void adjustAndMark(Visitor*) const = 0; | 664 virtual void adjustAndMark(Visitor*) const = 0; |
| 665 virtual bool isAlive(Visitor*) const = 0; | 665 virtual bool isAlive(Visitor*) const = 0; |
| 666 }; | 666 }; |
| 667 | 667 |
| 668 #define USING_GARBAGE_COLLECTED_MIXIN(TYPE) \ | 668 #define USING_GARBAGE_COLLECTED_MIXIN(TYPE) \ |
| 669 public: \ | 669 public: \ |
| 670 virtual void adjustAndMark(WebCore::Visitor* visitor) const OVERRIDE \ | 670 virtual void adjustAndMark(WebCore::Visitor* visitor) const OVERRIDE \ |
| 671 { \ | 671 { \ |
| 672 typedef WTF::IsSubclassOfTemplate<TYPE, WebCore::GarbageCollected> IsSub
classOfGarbageCollected; \ | 672 typedef WTF::IsSubclassOfTemplate<typename WTF::RemoveConst<TYPE>::Type,
WebCore::GarbageCollected> IsSubclassOfGarbageCollected; \ |
| 673 COMPILE_ASSERT(IsSubclassOfGarbageCollected::value, OnlyGarbageCollected
ObjectsCanHaveGarbageCollectedMixins); \ | 673 COMPILE_ASSERT(IsSubclassOfGarbageCollected::value, OnlyGarbageCollected
ObjectsCanHaveGarbageCollectedMixins); \ |
| 674 visitor->mark(this, &WebCore::TraceTrait<TYPE>::trace); \ | 674 visitor->mark(this, &WebCore::TraceTrait<TYPE>::trace); \ |
| 675 } \ | 675 } \ |
| 676 virtual bool isAlive(WebCore::Visitor* visitor) const OVERRIDE \ | 676 virtual bool isAlive(WebCore::Visitor* visitor) const OVERRIDE \ |
| 677 { \ | 677 { \ |
| 678 return visitor->isAlive(this); \ | 678 return visitor->isAlive(this); \ |
| 679 } | 679 } |
| 680 | 680 |
| 681 #if ENABLE(OILPAN) | 681 #if ENABLE(OILPAN) |
| 682 #define WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(TYPE) USING_GARBAGE_COLLECTED_MIXI
N(TYPE) | 682 #define WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(TYPE) USING_GARBAGE_COLLECTED_MIXI
N(TYPE) |
| (...skipping 23 matching lines...) Expand all Loading... |
| 706 VTableTrait<T>::hasVTable, | 706 VTableTrait<T>::hasVTable, |
| 707 #if ENABLE(GC_TRACING) | 707 #if ENABLE(GC_TRACING) |
| 708 TypenameStringTrait<T>::get() | 708 TypenameStringTrait<T>::get() |
| 709 #endif | 709 #endif |
| 710 }; | 710 }; |
| 711 return &gcInfo; | 711 return &gcInfo; |
| 712 } | 712 } |
| 713 }; | 713 }; |
| 714 | 714 |
| 715 template<typename T> class GarbageCollected; | 715 template<typename T> class GarbageCollected; |
| 716 template<typename T, bool = WTF::IsSubclassOfTemplate<T, GarbageCollected>::valu
e> struct GetGarbageCollectedBase; | 716 template<typename T, bool = WTF::IsSubclassOfTemplate<typename WTF::RemoveConst<
T>::Type, GarbageCollected>::value> struct GetGarbageCollectedBase; |
| 717 | 717 |
| 718 template<typename T> | 718 template<typename T> |
| 719 struct GetGarbageCollectedBase<T, true> { | 719 struct GetGarbageCollectedBase<T, true> { |
| 720 typedef typename T::GarbageCollectedBase type; | 720 typedef typename T::GarbageCollectedBase type; |
| 721 }; | 721 }; |
| 722 | 722 |
| 723 template<typename T> | 723 template<typename T> |
| 724 struct GetGarbageCollectedBase<T, false> { | 724 struct GetGarbageCollectedBase<T, false> { |
| 725 typedef T type; | 725 typedef T type; |
| 726 }; | 726 }; |
| 727 | 727 |
| 728 template<typename T> | 728 template<typename T> |
| 729 struct GCInfoTrait { | 729 struct GCInfoTrait { |
| 730 static const GCInfo* get() | 730 static const GCInfo* get() |
| 731 { | 731 { |
| 732 return GCInfoAtBase<typename GetGarbageCollectedBase<T>::type>::get(); | 732 return GCInfoAtBase<typename GetGarbageCollectedBase<T>::type>::get(); |
| 733 } | 733 } |
| 734 }; | 734 }; |
| 735 | 735 |
| 736 } | 736 } |
| 737 | 737 |
| 738 #endif | 738 #endif |
| OLD | NEW |