Commit b3738e65 authored by jgruber's avatar jgruber Committed by Commit Bot

[api] Deprecate {Create,WarmUp}SnapshotDataBlob

These functions are now unused within V8, as we need tighter control in
mksnapshot for creating embedded.cc.

Embedders should switch to using SnapshotCreator directly.

Bug: v8:6666
Cq-Include-Trybots: luci.chromium.try:linux_chromium_rel_ng
Change-Id: Id231b3d1fdf50e06c9278f13d095186364264b86
Reviewed-on: https://chromium-review.googlesource.com/1019442Reviewed-by: 's avatarYang Guo <yangguo@chromium.org>
Commit-Queue: Jakob Gruber <jgruber@chromium.org>
Cr-Commit-Position: refs/heads/master@{#52692}
parent f1d9f4b0
...@@ -7969,7 +7969,9 @@ class V8_EXPORT V8 { ...@@ -7969,7 +7969,9 @@ class V8_EXPORT V8 {
* Returns { NULL, 0 } on failure. * Returns { NULL, 0 } on failure.
* The caller acquires ownership of the data array in the return value. * The caller acquires ownership of the data array in the return value.
*/ */
static StartupData CreateSnapshotDataBlob(const char* embedded_source = NULL); V8_DEPRECATED("Use SnapshotCreator",
static StartupData CreateSnapshotDataBlob(
const char* embedded_source = NULL));
/** /**
* Bootstrap an isolate and a context from the cold startup blob, run the * Bootstrap an isolate and a context from the cold startup blob, run the
...@@ -7979,8 +7981,9 @@ class V8_EXPORT V8 { ...@@ -7979,8 +7981,9 @@ class V8_EXPORT V8 {
* The caller acquires ownership of the data array in the return value. * The caller acquires ownership of the data array in the return value.
* The argument startup blob is untouched. * The argument startup blob is untouched.
*/ */
static StartupData WarmUpSnapshotDataBlob(StartupData cold_startup_blob, V8_DEPRECATED("Use SnapshotCreator",
const char* warmup_source); static StartupData WarmUpSnapshotDataBlob(
StartupData cold_startup_blob, const char* warmup_source));
/** Set the callback to invoke in case of Dcheck failures. */ /** Set the callback to invoke in case of Dcheck failures. */
static void SetDcheckErrorHandler(DcheckErrorCallback that); static void SetDcheckErrorHandler(DcheckErrorCallback that);
......
...@@ -120,6 +120,87 @@ struct StartupBlobs { ...@@ -120,6 +120,87 @@ struct StartupBlobs {
} }
}; };
namespace {
bool RunExtraCode(v8::Isolate* isolate, v8::Local<v8::Context> context,
const char* utf8_source, const char* name) {
v8::Context::Scope context_scope(context);
v8::TryCatch try_catch(isolate);
v8::Local<v8::String> source_string;
if (!v8::String::NewFromUtf8(isolate, utf8_source, v8::NewStringType::kNormal)
.ToLocal(&source_string)) {
return false;
}
v8::Local<v8::String> resource_name =
v8::String::NewFromUtf8(isolate, name, v8::NewStringType::kNormal)
.ToLocalChecked();
v8::ScriptOrigin origin(resource_name);
v8::ScriptCompiler::Source source(source_string, origin);
v8::Local<v8::Script> script;
if (!v8::ScriptCompiler::Compile(context, &source).ToLocal(&script))
return false;
if (script->Run(context).IsEmpty()) return false;
CHECK(!try_catch.HasCaught());
return true;
}
v8::StartupData CreateSnapshotDataBlob(const char* embedded_source = nullptr) {
// Create a new isolate and a new context from scratch, optionally run
// a script to embed, and serialize to create a snapshot blob.
v8::StartupData result = {nullptr, 0};
{
v8::SnapshotCreator snapshot_creator;
v8::Isolate* isolate = snapshot_creator.GetIsolate();
{
v8::HandleScope scope(isolate);
v8::Local<v8::Context> context = v8::Context::New(isolate);
if (embedded_source != nullptr &&
!RunExtraCode(isolate, context, embedded_source, "<embedded>")) {
return result;
}
snapshot_creator.SetDefaultContext(context);
}
result = snapshot_creator.CreateBlob(
v8::SnapshotCreator::FunctionCodeHandling::kClear);
}
return result;
}
v8::StartupData WarmUpSnapshotDataBlob(v8::StartupData cold_snapshot_blob,
const char* warmup_source) {
CHECK(cold_snapshot_blob.raw_size > 0 && cold_snapshot_blob.data != nullptr);
CHECK_NOT_NULL(warmup_source);
// Use following steps to create a warmed up snapshot blob from a cold one:
// - Create a new isolate from the cold snapshot.
// - Create a new context to run the warmup script. This will trigger
// compilation of executed functions.
// - Create a new context. This context will be unpolluted.
// - Serialize the isolate and the second context into a new snapshot blob.
v8::StartupData result = {nullptr, 0};
{
v8::SnapshotCreator snapshot_creator(nullptr, &cold_snapshot_blob);
v8::Isolate* isolate = snapshot_creator.GetIsolate();
{
v8::HandleScope scope(isolate);
v8::Local<v8::Context> context = v8::Context::New(isolate);
if (!RunExtraCode(isolate, context, warmup_source, "<warm-up>")) {
return result;
}
}
{
v8::HandleScope handle_scope(isolate);
isolate->ContextDisposedNotification(false);
v8::Local<v8::Context> context = v8::Context::New(isolate);
snapshot_creator.SetDefaultContext(context);
}
result = snapshot_creator.CreateBlob(
v8::SnapshotCreator::FunctionCodeHandling::kKeep);
}
return result;
}
} // namespace
static StartupBlobs Serialize(v8::Isolate* isolate) { static StartupBlobs Serialize(v8::Isolate* isolate) {
// We have to create one context. One reason for this is so that the builtins // We have to create one context. One reason for this is so that the builtins
// can be loaded from self hosted JS builtins and their addresses can be // can be loaded from self hosted JS builtins and their addresses can be
...@@ -622,7 +703,7 @@ TEST(CustomSnapshotDataBlob1) { ...@@ -622,7 +703,7 @@ TEST(CustomSnapshotDataBlob1) {
DisableAlwaysOpt(); DisableAlwaysOpt();
const char* source1 = "function f() { return 42; }"; const char* source1 = "function f() { return 42; }";
v8::StartupData data1 = v8::V8::CreateSnapshotDataBlob(source1); v8::StartupData data1 = CreateSnapshotDataBlob(source1);
v8::Isolate::CreateParams params1; v8::Isolate::CreateParams params1;
params1.snapshot_blob = &data1; params1.snapshot_blob = &data1;
...@@ -942,7 +1023,7 @@ TEST(CustomSnapshotDataBlob2) { ...@@ -942,7 +1023,7 @@ TEST(CustomSnapshotDataBlob2) {
"function g() { return 43; }" "function g() { return 43; }"
"/./.test('a')"; "/./.test('a')";
v8::StartupData data2 = v8::V8::CreateSnapshotDataBlob(source2); v8::StartupData data2 = CreateSnapshotDataBlob(source2);
v8::Isolate::CreateParams params2; v8::Isolate::CreateParams params2;
params2.snapshot_blob = &data2; params2.snapshot_blob = &data2;
...@@ -985,7 +1066,7 @@ TEST(CustomSnapshotDataBlobOutdatedContextWithOverflow) { ...@@ -985,7 +1066,7 @@ TEST(CustomSnapshotDataBlobOutdatedContextWithOverflow) {
const char* source2 = "o.a(42)"; const char* source2 = "o.a(42)";
v8::StartupData data = v8::V8::CreateSnapshotDataBlob(source1); v8::StartupData data = CreateSnapshotDataBlob(source1);
v8::Isolate::CreateParams params; v8::Isolate::CreateParams params;
params.snapshot_blob = &data; params.snapshot_blob = &data;
...@@ -1034,7 +1115,7 @@ TEST(CustomSnapshotDataBlobWithLocker) { ...@@ -1034,7 +1115,7 @@ TEST(CustomSnapshotDataBlobWithLocker) {
const char* source1 = "function f() { return 42; }"; const char* source1 = "function f() { return 42; }";
v8::StartupData data1 = v8::V8::CreateSnapshotDataBlob(source1); v8::StartupData data1 = CreateSnapshotDataBlob(source1);
v8::Isolate::CreateParams params1; v8::Isolate::CreateParams params1;
params1.snapshot_blob = &data1; params1.snapshot_blob = &data1;
...@@ -1066,7 +1147,7 @@ TEST(CustomSnapshotDataBlobStackOverflow) { ...@@ -1066,7 +1147,7 @@ TEST(CustomSnapshotDataBlobStackOverflow) {
" b = c;" " b = c;"
"}"; "}";
v8::StartupData data = v8::V8::CreateSnapshotDataBlob(source); v8::StartupData data = CreateSnapshotDataBlob(source);
v8::Isolate::CreateParams params; v8::Isolate::CreateParams params;
params.snapshot_blob = &data; params.snapshot_blob = &data;
...@@ -1105,8 +1186,8 @@ TEST(SnapshotDataBlobWithWarmup) { ...@@ -1105,8 +1186,8 @@ TEST(SnapshotDataBlobWithWarmup) {
DisableAlwaysOpt(); DisableAlwaysOpt();
const char* warmup = "Math.abs(1); Math.random = 1;"; const char* warmup = "Math.abs(1); Math.random = 1;";
v8::StartupData cold = v8::V8::CreateSnapshotDataBlob(); v8::StartupData cold = CreateSnapshotDataBlob();
v8::StartupData warm = v8::V8::WarmUpSnapshotDataBlob(cold, warmup); v8::StartupData warm = WarmUpSnapshotDataBlob(cold, warmup);
delete[] cold.data; delete[] cold.data;
v8::Isolate::CreateParams params; v8::Isolate::CreateParams params;
...@@ -1139,8 +1220,8 @@ TEST(CustomSnapshotDataBlobWithWarmup) { ...@@ -1139,8 +1220,8 @@ TEST(CustomSnapshotDataBlobWithWarmup) {
"var a = 5"; "var a = 5";
const char* warmup = "a = f()"; const char* warmup = "a = f()";
v8::StartupData cold = v8::V8::CreateSnapshotDataBlob(source); v8::StartupData cold = CreateSnapshotDataBlob(source);
v8::StartupData warm = v8::V8::WarmUpSnapshotDataBlob(cold, warmup); v8::StartupData warm = WarmUpSnapshotDataBlob(cold, warmup);
delete[] cold.data; delete[] cold.data;
v8::Isolate::CreateParams params; v8::Isolate::CreateParams params;
...@@ -1177,8 +1258,8 @@ TEST(CustomSnapshotDataBlobImmortalImmovableRoots) { ...@@ -1177,8 +1258,8 @@ TEST(CustomSnapshotDataBlobImmortalImmovableRoots) {
STATIC_CHAR_VECTOR("a.push(function() {return 7});"), STATIC_CHAR_VECTOR("a.push(function() {return 7});"),
STATIC_CHAR_VECTOR("\0"), 10000); STATIC_CHAR_VECTOR("\0"), 10000);
v8::StartupData data = v8::V8::CreateSnapshotDataBlob( v8::StartupData data =
reinterpret_cast<const char*>(source.start())); CreateSnapshotDataBlob(reinterpret_cast<const char*>(source.start()));
v8::Isolate::CreateParams params; v8::Isolate::CreateParams params;
params.snapshot_blob = &data; params.snapshot_blob = &data;
...@@ -3328,7 +3409,7 @@ UNINITIALIZED_TEST(ReinitializeHashSeedRehashable) { ...@@ -3328,7 +3409,7 @@ UNINITIALIZED_TEST(ReinitializeHashSeedRehashable) {
TEST(SerializationMemoryStats) { TEST(SerializationMemoryStats) {
FLAG_profile_deserialization = true; FLAG_profile_deserialization = true;
FLAG_always_opt = false; FLAG_always_opt = false;
v8::StartupData blob = v8::V8::CreateSnapshotDataBlob(); v8::StartupData blob = CreateSnapshotDataBlob();
delete[] blob.data; delete[] blob.data;
} }
......
...@@ -974,6 +974,50 @@ class InspectorExtension : public IsolateData::SetupGlobalTask { ...@@ -974,6 +974,50 @@ class InspectorExtension : public IsolateData::SetupGlobalTask {
} }
}; };
bool RunExtraCode(v8::Isolate* isolate, v8::Local<v8::Context> context,
const char* utf8_source, const char* name) {
v8::Context::Scope context_scope(context);
v8::TryCatch try_catch(isolate);
v8::Local<v8::String> source_string;
if (!v8::String::NewFromUtf8(isolate, utf8_source, v8::NewStringType::kNormal)
.ToLocal(&source_string)) {
return false;
}
v8::Local<v8::String> resource_name =
v8::String::NewFromUtf8(isolate, name, v8::NewStringType::kNormal)
.ToLocalChecked();
v8::ScriptOrigin origin(resource_name);
v8::ScriptCompiler::Source source(source_string, origin);
v8::Local<v8::Script> script;
if (!v8::ScriptCompiler::Compile(context, &source).ToLocal(&script))
return false;
if (script->Run(context).IsEmpty()) return false;
CHECK(!try_catch.HasCaught());
return true;
}
v8::StartupData CreateSnapshotDataBlob(const char* embedded_source = nullptr) {
// Create a new isolate and a new context from scratch, optionally run
// a script to embed, and serialize to create a snapshot blob.
v8::StartupData result = {nullptr, 0};
{
v8::SnapshotCreator snapshot_creator;
v8::Isolate* isolate = snapshot_creator.GetIsolate();
{
v8::HandleScope scope(isolate);
v8::Local<v8::Context> context = v8::Context::New(isolate);
if (embedded_source != nullptr &&
!RunExtraCode(isolate, context, embedded_source, "<embedded>")) {
return result;
}
snapshot_creator.SetDefaultContext(context);
}
result = snapshot_creator.CreateBlob(
v8::SnapshotCreator::FunctionCodeHandling::kClear);
}
return result;
}
} // namespace } // namespace
int main(int argc, char* argv[]) { int main(int argc, char* argv[]) {
...@@ -991,7 +1035,7 @@ int main(int argc, char* argv[]) { ...@@ -991,7 +1035,7 @@ int main(int argc, char* argv[]) {
if (strcmp(argv[i], "--embed") == 0) { if (strcmp(argv[i], "--embed") == 0) {
argv[i++] = nullptr; argv[i++] = nullptr;
printf("Embedding script '%s'\n", argv[i]); printf("Embedding script '%s'\n", argv[i]);
startup_data = v8::V8::CreateSnapshotDataBlob(argv[i]); startup_data = CreateSnapshotDataBlob(argv[i]);
argv[i] = nullptr; argv[i] = nullptr;
} }
} }
......
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