[inspector] Move IsolateData to a separate file
BUG=none Review-Url: https://codereview.chromium.org/2887013002 Cr-Commit-Position: refs/heads/master@{#45356}
This commit is contained in:
parent
578150a5f9
commit
fc6cfbfdc1
@ -11,6 +11,8 @@ v8_executable("inspector-test") {
|
||||
"inspector-impl.cc",
|
||||
"inspector-impl.h",
|
||||
"inspector-test.cc",
|
||||
"isolate-data.cc",
|
||||
"isolate-data.h",
|
||||
"task-runner.cc",
|
||||
"task-runner.h",
|
||||
]
|
||||
|
@ -23,6 +23,8 @@
|
||||
'inspector-impl.cc',
|
||||
'inspector-impl.h',
|
||||
'inspector-test.cc',
|
||||
'isolate-data.cc',
|
||||
'isolate-data.h',
|
||||
'task-runner.cc',
|
||||
'task-runner.h',
|
||||
],
|
||||
|
79
test/inspector/isolate-data.cc
Normal file
79
test/inspector/isolate-data.cc
Normal file
@ -0,0 +1,79 @@
|
||||
// Copyright 2017 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#include "test/inspector/isolate-data.h"
|
||||
|
||||
#include "test/inspector/inspector-impl.h"
|
||||
#include "test/inspector/task-runner.h"
|
||||
|
||||
namespace {
|
||||
|
||||
const int kIsolateDataIndex = 2;
|
||||
|
||||
v8::internal::Vector<uint16_t> ToVector(v8::Local<v8::String> str) {
|
||||
v8::internal::Vector<uint16_t> buffer =
|
||||
v8::internal::Vector<uint16_t>::New(str->Length());
|
||||
str->Write(buffer.start(), 0, str->Length());
|
||||
return buffer;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
IsolateData::IsolateData(TaskRunner* task_runner,
|
||||
IsolateData::SetupGlobalTasks setup_global_tasks,
|
||||
v8::StartupData* startup_data)
|
||||
: task_runner_(task_runner),
|
||||
setup_global_tasks_(std::move(setup_global_tasks)) {
|
||||
v8::Isolate::CreateParams params;
|
||||
params.array_buffer_allocator =
|
||||
v8::ArrayBuffer::Allocator::NewDefaultAllocator();
|
||||
params.snapshot_blob = startup_data;
|
||||
isolate_ = v8::Isolate::New(params);
|
||||
isolate_->SetMicrotasksPolicy(v8::MicrotasksPolicy::kScoped);
|
||||
}
|
||||
|
||||
IsolateData* IsolateData::FromContext(v8::Local<v8::Context> context) {
|
||||
return static_cast<IsolateData*>(
|
||||
context->GetAlignedPointerFromEmbedderData(kIsolateDataIndex));
|
||||
}
|
||||
|
||||
int IsolateData::CreateContextGroup() {
|
||||
v8::Local<v8::ObjectTemplate> global_template =
|
||||
v8::ObjectTemplate::New(isolate_);
|
||||
for (auto it = setup_global_tasks_.begin(); it != setup_global_tasks_.end();
|
||||
++it) {
|
||||
(*it)->Run(isolate_, global_template);
|
||||
}
|
||||
v8::Local<v8::Context> context =
|
||||
v8::Context::New(isolate_, nullptr, global_template);
|
||||
context->SetAlignedPointerInEmbedderData(kIsolateDataIndex, this);
|
||||
int context_group_id = ++last_context_group_id_;
|
||||
contexts_[context_group_id].Reset(isolate_, context);
|
||||
return context_group_id;
|
||||
}
|
||||
|
||||
v8::Local<v8::Context> IsolateData::GetContext(int context_group_id) {
|
||||
return contexts_[context_group_id].Get(isolate_);
|
||||
}
|
||||
|
||||
void IsolateData::RegisterModule(v8::Local<v8::Context> context,
|
||||
v8::internal::Vector<uint16_t> name,
|
||||
v8::ScriptCompiler::Source* source) {
|
||||
v8::Local<v8::Module> module;
|
||||
if (!v8::ScriptCompiler::CompileModule(isolate(), source).ToLocal(&module))
|
||||
return;
|
||||
if (!module->Instantiate(context, &IsolateData::ModuleResolveCallback))
|
||||
return;
|
||||
v8::Local<v8::Value> result;
|
||||
if (!module->Evaluate(context).ToLocal(&result)) return;
|
||||
modules_[name] = v8::Global<v8::Module>(isolate_, module);
|
||||
}
|
||||
|
||||
v8::MaybeLocal<v8::Module> IsolateData::ModuleResolveCallback(
|
||||
v8::Local<v8::Context> context, v8::Local<v8::String> specifier,
|
||||
v8::Local<v8::Module> referrer) {
|
||||
std::string str = *v8::String::Utf8Value(specifier);
|
||||
IsolateData* data = IsolateData::FromContext(context);
|
||||
return data->modules_[ToVector(specifier)].Get(data->isolate_);
|
||||
}
|
62
test/inspector/isolate-data.h
Normal file
62
test/inspector/isolate-data.h
Normal file
@ -0,0 +1,62 @@
|
||||
// Copyright 2017 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef V8_TEST_INSPECTOR_PROTOCOL_ISOLATE_DATA_H_
|
||||
#define V8_TEST_INSPECTOR_PROTOCOL_ISOLATE_DATA_H_
|
||||
|
||||
#include <map>
|
||||
|
||||
#include "include/v8-inspector.h"
|
||||
#include "include/v8-platform.h"
|
||||
#include "include/v8.h"
|
||||
#include "src/vector.h"
|
||||
|
||||
class TaskRunner;
|
||||
|
||||
class IsolateData {
|
||||
public:
|
||||
class SetupGlobalTask {
|
||||
public:
|
||||
virtual ~SetupGlobalTask() = default;
|
||||
virtual void Run(v8::Isolate* isolate,
|
||||
v8::Local<v8::ObjectTemplate> global) = 0;
|
||||
};
|
||||
using SetupGlobalTasks = std::vector<std::unique_ptr<SetupGlobalTask>>;
|
||||
|
||||
IsolateData(TaskRunner* task_runner, SetupGlobalTasks setup_global_tasks,
|
||||
v8::StartupData* startup_data);
|
||||
static IsolateData* FromContext(v8::Local<v8::Context> context);
|
||||
|
||||
v8::Isolate* isolate() const { return isolate_; }
|
||||
TaskRunner* task_runner() const { return task_runner_; }
|
||||
int CreateContextGroup();
|
||||
v8::Local<v8::Context> GetContext(int context_group_id);
|
||||
void RegisterModule(v8::Local<v8::Context> context,
|
||||
v8::internal::Vector<uint16_t> name,
|
||||
v8::ScriptCompiler::Source* source);
|
||||
|
||||
private:
|
||||
struct VectorCompare {
|
||||
bool operator()(const v8::internal::Vector<uint16_t>& lhs,
|
||||
const v8::internal::Vector<uint16_t>& rhs) const {
|
||||
for (int i = 0; i < lhs.length() && i < rhs.length(); ++i) {
|
||||
if (lhs[i] != rhs[i]) return lhs[i] < rhs[i];
|
||||
}
|
||||
return false;
|
||||
}
|
||||
};
|
||||
static v8::MaybeLocal<v8::Module> ModuleResolveCallback(
|
||||
v8::Local<v8::Context> context, v8::Local<v8::String> specifier,
|
||||
v8::Local<v8::Module> referrer);
|
||||
|
||||
TaskRunner* task_runner_;
|
||||
SetupGlobalTasks setup_global_tasks_;
|
||||
v8::Isolate* isolate_;
|
||||
int last_context_group_id_ = 0;
|
||||
std::map<int, v8::Global<v8::Context>> contexts_;
|
||||
std::map<v8::internal::Vector<uint16_t>, v8::Global<v8::Module>,
|
||||
VectorCompare>
|
||||
modules_;
|
||||
};
|
||||
#endif // V8_TEST_INSPECTOR_PROTOCOL_ISOLATE_DATA_H_
|
@ -12,8 +12,6 @@
|
||||
|
||||
namespace {
|
||||
|
||||
const int kIsolateDataIndex = 2;
|
||||
|
||||
void ReportUncaughtException(v8::Isolate* isolate,
|
||||
const v8::TryCatch& try_catch) {
|
||||
CHECK(try_catch.HasCaught());
|
||||
@ -31,64 +29,6 @@ v8::internal::Vector<uint16_t> ToVector(v8::Local<v8::String> str) {
|
||||
|
||||
} // namespace
|
||||
|
||||
IsolateData::IsolateData(TaskRunner* task_runner,
|
||||
IsolateData::SetupGlobalTasks setup_global_tasks,
|
||||
v8::StartupData* startup_data)
|
||||
: task_runner_(task_runner),
|
||||
setup_global_tasks_(std::move(setup_global_tasks)) {
|
||||
v8::Isolate::CreateParams params;
|
||||
params.array_buffer_allocator =
|
||||
v8::ArrayBuffer::Allocator::NewDefaultAllocator();
|
||||
params.snapshot_blob = startup_data;
|
||||
isolate_ = v8::Isolate::New(params);
|
||||
isolate_->SetMicrotasksPolicy(v8::MicrotasksPolicy::kScoped);
|
||||
}
|
||||
|
||||
IsolateData* IsolateData::FromContext(v8::Local<v8::Context> context) {
|
||||
return static_cast<IsolateData*>(
|
||||
context->GetAlignedPointerFromEmbedderData(kIsolateDataIndex));
|
||||
}
|
||||
|
||||
int IsolateData::CreateContextGroup() {
|
||||
v8::Local<v8::ObjectTemplate> global_template =
|
||||
v8::ObjectTemplate::New(isolate_);
|
||||
for (auto it = setup_global_tasks_.begin(); it != setup_global_tasks_.end();
|
||||
++it) {
|
||||
(*it)->Run(isolate_, global_template);
|
||||
}
|
||||
v8::Local<v8::Context> context =
|
||||
v8::Context::New(isolate_, nullptr, global_template);
|
||||
context->SetAlignedPointerInEmbedderData(kIsolateDataIndex, this);
|
||||
int context_group_id = ++last_context_group_id_;
|
||||
contexts_[context_group_id].Reset(isolate_, context);
|
||||
return context_group_id;
|
||||
}
|
||||
|
||||
v8::Local<v8::Context> IsolateData::GetContext(int context_group_id) {
|
||||
return contexts_[context_group_id].Get(isolate_);
|
||||
}
|
||||
|
||||
void IsolateData::RegisterModule(v8::Local<v8::Context> context,
|
||||
v8::internal::Vector<uint16_t> name,
|
||||
v8::ScriptCompiler::Source* source) {
|
||||
v8::Local<v8::Module> module;
|
||||
if (!v8::ScriptCompiler::CompileModule(isolate(), source).ToLocal(&module))
|
||||
return;
|
||||
if (!module->Instantiate(context, &IsolateData::ModuleResolveCallback))
|
||||
return;
|
||||
v8::Local<v8::Value> result;
|
||||
if (!module->Evaluate(context).ToLocal(&result)) return;
|
||||
modules_[name] = v8::Global<v8::Module>(isolate_, module);
|
||||
}
|
||||
|
||||
v8::MaybeLocal<v8::Module> IsolateData::ModuleResolveCallback(
|
||||
v8::Local<v8::Context> context, v8::Local<v8::String> specifier,
|
||||
v8::Local<v8::Module> referrer) {
|
||||
std::string str = *v8::String::Utf8Value(specifier);
|
||||
IsolateData* data = IsolateData::FromContext(context);
|
||||
return data->modules_[ToVector(specifier)].Get(data->isolate_);
|
||||
}
|
||||
|
||||
TaskRunner::TaskRunner(IsolateData::SetupGlobalTasks setup_global_tasks,
|
||||
bool catch_exceptions,
|
||||
v8::base::Semaphore* ready_semaphore,
|
||||
|
@ -15,54 +15,7 @@
|
||||
#include "src/base/platform/platform.h"
|
||||
#include "src/locked-queue-inl.h"
|
||||
#include "src/vector.h"
|
||||
|
||||
class TaskRunner;
|
||||
|
||||
class IsolateData {
|
||||
public:
|
||||
class SetupGlobalTask {
|
||||
public:
|
||||
virtual ~SetupGlobalTask() = default;
|
||||
virtual void Run(v8::Isolate* isolate,
|
||||
v8::Local<v8::ObjectTemplate> global) = 0;
|
||||
};
|
||||
using SetupGlobalTasks = std::vector<std::unique_ptr<SetupGlobalTask>>;
|
||||
|
||||
IsolateData(TaskRunner* task_runner, SetupGlobalTasks setup_global_tasks,
|
||||
v8::StartupData* startup_data);
|
||||
static IsolateData* FromContext(v8::Local<v8::Context> context);
|
||||
|
||||
v8::Isolate* isolate() const { return isolate_; }
|
||||
TaskRunner* task_runner() const { return task_runner_; }
|
||||
int CreateContextGroup();
|
||||
v8::Local<v8::Context> GetContext(int context_group_id);
|
||||
void RegisterModule(v8::Local<v8::Context> context,
|
||||
v8::internal::Vector<uint16_t> name,
|
||||
v8::ScriptCompiler::Source* source);
|
||||
|
||||
private:
|
||||
struct VectorCompare {
|
||||
bool operator()(const v8::internal::Vector<uint16_t>& lhs,
|
||||
const v8::internal::Vector<uint16_t>& rhs) const {
|
||||
for (int i = 0; i < lhs.length() && i < rhs.length(); ++i) {
|
||||
if (lhs[i] != rhs[i]) return lhs[i] < rhs[i];
|
||||
}
|
||||
return false;
|
||||
}
|
||||
};
|
||||
static v8::MaybeLocal<v8::Module> ModuleResolveCallback(
|
||||
v8::Local<v8::Context> context, v8::Local<v8::String> specifier,
|
||||
v8::Local<v8::Module> referrer);
|
||||
|
||||
TaskRunner* task_runner_;
|
||||
SetupGlobalTasks setup_global_tasks_;
|
||||
v8::Isolate* isolate_;
|
||||
int last_context_group_id_ = 0;
|
||||
std::map<int, v8::Global<v8::Context>> contexts_;
|
||||
std::map<v8::internal::Vector<uint16_t>, v8::Global<v8::Module>,
|
||||
VectorCompare>
|
||||
modules_;
|
||||
};
|
||||
#include "test/inspector/isolate-data.h"
|
||||
|
||||
class TaskRunner : public v8::base::Thread {
|
||||
public:
|
||||
|
Loading…
Reference in New Issue
Block a user