OLD | NEW |
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 GarbageCollected_h | 5 #ifndef GarbageCollected_h |
6 #define GarbageCollected_h | 6 #define GarbageCollected_h |
7 | 7 |
8 #include "platform/heap/ThreadState.h" | 8 #include "platform/heap/ThreadState.h" |
9 #include "wtf/Allocator.h" | 9 #include "wtf/Allocator.h" |
10 #include "wtf/Assertions.h" | 10 #include "wtf/Assertions.h" |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
121 // compute the object header addr statically, this dynamic dispatch is not used. | 121 // compute the object header addr statically, this dynamic dispatch is not used. |
122 class PLATFORM_EXPORT GarbageCollectedMixin { | 122 class PLATFORM_EXPORT GarbageCollectedMixin { |
123 IS_GARBAGE_COLLECTED_TYPE(); | 123 IS_GARBAGE_COLLECTED_TYPE(); |
124 public: | 124 public: |
125 typedef int IsGarbageCollectedMixinMarker; | 125 typedef int IsGarbageCollectedMixinMarker; |
126 virtual void adjustAndMark(Visitor*) const = 0; | 126 virtual void adjustAndMark(Visitor*) const = 0; |
127 virtual void trace(Visitor*) { } | 127 virtual void trace(Visitor*) { } |
128 virtual void adjustAndMark(InlinedGlobalMarkingVisitor) const = 0; | 128 virtual void adjustAndMark(InlinedGlobalMarkingVisitor) const = 0; |
129 virtual void trace(InlinedGlobalMarkingVisitor); | 129 virtual void trace(InlinedGlobalMarkingVisitor); |
130 virtual bool isHeapObjectAlive() const = 0; | 130 virtual bool isHeapObjectAlive() const = 0; |
| 131 virtual HeapObjectHeader* heapObjectHeader() const = 0; |
131 }; | 132 }; |
132 | 133 |
133 #define DEFINE_GARBAGE_COLLECTED_MIXIN_METHODS(VISITOR, TYPE) \ | 134 #define DEFINE_GARBAGE_COLLECTED_MIXIN_METHODS(VISITOR, TYPE) \ |
134 public: \ | 135 public: \ |
135 void adjustAndMark(VISITOR visitor) const override \ | 136 void adjustAndMark(VISITOR visitor) const override \ |
136 { \ | 137 { \ |
137 typedef WTF::IsSubclassOfTemplate<typename WTF::RemoveConst<TYPE>::Type,
blink::GarbageCollected> IsSubclassOfGarbageCollected; \ | 138 typedef WTF::IsSubclassOfTemplate<typename WTF::RemoveConst<TYPE>::Type,
blink::GarbageCollected> IsSubclassOfGarbageCollected; \ |
138 static_assert(IsSubclassOfGarbageCollected::value, "only garbage collect
ed objects can have garbage collected mixins"); \ | 139 static_assert(IsSubclassOfGarbageCollected::value, "only garbage collect
ed objects can have garbage collected mixins"); \ |
139 if (TraceEagerlyTrait<TYPE>::value) { \ | 140 if (TraceEagerlyTrait<TYPE>::value) { \ |
140 if (visitor->ensureMarked(static_cast<const TYPE*>(this))) \ | 141 if (visitor->ensureMarked(static_cast<const TYPE*>(this))) \ |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
198 // runs. | 199 // runs. |
199 #define USING_GARBAGE_COLLECTED_MIXIN(TYPE) \ | 200 #define USING_GARBAGE_COLLECTED_MIXIN(TYPE) \ |
200 DEFINE_GARBAGE_COLLECTED_MIXIN_METHODS(blink::Visitor*, TYPE) \ | 201 DEFINE_GARBAGE_COLLECTED_MIXIN_METHODS(blink::Visitor*, TYPE) \ |
201 DEFINE_GARBAGE_COLLECTED_MIXIN_METHODS(blink::InlinedGlobalMarkingVisitor, T
YPE) \ | 202 DEFINE_GARBAGE_COLLECTED_MIXIN_METHODS(blink::InlinedGlobalMarkingVisitor, T
YPE) \ |
202 DEFINE_GARBAGE_COLLECTED_MIXIN_CONSTRUCTOR_MARKER(TYPE) \ | 203 DEFINE_GARBAGE_COLLECTED_MIXIN_CONSTRUCTOR_MARKER(TYPE) \ |
203 public: \ | 204 public: \ |
204 bool isHeapObjectAlive() const override \ | 205 bool isHeapObjectAlive() const override \ |
205 { \ | 206 { \ |
206 return Heap::isHeapObjectAlive(this); \ | 207 return Heap::isHeapObjectAlive(this); \ |
207 } \ | 208 } \ |
| 209 HeapObjectHeader* heapObjectHeader() const override \ |
| 210 { \ |
| 211 return HeapObjectHeader::fromPayload(this); \ |
| 212 } \ |
208 private: | 213 private: |
209 | 214 |
210 #if ENABLE(OILPAN) | 215 #if ENABLE(OILPAN) |
211 #define WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(TYPE) USING_GARBAGE_COLLECTED_MIXI
N(TYPE) | 216 #define WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(TYPE) USING_GARBAGE_COLLECTED_MIXI
N(TYPE) |
212 #else | 217 #else |
213 #define WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(TYPE) | 218 #define WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(TYPE) |
214 #endif | 219 #endif |
215 | 220 |
216 // An empty class with a constructor that's arranged invoked when all derived co
nstructors | 221 // An empty class with a constructor that's arranged invoked when all derived co
nstructors |
217 // of a mixin instance have completed and it is safe to allow GCs again. See | 222 // of a mixin instance have completed and it is safe to allow GCs again. See |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
387 template<typename U, size_t sz = sizeof(U)> static TrueType isSizeofKnown(U*
); | 392 template<typename U, size_t sz = sizeof(U)> static TrueType isSizeofKnown(U*
); |
388 static FalseType isSizeofKnown(...); | 393 static FalseType isSizeofKnown(...); |
389 static T& t; | 394 static T& t; |
390 public: | 395 public: |
391 static const bool value = sizeof(TrueType) == sizeof(isSizeofKnown(&t)); | 396 static const bool value = sizeof(TrueType) == sizeof(isSizeofKnown(&t)); |
392 }; | 397 }; |
393 | 398 |
394 } // namespace blink | 399 } // namespace blink |
395 | 400 |
396 #endif | 401 #endif |
OLD | NEW |