Commit eaf2761c authored by Michael Lippautz's avatar Michael Lippautz Committed by Commit Bot

[bindings] Construct ScriptWrappable visitor in V8PerIsolateData

Bug: chromium:843903
Change-Id: I2b2cd2efac7119945a32ba74435b4d443f2396f7
Reviewed-on: https://chromium-review.googlesource.com/1190003
Commit-Queue: Michael Lippautz <mlippautz@chromium.org>
Reviewed-by: default avatarKentaro Hara <haraken@chromium.org>
Cr-Commit-Position: refs/heads/master@{#586273}
parent ceee2296
...@@ -56,8 +56,8 @@ class TemporaryScriptWrappableVisitorScope { ...@@ -56,8 +56,8 @@ class TemporaryScriptWrappableVisitorScope {
class InterceptingScriptWrappableMarkingVisitor class InterceptingScriptWrappableMarkingVisitor
: public blink::ScriptWrappableMarkingVisitor { : public blink::ScriptWrappableMarkingVisitor {
public: public:
InterceptingScriptWrappableMarkingVisitor(v8::Isolate* isolate) InterceptingScriptWrappableMarkingVisitor()
: ScriptWrappableMarkingVisitor(isolate), : ScriptWrappableMarkingVisitor(ThreadState::Current()),
marked_wrappers_(new size_t(0)) {} marked_wrappers_(new size_t(0)) {}
~InterceptingScriptWrappableMarkingVisitor() override { ~InterceptingScriptWrappableMarkingVisitor() override {
delete marked_wrappers_; delete marked_wrappers_;
...@@ -93,7 +93,7 @@ class InterceptingScriptWrappableMarkingVisitorScope ...@@ -93,7 +93,7 @@ class InterceptingScriptWrappableMarkingVisitorScope
: TemporaryScriptWrappableVisitorScope( : TemporaryScriptWrappableVisitorScope(
isolate, isolate,
std::unique_ptr<InterceptingScriptWrappableMarkingVisitor>( std::unique_ptr<InterceptingScriptWrappableMarkingVisitor>(
new InterceptingScriptWrappableMarkingVisitor(isolate))) { new InterceptingScriptWrappableMarkingVisitor())) {
Visitor()->Start(); Visitor()->Start();
} }
...@@ -285,9 +285,8 @@ TEST(ScriptWrappableMarkingVisitorTest, VtableAtObjectStart) { ...@@ -285,9 +285,8 @@ TEST(ScriptWrappableMarkingVisitorTest, VtableAtObjectStart) {
// at the start of a ScriptWrappableMarkingVisitor object. We do this to // at the start of a ScriptWrappableMarkingVisitor object. We do this to
// mitigate potential problems that could be caused by LTO when passing // mitigate potential problems that could be caused by LTO when passing
// v8::EmbedderHeapTracer across the API boundary. // v8::EmbedderHeapTracer across the API boundary.
V8TestingScope scope;
std::unique_ptr<blink::ScriptWrappableMarkingVisitor> visitor( std::unique_ptr<blink::ScriptWrappableMarkingVisitor> visitor(
new ScriptWrappableMarkingVisitor(scope.GetIsolate())); new ScriptWrappableMarkingVisitor(ThreadState::Current()));
CHECK_EQ( CHECK_EQ(
static_cast<void*>(visitor.get()), static_cast<void*>(visitor.get()),
static_cast<void*>(dynamic_cast<v8::EmbedderHeapTracer*>(visitor.get()))); static_cast<void*>(dynamic_cast<v8::EmbedderHeapTracer*>(visitor.get())));
......
...@@ -13,6 +13,9 @@ namespace { ...@@ -13,6 +13,9 @@ namespace {
class VerifyingScriptWrappableVisitor : public ScriptWrappableVisitor { class VerifyingScriptWrappableVisitor : public ScriptWrappableVisitor {
public: public:
VerifyingScriptWrappableVisitor()
: ScriptWrappableVisitor(ThreadState::Current()) {}
// Visitor interface. // Visitor interface.
void Visit(const TraceWrapperV8Reference<v8::Value>&) override {} void Visit(const TraceWrapperV8Reference<v8::Value>&) override {}
void Visit(DOMWrapperMap<ScriptWrappable>*, void Visit(DOMWrapperMap<ScriptWrappable>*,
......
...@@ -17,7 +17,10 @@ namespace blink { ...@@ -17,7 +17,10 @@ namespace blink {
V8EmbedderGraphBuilder::V8EmbedderGraphBuilder(v8::Isolate* isolate, V8EmbedderGraphBuilder::V8EmbedderGraphBuilder(v8::Isolate* isolate,
Graph* graph) Graph* graph)
: isolate_(isolate), current_parent_(nullptr), graph_(graph) {} : ScriptWrappableVisitor(ThreadState::Current()),
isolate_(isolate),
current_parent_(nullptr),
graph_(graph) {}
void V8EmbedderGraphBuilder::BuildEmbedderGraphCallback( void V8EmbedderGraphBuilder::BuildEmbedderGraphCallback(
v8::Isolate* isolate, v8::Isolate* isolate,
......
...@@ -63,7 +63,6 @@ ...@@ -63,7 +63,6 @@
#include "third_party/blink/renderer/core/script/modulator.h" #include "third_party/blink/renderer/core/script/modulator.h"
#include "third_party/blink/renderer/core/workers/worker_global_scope.h" #include "third_party/blink/renderer/core/workers/worker_global_scope.h"
#include "third_party/blink/renderer/platform/bindings/dom_wrapper_world.h" #include "third_party/blink/renderer/platform/bindings/dom_wrapper_world.h"
#include "third_party/blink/renderer/platform/bindings/script_wrappable_marking_visitor.h"
#include "third_party/blink/renderer/platform/bindings/v8_per_context_data.h" #include "third_party/blink/renderer/platform/bindings/v8_per_context_data.h"
#include "third_party/blink/renderer/platform/bindings/v8_private_property.h" #include "third_party/blink/renderer/platform/bindings/v8_private_property.h"
#include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h" #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
...@@ -632,10 +631,7 @@ static void HostGetImportMetaProperties(v8::Local<v8::Context> context, ...@@ -632,10 +631,7 @@ static void HostGetImportMetaProperties(v8::Local<v8::Context> context,
static void InitializeV8Common(v8::Isolate* isolate) { static void InitializeV8Common(v8::Isolate* isolate) {
isolate->AddGCPrologueCallback(V8GCController::GcPrologue); isolate->AddGCPrologueCallback(V8GCController::GcPrologue);
isolate->AddGCEpilogueCallback(V8GCController::GcEpilogue); isolate->AddGCEpilogueCallback(V8GCController::GcEpilogue);
std::unique_ptr<ScriptWrappableMarkingVisitor> visitor(
new ScriptWrappableMarkingVisitor(isolate));
V8PerIsolateData::From(isolate)->SetScriptWrappableMarkingVisitor(
std::move(visitor));
isolate->SetEmbedderHeapTracer( isolate->SetEmbedderHeapTracer(
V8PerIsolateData::From(isolate)->GetScriptWrappableMarkingVisitor()); V8PerIsolateData::From(isolate)->GetScriptWrappableMarkingVisitor());
......
...@@ -45,7 +45,7 @@ void ScriptWrappableMarkingVisitor::TracePrologue() { ...@@ -45,7 +45,7 @@ void ScriptWrappableMarkingVisitor::TracePrologue() {
void ScriptWrappableMarkingVisitor::EnterFinalPause(EmbedderStackState) { void ScriptWrappableMarkingVisitor::EnterFinalPause(EmbedderStackState) {
CHECK(ThreadState::Current()); CHECK(ThreadState::Current());
CHECK(!ThreadState::Current()->IsWrapperTracingForbidden()); CHECK(!ThreadState::Current()->IsWrapperTracingForbidden());
ActiveScriptWrappableBase::TraceActiveScriptWrappables(isolate_, this); ActiveScriptWrappableBase::TraceActiveScriptWrappables(isolate(), this);
} }
void ScriptWrappableMarkingVisitor::TraceEpilogue() { void ScriptWrappableMarkingVisitor::TraceEpilogue() {
...@@ -53,7 +53,7 @@ void ScriptWrappableMarkingVisitor::TraceEpilogue() { ...@@ -53,7 +53,7 @@ void ScriptWrappableMarkingVisitor::TraceEpilogue() {
CHECK(!ThreadState::Current()->IsWrapperTracingForbidden()); CHECK(!ThreadState::Current()->IsWrapperTracingForbidden());
DCHECK(marking_deque_.IsEmpty()); DCHECK(marking_deque_.IsEmpty());
#if DCHECK_IS_ON() #if DCHECK_IS_ON()
ScriptWrappableVisitorVerifier verifier; ScriptWrappableVisitorVerifier verifier(ThreadState::Current());
for (auto& marking_data : verifier_deque_) { for (auto& marking_data : verifier_deque_) {
// Check that all children of this object are marked. // Check that all children of this object are marked.
marking_data.Trace(&verifier); marking_data.Trace(&verifier);
...@@ -246,7 +246,7 @@ void ScriptWrappableMarkingVisitor::Visit( ...@@ -246,7 +246,7 @@ void ScriptWrappableMarkingVisitor::Visit(
// requires us to bail out here when tracing is not in progress. // requires us to bail out here when tracing is not in progress.
if (!tracing_in_progress_ || traced_wrapper.Get().IsEmpty()) if (!tracing_in_progress_ || traced_wrapper.Get().IsEmpty())
return; return;
traced_wrapper.Get().RegisterExternalReference(isolate_); traced_wrapper.Get().RegisterExternalReference(isolate());
} }
void ScriptWrappableMarkingVisitor::VisitWithWrappers( void ScriptWrappableMarkingVisitor::VisitWithWrappers(
......
...@@ -63,7 +63,8 @@ class PLATFORM_EXPORT ScriptWrappableMarkingVisitor ...@@ -63,7 +63,8 @@ class PLATFORM_EXPORT ScriptWrappableMarkingVisitor
DOMWrapperMap<ScriptWrappable>*, DOMWrapperMap<ScriptWrappable>*,
ScriptWrappable* key); ScriptWrappable* key);
ScriptWrappableMarkingVisitor(v8::Isolate* isolate) : isolate_(isolate){}; explicit ScriptWrappableMarkingVisitor(ThreadState* thread_state)
: ScriptWrappableVisitor(thread_state) {}
~ScriptWrappableMarkingVisitor() override; ~ScriptWrappableMarkingVisitor() override;
bool WrapperTracingInProgress() const { return tracing_in_progress_; } bool WrapperTracingInProgress() const { return tracing_in_progress_; }
...@@ -91,8 +92,6 @@ class PLATFORM_EXPORT ScriptWrappableMarkingVisitor ...@@ -91,8 +92,6 @@ class PLATFORM_EXPORT ScriptWrappableMarkingVisitor
protected: protected:
using Visitor::Visit; using Visitor::Visit;
v8::Isolate* isolate() const { return isolate_; }
private: private:
class MarkingDequeItem { class MarkingDequeItem {
public: public:
...@@ -189,7 +188,6 @@ class PLATFORM_EXPORT ScriptWrappableMarkingVisitor ...@@ -189,7 +188,6 @@ class PLATFORM_EXPORT ScriptWrappableMarkingVisitor
// - objects this headers belong to are invalidated by the oilpan GC in // - objects this headers belong to are invalidated by the oilpan GC in
// invalidateDeadObjectsInMarkingDeque. // invalidateDeadObjectsInMarkingDeque.
WTF::Vector<HeapObjectHeader*> headers_to_unmark_; WTF::Vector<HeapObjectHeader*> headers_to_unmark_;
v8::Isolate* isolate_;
FRIEND_TEST_ALL_PREFIXES(ScriptWrappableMarkingVisitorTest, MixinTracing); FRIEND_TEST_ALL_PREFIXES(ScriptWrappableMarkingVisitorTest, MixinTracing);
FRIEND_TEST_ALL_PREFIXES(ScriptWrappableMarkingVisitorTest, FRIEND_TEST_ALL_PREFIXES(ScriptWrappableMarkingVisitorTest,
......
...@@ -15,7 +15,8 @@ namespace blink { ...@@ -15,7 +15,8 @@ namespace blink {
// references related to wrappers. // references related to wrappers.
class PLATFORM_EXPORT ScriptWrappableVisitor : public Visitor { class PLATFORM_EXPORT ScriptWrappableVisitor : public Visitor {
public: public:
ScriptWrappableVisitor() : Visitor(ThreadState::Current()) {} explicit ScriptWrappableVisitor(ThreadState* thread_state)
: Visitor(thread_state) {}
// Unused blink::Visitor overrides. Derived visitors should still override // Unused blink::Visitor overrides. Derived visitors should still override
// the cross-component visitation methods. See Visitor documentation. // the cross-component visitation methods. See Visitor documentation.
......
...@@ -16,6 +16,9 @@ namespace blink { ...@@ -16,6 +16,9 @@ namespace blink {
// is also marked. // is also marked.
class ScriptWrappableVisitorVerifier final : public ScriptWrappableVisitor { class ScriptWrappableVisitorVerifier final : public ScriptWrappableVisitor {
public: public:
ScriptWrappableVisitorVerifier(ThreadState* thread_state)
: ScriptWrappableVisitor(thread_state) {}
void Visit(const TraceWrapperV8Reference<v8::Value>&) final {} void Visit(const TraceWrapperV8Reference<v8::Value>&) final {}
void VisitWithWrappers(void* object, TraceDescriptor descriptor) final { void VisitWithWrappers(void* object, TraceDescriptor descriptor) final {
......
...@@ -38,6 +38,7 @@ ...@@ -38,6 +38,7 @@
#include "third_party/blink/renderer/platform/bindings/dom_data_store.h" #include "third_party/blink/renderer/platform/bindings/dom_data_store.h"
#include "third_party/blink/renderer/platform/bindings/script_forbidden_scope.h" #include "third_party/blink/renderer/platform/bindings/script_forbidden_scope.h"
#include "third_party/blink/renderer/platform/bindings/script_state.h" #include "third_party/blink/renderer/platform/bindings/script_state.h"
#include "third_party/blink/renderer/platform/bindings/script_wrappable_marking_visitor.h"
#include "third_party/blink/renderer/platform/bindings/v8_binding.h" #include "third_party/blink/renderer/platform/bindings/v8_binding.h"
#include "third_party/blink/renderer/platform/bindings/v8_object_constructor.h" #include "third_party/blink/renderer/platform/bindings/v8_object_constructor.h"
#include "third_party/blink/renderer/platform/bindings/v8_private_property.h" #include "third_party/blink/renderer/platform/bindings/v8_private_property.h"
...@@ -80,6 +81,8 @@ V8PerIsolateData::V8PerIsolateData( ...@@ -80,6 +81,8 @@ V8PerIsolateData::V8PerIsolateData(
use_counter_disabled_(false), use_counter_disabled_(false),
is_handling_recursion_level_error_(false), is_handling_recursion_level_error_(false),
is_reporting_exception_(false), is_reporting_exception_(false),
script_wrappable_visitor_(
new ScriptWrappableMarkingVisitor(ThreadState::Current())),
runtime_call_stats_(base::DefaultTickClock::GetInstance()), runtime_call_stats_(base::DefaultTickClock::GetInstance()),
handled_near_v8_heap_limit_(false) { handled_near_v8_heap_limit_(false) {
// FIXME: Remove once all v8::Isolate::GetCurrent() calls are gone. // FIXME: Remove once all v8::Isolate::GetCurrent() calls are gone.
......
...@@ -200,11 +200,6 @@ class PLATFORM_EXPORT V8PerIsolateData { ...@@ -200,11 +200,6 @@ class PLATFORM_EXPORT V8PerIsolateData {
return active_script_wrappables_.Get(); return active_script_wrappables_.Get();
} }
void SetScriptWrappableMarkingVisitor(
std::unique_ptr<ScriptWrappableMarkingVisitor> visitor) {
script_wrappable_visitor_ = std::move(visitor);
}
ScriptWrappableMarkingVisitor* GetScriptWrappableMarkingVisitor() const { ScriptWrappableMarkingVisitor* GetScriptWrappableMarkingVisitor() const {
return script_wrappable_visitor_.get(); return script_wrappable_visitor_.get();
} }
......
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