| Index: third_party/WebKit/Source/bindings/core/v8/ScriptWrappableVisitor.h
|
| diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptWrappableVisitor.h b/third_party/WebKit/Source/bindings/core/v8/ScriptWrappableVisitor.h
|
| index fce3cedc2836ce15975b167acff4181530fc9202..3b73e129ad53aef1408d9f698b56a0cb69324e48 100644
|
| --- a/third_party/WebKit/Source/bindings/core/v8/ScriptWrappableVisitor.h
|
| +++ b/third_party/WebKit/Source/bindings/core/v8/ScriptWrappableVisitor.h
|
| @@ -23,6 +23,7 @@ template<typename T> class Member;
|
| class WrapperMarkingData {
|
| public:
|
| friend class ScriptWrappableVisitor;
|
| +
|
| WrapperMarkingData(
|
| void (*traceWrappersCallback)(const WrapperVisitor*, const void*),
|
| HeapObjectHeader* (*heapObjectHeaderCallback)(const void*),
|
| @@ -43,6 +44,15 @@ public:
|
| }
|
| }
|
|
|
| + /**
|
| + * Returns true when object was marked. Ignores (returns true) invalidated
|
| + * objects.
|
| + */
|
| + inline bool isWrapperHeaderMarked()
|
| + {
|
| + return !m_object || heapObjectHeader()->isWrapperHeaderMarked();
|
| + }
|
| +
|
| private:
|
| inline bool shouldBeInvalidated()
|
| {
|
| @@ -117,6 +127,14 @@ public:
|
| traceWrappersCallback,
|
| heapObjectHeaderCallback,
|
| object));
|
| +#if DCHECK_IS_ON()
|
| + if (!m_advancingTracing) {
|
| + m_verifierDeque.append(WrapperMarkingData(
|
| + traceWrappersCallback,
|
| + heapObjectHeaderCallback,
|
| + object));
|
| + }
|
| +#endif
|
| }
|
|
|
| bool markWrapperHeader(HeapObjectHeader*) const;
|
| @@ -127,7 +145,17 @@ public:
|
| void markWrappersInAllWorlds(const ScriptWrappable*) const override;
|
| void markWrappersInAllWorlds(const void*) const override {}
|
| private:
|
| + /**
|
| + * Is wrapper tracing currently in progress? True if TracePrologue has been
|
| + * called, and TraceEpilogue has not yet been called.
|
| + */
|
| bool m_tracingInProgress = false;
|
| + /**
|
| + * Is AdvanceTracing currently running? If not, we know that all calls of
|
| + * pushToMarkingDeque are from V8 or new wrapper associations. And this
|
| + * information is used by the verifier feature.
|
| + */
|
| + bool m_advancingTracing = false;
|
| void performCleanup();
|
| /**
|
| * Collection of objects we need to trace from. We assume it is safe to hold
|
| @@ -138,6 +166,18 @@ private:
|
| */
|
| mutable WTF::Deque<WrapperMarkingData> m_markingDeque;
|
| /**
|
| + * Collection of objects we started tracing from. We assume it is safe to hold
|
| + * on to the raw pointers because:
|
| + * * oilpan object cannot move
|
| + * * oilpan gc will call invalidateDeadObjectsInMarkingDeque to delete
|
| + * all obsolete objects
|
| + *
|
| + * These objects are used when TraceWrappablesVerifier feature is enabled to
|
| + * verify that all objects reachable in the atomic pause were marked
|
| + * incrementally. If not, there is one or multiple write barriers missing.
|
| + */
|
| + mutable WTF::Deque<WrapperMarkingData> m_verifierDeque;
|
| + /**
|
| * Collection of headers we need to unmark after the tracing finished. We
|
| * assume it is safe to hold on to the headers because:
|
| * * oilpan objects cannot move
|
|
|