Chromium Code Reviews| Index: third_party/WebKit/Source/bindings/core/v8/ScriptWrappableVisitor.cpp |
| diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptWrappableVisitor.cpp b/third_party/WebKit/Source/bindings/core/v8/ScriptWrappableVisitor.cpp |
| index dd674b0191a48c2680a2a3a280dd56bac4e1b767..9648613bb70d316a9e8c3dffa4b3b15985d80600 100644 |
| --- a/third_party/WebKit/Source/bindings/core/v8/ScriptWrappableVisitor.cpp |
| +++ b/third_party/WebKit/Source/bindings/core/v8/ScriptWrappableVisitor.cpp |
| @@ -6,6 +6,7 @@ |
| #include "bindings/core/v8/ActiveScriptWrappable.h" |
| #include "bindings/core/v8/DOMWrapperWorld.h" |
| +#include "bindings/core/v8/ScriptWrappableVisitorVerifier.h" |
| #include "bindings/core/v8/V8AbstractEventListener.h" |
| #include "bindings/core/v8/WrapperTypeInfo.h" |
| #include "core/dom/DocumentStyleSheetCollection.h" |
| @@ -27,6 +28,7 @@ void ScriptWrappableVisitor::TracePrologue() |
| { |
| DCHECK(m_headersToUnmark.isEmpty()); |
| DCHECK(m_markingDeque.isEmpty()); |
| + DCHECK(m_verifierDeque.isEmpty()); |
| m_tracingInProgress = true; |
| } |
| @@ -38,6 +40,12 @@ void ScriptWrappableVisitor::EnterFinalPause() |
| void ScriptWrappableVisitor::TraceEpilogue() |
| { |
| DCHECK(m_markingDeque.isEmpty()); |
| + if (RuntimeEnabledFeatures::traceWrappablesVerifierEnabled()) { |
| + ScriptWrappableVisitorVerifier verifier; |
| + for (auto& markingData : m_verifierDeque) { |
| + markingData.traceWrappers(&verifier); |
| + } |
| + } |
| performCleanup(); |
| } |
| @@ -54,6 +62,7 @@ void ScriptWrappableVisitor::performCleanup() |
| m_headersToUnmark.clear(); |
| m_markingDeque.clear(); |
| + m_verifierDeque.clear(); |
| m_tracingInProgress = false; |
| } |
| @@ -87,14 +96,17 @@ void ScriptWrappableVisitor::RegisterV8References(const std::vector<std::pair<vo |
| bool ScriptWrappableVisitor::AdvanceTracing(double deadlineInMs, v8::EmbedderHeapTracer::AdvanceTracingActions actions) |
| { |
| DCHECK(m_tracingInProgress); |
| + m_advancingTracing = true; |
|
haraken
2016/06/22 15:43:12
You can use TemporaryChange<>.
Marcel Hlopko
2016/06/23 09:09:13
Wonderful! Done.
|
| while (actions.force_completion == v8::EmbedderHeapTracer::ForceCompletionAction::FORCE_COMPLETION |
| || WTF::monotonicallyIncreasingTimeMS() < deadlineInMs) { |
| if (m_markingDeque.isEmpty()) { |
| + m_advancingTracing = false; |
| return false; |
| } |
| m_markingDeque.takeFirst().traceWrappers(this); |
| } |
| + m_advancingTracing = false; |
| return true; |
| } |
| @@ -156,6 +168,12 @@ void ScriptWrappableVisitor::invalidateDeadObjectsInMarkingDeque() |
| markingData.invalidate(); |
| } |
| } |
| + for (auto it = m_verifierDeque.begin(); it != m_verifierDeque.end(); ++it) { |
| + auto& markingData = *it; |
| + if (markingData.shouldBeInvalidated()) { |
| + markingData.invalidate(); |
| + } |
| + } |
| for (auto it = m_headersToUnmark.begin(); it != m_headersToUnmark.end(); ++it) { |
| auto header = *it; |
| if (header && !header->isMarked()) { |