Commit 559a8e6a authored by Jan Wilken Dörrie's avatar Jan Wilken Dörrie Committed by Commit Bot

Revert "[wrapper-tracing] Only return trace descriptor for wrapper tracing"

This reverts commit 9c72d479.

Reason for revert: Likely culprit of https://crbug.com/819134

Original change's description:
> [wrapper-tracing] Only return trace descriptor for wrapper tracing
> 
> Similar to Oilpan, only return a struct of callbacks and don't actually
> call further into visitors.
> 
> Bug: chromium:802273
> Change-Id: Idd8cae4492876ddfda2bc6b438e4939825f32cdf
> Reviewed-on: https://chromium-review.googlesource.com/945788
> Commit-Queue: Michael Lippautz <mlippautz@chromium.org>
> Reviewed-by: Kentaro Hara <haraken@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#540846}

TBR=haraken@chromium.org,mlippautz@chromium.org

Change-Id: Iaced3e8e5f9d46540a5fef2f8e1d6c1682217786
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Bug: chromium:802273
Reviewed-on: https://chromium-review.googlesource.com/950779Reviewed-by: default avatarJan Wilken Dörrie <jdoerrie@chromium.org>
Commit-Queue: Jan Wilken Dörrie <jdoerrie@chromium.org>
Cr-Commit-Position: refs/heads/master@{#541063}
parent e6f2eeae
...@@ -501,6 +501,7 @@ TEST(ScriptWrappableMarkingVisitorTest, MixinTracing) { ...@@ -501,6 +501,7 @@ TEST(ScriptWrappableMarkingVisitorTest, MixinTracing) {
DeathAwareScriptWrappable::Create(); DeathAwareScriptWrappable::Create();
Base* base = Base::Create(base_wrapper, mixin_wrapper); Base* base = Base::Create(base_wrapper, mixin_wrapper);
Mixin* mixin = static_cast<Mixin*>(base); Mixin* mixin = static_cast<Mixin*>(base);
HeapObjectHeader* base_header = HeapObjectHeader::FromPayload(base); HeapObjectHeader* base_header = HeapObjectHeader::FromPayload(base);
EXPECT_FALSE(base_header->IsWrapperHeaderMarked()); EXPECT_FALSE(base_header->IsWrapperHeaderMarked());
...@@ -515,7 +516,7 @@ TEST(ScriptWrappableMarkingVisitorTest, MixinTracing) { ...@@ -515,7 +516,7 @@ TEST(ScriptWrappableMarkingVisitorTest, MixinTracing) {
TraceWrapperMember<Mixin> mixin_handle = mixin; TraceWrapperMember<Mixin> mixin_handle = mixin;
EXPECT_TRUE(base_header->IsWrapperHeaderMarked()); EXPECT_TRUE(base_header->IsWrapperHeaderMarked());
EXPECT_FALSE(visitor->MarkingDeque()->IsEmpty()); EXPECT_FALSE(visitor->MarkingDeque()->IsEmpty());
EXPECT_TRUE(visitor->MarkingDequeContains(base)); EXPECT_TRUE(visitor->MarkingDequeContains(mixin));
visitor->AdvanceTracing( visitor->AdvanceTracing(
0, v8::EmbedderHeapTracer::AdvanceTracingActions( 0, v8::EmbedderHeapTracer::AdvanceTracingActions(
......
...@@ -64,7 +64,7 @@ void V8EmbedderGraphBuilder::Visit( ...@@ -64,7 +64,7 @@ void V8EmbedderGraphBuilder::Visit(
const WrapperDescriptor& wrapper_descriptor) const { const WrapperDescriptor& wrapper_descriptor) const {
// Add an edge from the current parent to this object. // Add an edge from the current parent to this object.
// Also push the object to the worklist in order to process its members. // Also push the object to the worklist in order to process its members.
const void* traceable = wrapper_descriptor.base_object_payload; const void* traceable = wrapper_descriptor.traceable;
Graph::Node* graph_node = Graph::Node* graph_node =
GraphNode(traceable, wrapper_descriptor.name_callback(traceable)); GraphNode(traceable, wrapper_descriptor.name_callback(traceable));
graph_->AddEdge(current_parent_, graph_node); graph_->AddEdge(current_parent_, graph_node);
...@@ -113,7 +113,7 @@ void V8EmbedderGraphBuilder::VisitPendingActivities() { ...@@ -113,7 +113,7 @@ void V8EmbedderGraphBuilder::VisitPendingActivities() {
V8EmbedderGraphBuilder::WorklistItem V8EmbedderGraphBuilder::ToWorklistItem( V8EmbedderGraphBuilder::WorklistItem V8EmbedderGraphBuilder::ToWorklistItem(
Graph::Node* node, Graph::Node* node,
const WrapperDescriptor& wrapper_descriptor) const { const WrapperDescriptor& wrapper_descriptor) const {
return {node, wrapper_descriptor.base_object_payload, return {node, wrapper_descriptor.traceable,
wrapper_descriptor.trace_wrappers_callback}; wrapper_descriptor.trace_wrappers_callback};
} }
...@@ -123,7 +123,7 @@ void V8EmbedderGraphBuilder::VisitTransitiveClosure() { ...@@ -123,7 +123,7 @@ void V8EmbedderGraphBuilder::VisitTransitiveClosure() {
auto item = worklist_.back(); auto item = worklist_.back();
worklist_.pop_back(); worklist_.pop_back();
ParentScope parent(this, item.node); ParentScope parent(this, item.node);
item.trace_wrappers_callback(this, const_cast<void*>(item.traceable)); item.trace_wrappers_callback(this, item.traceable);
} }
} }
......
...@@ -254,8 +254,8 @@ void ScriptWrappableMarkingVisitor::Visit( ...@@ -254,8 +254,8 @@ void ScriptWrappableMarkingVisitor::Visit(
void ScriptWrappableMarkingVisitor::Visit( void ScriptWrappableMarkingVisitor::Visit(
const WrapperDescriptor& wrapper_descriptor) const { const WrapperDescriptor& wrapper_descriptor) const {
HeapObjectHeader* header = HeapObjectHeader* header = wrapper_descriptor.heap_object_header_callback(
HeapObjectHeader::FromPayload(wrapper_descriptor.base_object_payload); wrapper_descriptor.traceable);
if (header->IsWrapperHeaderMarked()) if (header->IsWrapperHeaderMarked())
return; return;
MarkWrapperHeader(header); MarkWrapperHeader(header);
......
...@@ -66,8 +66,7 @@ class PLATFORM_EXPORT ScriptWrappableMarkingVisitor ...@@ -66,8 +66,7 @@ class PLATFORM_EXPORT ScriptWrappableMarkingVisitor
return; return;
// If the wrapper is already marked we can bail out here. // If the wrapper is already marked we can bail out here.
if (TraceTrait<T>::GetHeapObjectHeader(const_cast<T*>(dst_object)) if (TraceTrait<T>::GetHeapObjectHeader(dst_object)->IsWrapperHeaderMarked())
->IsWrapperHeaderMarked())
return; return;
CurrentVisitor(thread_state->GetIsolate()) CurrentVisitor(thread_state->GetIsolate())
...@@ -110,17 +109,19 @@ class PLATFORM_EXPORT ScriptWrappableMarkingVisitor ...@@ -110,17 +109,19 @@ class PLATFORM_EXPORT ScriptWrappableMarkingVisitor
class MarkingDequeItem { class MarkingDequeItem {
public: public:
explicit MarkingDequeItem(const WrapperDescriptor& wrapper_descriptor) explicit MarkingDequeItem(const WrapperDescriptor& wrapper_descriptor)
: raw_object_pointer_(wrapper_descriptor.base_object_payload), : trace_wrappers_callback_(wrapper_descriptor.trace_wrappers_callback),
trace_wrappers_callback_(wrapper_descriptor.trace_wrappers_callback) { heap_object_header_callback_(
DCHECK(raw_object_pointer_); wrapper_descriptor.heap_object_header_callback),
raw_object_pointer_(wrapper_descriptor.traceable) {
DCHECK(trace_wrappers_callback_); DCHECK(trace_wrappers_callback_);
DCHECK(heap_object_header_callback_);
DCHECK(raw_object_pointer_);
} }
// Traces wrappers if the underlying object has not yet been invalidated. // Traces wrappers if the underlying object has not yet been invalidated.
inline void TraceWrappers(ScriptWrappableVisitor* visitor) const { inline void TraceWrappers(ScriptWrappableVisitor* visitor) const {
if (raw_object_pointer_) { if (raw_object_pointer_) {
trace_wrappers_callback_(visitor, trace_wrappers_callback_(visitor, raw_object_pointer_);
const_cast<void*>(raw_object_pointer_));
} }
} }
...@@ -138,11 +139,13 @@ class PLATFORM_EXPORT ScriptWrappableMarkingVisitor ...@@ -138,11 +139,13 @@ class PLATFORM_EXPORT ScriptWrappableMarkingVisitor
private: private:
inline const HeapObjectHeader* GetHeapObjectHeader() { inline const HeapObjectHeader* GetHeapObjectHeader() {
return HeapObjectHeader::FromPayload(raw_object_pointer_); DCHECK(raw_object_pointer_);
return heap_object_header_callback_(raw_object_pointer_);
} }
const void* raw_object_pointer_;
TraceWrappersCallback trace_wrappers_callback_; TraceWrappersCallback trace_wrappers_callback_;
HeapObjectHeaderCallback heap_object_header_callback_;
const void* raw_object_pointer_;
}; };
void MarkWrapperHeader(HeapObjectHeader*) const; void MarkWrapperHeader(HeapObjectHeader*) const;
......
...@@ -17,6 +17,7 @@ namespace blink { ...@@ -17,6 +17,7 @@ namespace blink {
template <typename T> template <typename T>
class DOMWrapperMap; class DOMWrapperMap;
class HeapObjectHeader;
class ScriptWrappable; class ScriptWrappable;
class ScriptWrappableVisitor; class ScriptWrappableVisitor;
template <typename T> template <typename T>
...@@ -26,17 +27,18 @@ class TraceWrapperBaseForSupplement; ...@@ -26,17 +27,18 @@ class TraceWrapperBaseForSupplement;
template <typename T> template <typename T>
class TraceWrapperV8Reference; class TraceWrapperV8Reference;
using HeapObjectHeaderCallback = HeapObjectHeader* (*)(const void*);
using MissedWriteBarrierCallback = void (*)(); using MissedWriteBarrierCallback = void (*)();
using TraceWrappersCallback = void (*)(const ScriptWrappableVisitor*,
const void* self);
using NameCallback = const char* (*)(const void* self); using NameCallback = const char* (*)(const void* self);
#define DEFINE_TRAIT_FOR_TRACE_WRAPPERS(ClassName) \ #define DEFINE_TRAIT_FOR_TRACE_WRAPPERS(ClassName) \
template <> \ template <> \
inline void TraceTrait<ClassName>::TraceWrappers( \ inline void TraceTrait<ClassName>::TraceMarkedWrapper( \
ScriptWrappableVisitor* visitor, void* t) { \ const ScriptWrappableVisitor* visitor, const void* t) { \
static_assert(sizeof(ClassName), "type needs to be defined"); \ const ClassName* traceable = ToWrapperTracingType(t); \
static_assert(IsGarbageCollectedType<ClassName>::value, \ traceable->TraceWrappers(visitor); \
"only objects deriving from GarbageCollected can be used"); \
static_cast<ClassName*>(t)->TraceWrappers(visitor); \
} }
// WrapperDescriptor contains enough information to visit a // WrapperDescriptor contains enough information to visit a
...@@ -44,8 +46,9 @@ using NameCallback = const char* (*)(const void* self); ...@@ -44,8 +46,9 @@ using NameCallback = const char* (*)(const void* self);
// It is passed to ScriptWrappableVisitor::Visit method. // It is passed to ScriptWrappableVisitor::Visit method.
struct WrapperDescriptor { struct WrapperDescriptor {
STACK_ALLOCATED(); STACK_ALLOCATED();
const void* base_object_payload; const void* traceable;
TraceWrappersCallback trace_wrappers_callback; TraceWrappersCallback trace_wrappers_callback;
HeapObjectHeaderCallback heap_object_header_callback;
MissedWriteBarrierCallback missed_write_barrier_callback; MissedWriteBarrierCallback missed_write_barrier_callback;
NameCallback name_callback; NameCallback name_callback;
}; };
...@@ -122,9 +125,8 @@ class PLATFORM_EXPORT ScriptWrappableVisitor { ...@@ -122,9 +125,8 @@ class PLATFORM_EXPORT ScriptWrappableVisitor {
template <typename T> template <typename T>
static WrapperDescriptor WrapperDescriptorFor(const T* traceable) { static WrapperDescriptor WrapperDescriptorFor(const T* traceable) {
TraceWrapperDescriptor desc = return {traceable, TraceTrait<T>::TraceMarkedWrapper,
TraceTrait<T>::GetTraceWrapperDescriptor(const_cast<T*>(traceable)); TraceTrait<T>::GetHeapObjectHeader,
return {desc.base_object_payload, desc.callback,
ScriptWrappableVisitor::MissedWriteBarrier<T>, ScriptWrappableVisitor::MissedWriteBarrier<T>,
ScriptWrappableVisitor::NameCallback<T>}; ScriptWrappableVisitor::NameCallback<T>};
} }
...@@ -146,7 +148,6 @@ class PLATFORM_EXPORT ScriptWrappableVisitor { ...@@ -146,7 +148,6 @@ class PLATFORM_EXPORT ScriptWrappableVisitor {
template <typename T> template <typename T>
static const char* NameCallback(const void* traceable) { static const char* NameCallback(const void* traceable) {
// Mixns never inherit from TraceWrapperBase.
return NameInHeapSnapshot(static_cast<const T*>(traceable)); return NameInHeapSnapshot(static_cast<const T*>(traceable));
} }
......
...@@ -16,8 +16,9 @@ class ScriptWrappableVisitorVerifier final : public ScriptWrappableVisitor { ...@@ -16,8 +16,9 @@ class ScriptWrappableVisitorVerifier final : public ScriptWrappableVisitor {
protected: protected:
void Visit(const TraceWrapperV8Reference<v8::Value>&) const final {} void Visit(const TraceWrapperV8Reference<v8::Value>&) const final {}
void Visit(const WrapperDescriptor& wrapper_descriptor) const final { void Visit(const WrapperDescriptor& wrapper_descriptor) const final {
if (!HeapObjectHeader::FromPayload(wrapper_descriptor.base_object_payload) HeapObjectHeader* header = wrapper_descriptor.heap_object_header_callback(
->IsWrapperHeaderMarked()) { wrapper_descriptor.traceable);
if (!header->IsWrapperHeaderMarked()) {
// If this branch is hit, it means that a white (not discovered by // If this branch is hit, it means that a white (not discovered by
// traceWrappers) object was assigned as a member to a black object // traceWrappers) object was assigned as a member to a black object
// (already processed by traceWrappers). Black object will not be // (already processed by traceWrappers). Black object will not be
......
...@@ -16,7 +16,6 @@ namespace blink { ...@@ -16,7 +16,6 @@ namespace blink {
class MarkingVisitor; class MarkingVisitor;
class Visitor; class Visitor;
class ScriptWrappableVisitor;
using Address = uint8_t*; using Address = uint8_t*;
...@@ -24,7 +23,6 @@ using FinalizationCallback = void (*)(void*); ...@@ -24,7 +23,6 @@ using FinalizationCallback = void (*)(void*);
using VisitorCallback = void (*)(Visitor*, void*); using VisitorCallback = void (*)(Visitor*, void*);
using MarkingVisitorCallback = void (*)(MarkingVisitor*, void*); using MarkingVisitorCallback = void (*)(MarkingVisitor*, void*);
using TraceCallback = VisitorCallback; using TraceCallback = VisitorCallback;
using TraceWrappersCallback = void (*)(ScriptWrappableVisitor*, void*);
using WeakCallback = VisitorCallback; using WeakCallback = VisitorCallback;
using EphemeronCallback = VisitorCallback; using EphemeronCallback = VisitorCallback;
......
...@@ -16,6 +16,7 @@ namespace blink { ...@@ -16,6 +16,7 @@ namespace blink {
template <typename T> template <typename T>
class GarbageCollected; class GarbageCollected;
class HeapObjectHeader; class HeapObjectHeader;
class ScriptWrappableVisitor;
// GC_PLUGIN_IGNORE is used to make the plugin ignore a particular class or // GC_PLUGIN_IGNORE is used to make the plugin ignore a particular class or
// field when checking for proper usage. When using GC_PLUGIN_IGNORE // field when checking for proper usage. When using GC_PLUGIN_IGNORE
...@@ -53,11 +54,6 @@ struct TraceDescriptor { ...@@ -53,11 +54,6 @@ struct TraceDescriptor {
bool can_trace_eagerly; bool can_trace_eagerly;
}; };
struct TraceWrapperDescriptor {
void* base_object_payload;
TraceWrappersCallback callback;
};
// The GarbageCollectedMixin interface and helper macro // The GarbageCollectedMixin interface and helper macro
// USING_GARBAGE_COLLECTED_MIXIN can be used to automatically define // USING_GARBAGE_COLLECTED_MIXIN can be used to automatically define
// TraceTrait/ObjectAliveTrait on non-leftmost deriving classes // TraceTrait/ObjectAliveTrait on non-leftmost deriving classes
...@@ -75,39 +71,43 @@ struct TraceWrapperDescriptor { ...@@ -75,39 +71,43 @@ struct TraceWrapperDescriptor {
// }; // };
// //
// With the helper, as long as we are using Member<B>, TypeTrait<B> will // With the helper, as long as we are using Member<B>, TypeTrait<B> will
// dispatch dynamically to retrieve the necessary tracing and header methods. // dispatch adjustAndMark dynamically to find collect addr of the object header.
// Note that this is only enabled for Member<B>. For Member<A> which we can // Note that this is only enabled for Member<B>. For Member<A> which we can
// compute the necessary methods and pointers statically and this dynamic // compute the object header addr statically, this dynamic dispatch is not used.
// dispatch is not used. //
class PLATFORM_EXPORT GarbageCollectedMixin { class PLATFORM_EXPORT GarbageCollectedMixin {
public: public:
typedef int IsGarbageCollectedMixinMarker; typedef int IsGarbageCollectedMixinMarker;
virtual void Trace(Visitor*) {} virtual void Trace(Visitor*) {}
virtual HeapObjectHeader* GetHeapObjectHeader() const = 0;
virtual TraceDescriptor GetTraceDescriptor() const = 0; virtual TraceDescriptor GetTraceDescriptor() const = 0;
virtual TraceWrapperDescriptor GetTraceWrapperDescriptor() const = 0; virtual HeapObjectHeader* GetHeapObjectHeader() const = 0;
virtual void AdjustAndTraceMarkedWrapper(
const ScriptWrappableVisitor*) const = 0;
}; };
#define DEFINE_GARBAGE_COLLECTED_MIXIN_METHODS(TYPE) \ #define DEFINE_GARBAGE_COLLECTED_MIXIN_METHODS(TYPE) \
public: \ public: \
HeapObjectHeader* GetHeapObjectHeader() const override { \ TraceDescriptor GetTraceDescriptor() const override { \
static_assert( \ typedef WTF::IsSubclassOfTemplate<typename std::remove_const<TYPE>::type, \
WTF::IsSubclassOfTemplate<typename std::remove_const<TYPE>::type, \ blink::GarbageCollected> \
blink::GarbageCollected>::value, \ IsSubclassOfGarbageCollected; \
"only garbage collected objects can have garbage collected mixins"); \ static_assert( \
return HeapObjectHeader::FromPayload(static_cast<const TYPE*>(this)); \ IsSubclassOfGarbageCollected::value, \
} \ "only garbage collected objects can have garbage collected mixins"); \
\ return {const_cast<TYPE*>(static_cast<const TYPE*>(this)), \
TraceDescriptor GetTraceDescriptor() const override { \ TraceTrait<TYPE>::Trace, TraceEagerlyTrait<TYPE>::value}; \
return {const_cast<TYPE*>(static_cast<const TYPE*>(this)), \ } \
TraceTrait<TYPE>::Trace, TraceEagerlyTrait<TYPE>::value}; \ \
} \ void AdjustAndTraceMarkedWrapper(const ScriptWrappableVisitor* visitor) \
\ const override { \
TraceWrapperDescriptor GetTraceWrapperDescriptor() const override { \ const TYPE* base = static_cast<const TYPE*>(this); \
return {const_cast<TYPE*>(static_cast<const TYPE*>(this)), \ TraceTrait<TYPE>::TraceMarkedWrapper(visitor, base); \
TraceTrait<TYPE>::TraceWrappers}; \ } \
} \ \
\ HeapObjectHeader* GetHeapObjectHeader() const override { \
return HeapObjectHeader::FromPayload(static_cast<const TYPE*>(this)); \
} \
\
private: private:
// A C++ object's vptr will be initialized to its leftmost base's vtable after // A C++ object's vptr will be initialized to its leftmost base's vtable after
...@@ -212,13 +212,14 @@ class GarbageCollectedMixinConstructorMarker ...@@ -212,13 +212,14 @@ class GarbageCollectedMixinConstructorMarker
// // ambiguous. USING_GARBAGE_COLLECTED_MIXIN(TYPE) overrides them later // // ambiguous. USING_GARBAGE_COLLECTED_MIXIN(TYPE) overrides them later
// // and provides the implementations. // // and provides the implementations.
// }; // };
#define MERGE_GARBAGE_COLLECTED_MIXINS() \ #define MERGE_GARBAGE_COLLECTED_MIXINS() \
public: \ public: \
HeapObjectHeader* GetHeapObjectHeader() const override = 0; \ TraceDescriptor GetTraceDescriptor() const override = 0; \
TraceDescriptor GetTraceDescriptor() const override = 0; \ HeapObjectHeader* GetHeapObjectHeader() const override = 0; \
TraceWrapperDescriptor GetTraceWrapperDescriptor() const override = 0; \ void AdjustAndTraceMarkedWrapper(const ScriptWrappableVisitor*) \
\ const override = 0; \
private: \ \
private: \
using merge_garbage_collected_mixins_requires_semicolon = void using merge_garbage_collected_mixins_requires_semicolon = void
// Base class for objects allocated in the Blink garbage-collected heap. // Base class for objects allocated in the Blink garbage-collected heap.
......
...@@ -54,16 +54,20 @@ class AdjustAndMarkTrait<T, false> { ...@@ -54,16 +54,20 @@ class AdjustAndMarkTrait<T, false> {
return {self, TraceTrait<T>::Trace, TraceEagerlyTrait<T>::value}; return {self, TraceTrait<T>::Trace, TraceEagerlyTrait<T>::value};
} }
static TraceWrapperDescriptor GetTraceWrapperDescriptor(void* self) { static HeapObjectHeader* GetHeapObjectHeader(const T* self) {
return {self, TraceTrait<T>::TraceWrappers};
}
static HeapObjectHeader* GetHeapObjectHeader(void* self) {
#if DCHECK_IS_ON() #if DCHECK_IS_ON()
HeapObjectHeader::CheckFromPayload(self); HeapObjectHeader::CheckFromPayload(self);
#endif #endif
return HeapObjectHeader::FromPayload(self); return HeapObjectHeader::FromPayload(self);
} }
static void TraceMarkedWrapper(const ScriptWrappableVisitor* visitor,
const T* self) {
// The term *mark* is misleading here as we effectively trace through the
// API boundary, i.e., tell V8 that an object is alive. Actual marking
// will be done in V8.
visitor->DispatchTraceWrappers(self);
}
}; };
template <typename T> template <typename T>
...@@ -71,19 +75,18 @@ class AdjustAndMarkTrait<T, true> { ...@@ -71,19 +75,18 @@ class AdjustAndMarkTrait<T, true> {
STATIC_ONLY(AdjustAndMarkTrait); STATIC_ONLY(AdjustAndMarkTrait);
public: public:
static TraceDescriptor GetTraceDescriptor(const T* self) { static HeapObjectHeader* GetHeapObjectHeader(const T* self) {
DCHECK(self); return self->GetHeapObjectHeader();
return self->GetTraceDescriptor();
} }
static TraceWrapperDescriptor GetTraceWrapperDescriptor(const T* self) { static TraceDescriptor GetTraceDescriptor(T* self) {
DCHECK(self); DCHECK(self);
return self->GetTraceWrapperDescriptor(); return self->GetTraceDescriptor();
} }
static HeapObjectHeader* GetHeapObjectHeader(const T* self) { static void TraceMarkedWrapper(const ScriptWrappableVisitor* visitor,
DCHECK(self); const T* self) {
return self->GetHeapObjectHeader(); self->AdjustAndTraceMarkedWrapper(visitor);
} }
}; };
...@@ -170,11 +173,10 @@ struct TraceCollectionIfEnabled { ...@@ -170,11 +173,10 @@ struct TraceCollectionIfEnabled {
} }
}; };
// The TraceTrait is used to specify how to trace and object for Oilpan and // The TraceTrait is used to specify how to mark an object pointer and
// wrapper tracing. // how to trace all of the pointers in the object.
// //
// // By default, the 'trace' method implemented on an object itself is
// By default, the 'Trace' method implemented on an object itself is
// used to trace the pointers to other heap objects inside the object. // used to trace the pointers to other heap objects inside the object.
// //
// However, the TraceTrait can be specialized to use a different // However, the TraceTrait can be specialized to use a different
...@@ -191,17 +193,17 @@ class TraceTrait { ...@@ -191,17 +193,17 @@ class TraceTrait {
return AdjustAndMarkTrait<T>::GetTraceDescriptor(static_cast<T*>(self)); return AdjustAndMarkTrait<T>::GetTraceDescriptor(static_cast<T*>(self));
} }
static TraceWrapperDescriptor GetTraceWrapperDescriptor(void* self) { static void Trace(Visitor*, void* self);
return AdjustAndMarkTrait<T>::GetTraceWrapperDescriptor( static void TraceMarkedWrapper(const ScriptWrappableVisitor*, const void*);
static_cast<T*>(self)); static HeapObjectHeader* GetHeapObjectHeader(const void*);
}
static HeapObjectHeader* GetHeapObjectHeader(void* self) { private:
return AdjustAndMarkTrait<T>::GetHeapObjectHeader(static_cast<T*>(self)); static const T* ToWrapperTracingType(const void* t) {
static_assert(sizeof(T), "type needs to be defined");
static_assert(IsGarbageCollectedType<T>::value,
"only objects deriving from GarbageCollected can be used");
return reinterpret_cast<const T*>(t);
} }
static void Trace(Visitor*, void* self);
static void TraceWrappers(ScriptWrappableVisitor*, void*);
}; };
template <typename T> template <typename T>
...@@ -214,13 +216,16 @@ void TraceTrait<T>::Trace(Visitor* visitor, void* self) { ...@@ -214,13 +216,16 @@ void TraceTrait<T>::Trace(Visitor* visitor, void* self) {
} }
template <typename T> template <typename T>
void TraceTrait<T>::TraceWrappers(ScriptWrappableVisitor* visitor, void* self) { void TraceTrait<T>::TraceMarkedWrapper(const ScriptWrappableVisitor* visitor,
static_assert(sizeof(T), "type needs to be defined"); const void* t) {
static_assert(IsGarbageCollectedType<T>::value, const T* traceable = ToWrapperTracingType(t);
"only objects deriving from GarbageCollected can be used"); AdjustAndMarkTrait<T>::TraceMarkedWrapper(visitor, traceable);
visitor->DispatchTraceWrappers(static_cast<T*>(self));
} }
template <typename T>
HeapObjectHeader* TraceTrait<T>::GetHeapObjectHeader(const void* t) {
return AdjustAndMarkTrait<T>::GetHeapObjectHeader(ToWrapperTracingType(t));
}
template <typename T, typename Traits> template <typename T, typename Traits>
struct TraceTrait<HeapVectorBacking<T, Traits>> { struct TraceTrait<HeapVectorBacking<T, Traits>> {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment