Index: src/api.cc |
diff --git a/src/api.cc b/src/api.cc |
index a6a7e92ef222991100bffc7b65868114fd7e8a2e..52d34b6047ea6c921d31caf9b34675f8727da80a 100644 |
--- a/src/api.cc |
+++ b/src/api.cc |
@@ -460,6 +460,7 @@ bool RunExtraCode(Isolate* isolate, Local<Context> context, |
struct SnapshotCreatorData { |
explicit SnapshotCreatorData(Isolate* isolate) |
: isolate_(isolate), |
+ default_context_(), |
contexts_(isolate), |
templates_(isolate), |
created_(false) {} |
@@ -470,6 +471,7 @@ struct SnapshotCreatorData { |
ArrayBufferAllocator allocator_; |
Isolate* isolate_; |
+ Persistent<Context> default_context_; |
PersistentValueVector<Context> contexts_; |
PersistentValueVector<Template> templates_; |
bool created_; |
@@ -508,6 +510,16 @@ Isolate* SnapshotCreator::GetIsolate() { |
return SnapshotCreatorData::cast(data_)->isolate_; |
} |
+void SnapshotCreator::SetDefaultContext(Local<Context> context) { |
+ DCHECK(!context.IsEmpty()); |
+ SnapshotCreatorData* data = SnapshotCreatorData::cast(data_); |
+ DCHECK(!data->created_); |
+ DCHECK(data->default_context_.IsEmpty()); |
+ Isolate* isolate = data->isolate_; |
+ CHECK_EQ(isolate, context->GetIsolate()); |
+ data->default_context_.Reset(isolate, context); |
+} |
+ |
size_t SnapshotCreator::AddContext(Local<Context> context) { |
DCHECK(!context.IsEmpty()); |
SnapshotCreatorData* data = SnapshotCreatorData::cast(data_); |
@@ -536,6 +548,7 @@ StartupData SnapshotCreator::CreateBlob( |
SnapshotCreatorData* data = SnapshotCreatorData::cast(data_); |
i::Isolate* isolate = reinterpret_cast<i::Isolate*>(data->isolate_); |
DCHECK(!data->created_); |
+ DCHECK(!data->default_context_.IsEmpty()); |
{ |
int num_templates = static_cast<int>(data->templates_.Size()); |
@@ -557,15 +570,21 @@ StartupData SnapshotCreator::CreateBlob( |
i::DisallowHeapAllocation no_gc_from_here_on; |
- int num_contexts = static_cast<int>(data->contexts_.Size()); |
- i::List<i::Object*> contexts(num_contexts); |
- for (int i = 0; i < num_contexts; i++) { |
+ int num_additional_contexts = static_cast<int>(data->contexts_.Size()); |
+ i::List<i::Object*> contexts(num_additional_contexts); |
+ i::Object* default_context; |
+ { |
i::HandleScope scope(isolate); |
- i::Handle<i::Context> context = |
- v8::Utils::OpenHandle(*data->contexts_.Get(i)); |
- contexts.Add(*context); |
+ default_context = |
+ *v8::Utils::OpenHandle(*data->default_context_.Get(data->isolate_)); |
+ data->default_context_.Reset(); |
+ for (int i = 0; i < num_additional_contexts; i++) { |
+ i::Handle<i::Context> context = |
+ v8::Utils::OpenHandle(*data->contexts_.Get(i)); |
+ contexts.Add(*context); |
+ } |
+ data->contexts_.Clear(); |
} |
- data->contexts_.Clear(); |
#ifdef DEBUG |
i::ExternalReferenceTable::instance(isolate)->ResetCount(); |
@@ -575,11 +594,19 @@ StartupData SnapshotCreator::CreateBlob( |
startup_serializer.SerializeStrongReferences(); |
// Serialize each context with a new partial serializer. |
- i::List<i::SnapshotData*> context_snapshots(num_contexts); |
- for (int i = 0; i < num_contexts; i++) { |
+ i::List<i::SnapshotData*> context_snapshots(num_additional_contexts + 1); |
+ |
+ { |
+ i::PartialSerializer partial_serializer(isolate, &startup_serializer, |
+ callback); |
+ partial_serializer.Serialize(&default_context, false); |
+ context_snapshots.Add(new i::SnapshotData(&partial_serializer)); |
+ } |
+ |
+ for (int i = 0; i < num_additional_contexts; i++) { |
i::PartialSerializer partial_serializer(isolate, &startup_serializer, |
callback); |
- partial_serializer.Serialize(&contexts[i]); |
+ partial_serializer.Serialize(&contexts[i], true); |
context_snapshots.Add(new i::SnapshotData(&partial_serializer)); |
} |
@@ -619,7 +646,7 @@ StartupData V8::CreateSnapshotDataBlob(const char* embedded_source) { |
!RunExtraCode(isolate, context, embedded_source, "<embedded>")) { |
return result; |
} |
- snapshot_creator.AddContext(context); |
+ snapshot_creator.SetDefaultContext(context); |
} |
result = snapshot_creator.CreateBlob( |
SnapshotCreator::FunctionCodeHandling::kClear); |
@@ -660,7 +687,7 @@ StartupData V8::WarmUpSnapshotDataBlob(StartupData cold_snapshot_blob, |
HandleScope handle_scope(isolate); |
isolate->ContextDisposedNotification(false); |
Local<Context> context = Context::New(isolate); |
- snapshot_creator.AddContext(context); |
+ snapshot_creator.SetDefaultContext(context); |
} |
result = snapshot_creator.CreateBlob( |
SnapshotCreator::FunctionCodeHandling::kKeep); |
@@ -6213,16 +6240,15 @@ Local<Context> v8::Context::New(v8::Isolate* external_isolate, |
MaybeLocal<Context> v8::Context::FromSnapshot( |
v8::Isolate* external_isolate, size_t context_snapshot_index, |
- v8::ExtensionConfiguration* extensions, |
- v8::MaybeLocal<ObjectTemplate> global_template, |
- v8::MaybeLocal<Value> global_object) { |
+ v8::ExtensionConfiguration* extensions) { |
+ size_t index_including_default_context = context_snapshot_index + 1; |
if (!i::Snapshot::HasContextSnapshot( |
reinterpret_cast<i::Isolate*>(external_isolate), |
- context_snapshot_index)) { |
+ index_including_default_context)) { |
return MaybeLocal<Context>(); |
} |
- return NewContext(external_isolate, extensions, global_template, |
- global_object, context_snapshot_index); |
+ return NewContext(external_isolate, extensions, MaybeLocal<ObjectTemplate>(), |
+ MaybeLocal<Value>(), index_including_default_context); |
} |
MaybeLocal<Object> v8::Context::NewRemoteContext( |