| Index: src/api.cc | 
| diff --git a/src/api.cc b/src/api.cc | 
| index f57d7987708f00ba1dfefcab4fa4d384a42796ee..dc51f3a2330ddbf059384be3fb2ba6ea9ec3bae7 100644 | 
| --- a/src/api.cc | 
| +++ b/src/api.cc | 
| @@ -476,6 +476,7 @@ struct SnapshotCreatorData { | 
| Persistent<Context> default_context_; | 
| PersistentValueVector<Context> contexts_; | 
| PersistentValueVector<Template> templates_; | 
| +  std::vector<SerializeInternalFieldsCallback> internal_fields_serializers_; | 
| bool created_; | 
| }; | 
|  | 
| @@ -522,7 +523,8 @@ void SnapshotCreator::SetDefaultContext(Local<Context> context) { | 
| data->default_context_.Reset(isolate, context); | 
| } | 
|  | 
| -size_t SnapshotCreator::AddContext(Local<Context> context) { | 
| +size_t SnapshotCreator::AddContext(Local<Context> context, | 
| +                                   SerializeInternalFieldsCallback callback) { | 
| DCHECK(!context.IsEmpty()); | 
| SnapshotCreatorData* data = SnapshotCreatorData::cast(data_); | 
| DCHECK(!data->created_); | 
| @@ -530,6 +532,7 @@ size_t SnapshotCreator::AddContext(Local<Context> context) { | 
| CHECK_EQ(isolate, context->GetIsolate()); | 
| size_t index = static_cast<int>(data->contexts_.Size()); | 
| data->contexts_.Append(context); | 
| +  data->internal_fields_serializers_.push_back(callback); | 
| return index; | 
| } | 
|  | 
| @@ -545,8 +548,7 @@ size_t SnapshotCreator::AddTemplate(Local<Template> template_obj) { | 
| } | 
|  | 
| StartupData SnapshotCreator::CreateBlob( | 
| -    SnapshotCreator::FunctionCodeHandling function_code_handling, | 
| -    SerializeInternalFieldsCallback callback) { | 
| +    SnapshotCreator::FunctionCodeHandling function_code_handling) { | 
| SnapshotCreatorData* data = SnapshotCreatorData::cast(data_); | 
| i::Isolate* isolate = reinterpret_cast<i::Isolate*>(data->isolate_); | 
| DCHECK(!data->created_); | 
| @@ -612,15 +614,16 @@ StartupData SnapshotCreator::CreateBlob( | 
| i::List<i::SnapshotData*> context_snapshots(num_additional_contexts + 1); | 
|  | 
| { | 
| +    // The default snapshot does not support internal fields. | 
| i::PartialSerializer partial_serializer(isolate, &startup_serializer, | 
| -                                            callback); | 
| +                                            nullptr); | 
| 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); | 
| +    i::PartialSerializer partial_serializer( | 
| +        isolate, &startup_serializer, data->internal_fields_serializers_[i]); | 
| partial_serializer.Serialize(&contexts[i], true); | 
| context_snapshots.Add(new i::SnapshotData(&partial_serializer)); | 
| } | 
| @@ -6170,10 +6173,11 @@ struct InvokeBootstrapper<i::Context> { | 
| i::Handle<i::Context> Invoke( | 
| i::Isolate* isolate, i::MaybeHandle<i::JSGlobalProxy> maybe_global_proxy, | 
| v8::Local<v8::ObjectTemplate> global_object_template, | 
| -      v8::ExtensionConfiguration* extensions, size_t context_snapshot_index) { | 
| +      v8::ExtensionConfiguration* extensions, size_t context_snapshot_index, | 
| +      v8::DeserializeInternalFieldsCallback internal_fields_deserializer) { | 
| return isolate->bootstrapper()->CreateEnvironment( | 
| maybe_global_proxy, global_object_template, extensions, | 
| -        context_snapshot_index); | 
| +        context_snapshot_index, internal_fields_deserializer); | 
| } | 
| }; | 
|  | 
| @@ -6182,7 +6186,8 @@ struct InvokeBootstrapper<i::JSGlobalProxy> { | 
| i::Handle<i::JSGlobalProxy> Invoke( | 
| i::Isolate* isolate, i::MaybeHandle<i::JSGlobalProxy> maybe_global_proxy, | 
| v8::Local<v8::ObjectTemplate> global_object_template, | 
| -      v8::ExtensionConfiguration* extensions, size_t context_snapshot_index) { | 
| +      v8::ExtensionConfiguration* extensions, size_t context_snapshot_index, | 
| +      v8::DeserializeInternalFieldsCallback internal_fields_deserializer) { | 
| USE(extensions); | 
| USE(context_snapshot_index); | 
| return isolate->bootstrapper()->NewRemoteContext(maybe_global_proxy, | 
| @@ -6194,7 +6199,8 @@ template <typename ObjectType> | 
| static i::Handle<ObjectType> CreateEnvironment( | 
| i::Isolate* isolate, v8::ExtensionConfiguration* extensions, | 
| v8::MaybeLocal<ObjectTemplate> maybe_global_template, | 
| -    v8::MaybeLocal<Value> maybe_global_proxy, size_t context_snapshot_index) { | 
| +    v8::MaybeLocal<Value> maybe_global_proxy, size_t context_snapshot_index, | 
| +    v8::DeserializeInternalFieldsCallback internal_fields_deserializer) { | 
| i::Handle<ObjectType> result; | 
|  | 
| // Enter V8 via an ENTER_V8 scope. | 
| @@ -6244,8 +6250,9 @@ static i::Handle<ObjectType> CreateEnvironment( | 
| } | 
| // Create the environment. | 
| InvokeBootstrapper<ObjectType> invoke; | 
| -    result = invoke.Invoke(isolate, maybe_proxy, proxy_template, extensions, | 
| -                           context_snapshot_index); | 
| +    result = | 
| +        invoke.Invoke(isolate, maybe_proxy, proxy_template, extensions, | 
| +                      context_snapshot_index, internal_fields_deserializer); | 
|  | 
| // Restore the access check info on the global template. | 
| if (!maybe_global_template.IsEmpty()) { | 
| @@ -6262,20 +6269,20 @@ static i::Handle<ObjectType> CreateEnvironment( | 
| return result; | 
| } | 
|  | 
| -Local<Context> NewContext(v8::Isolate* external_isolate, | 
| -                          v8::ExtensionConfiguration* extensions, | 
| -                          v8::MaybeLocal<ObjectTemplate> global_template, | 
| -                          v8::MaybeLocal<Value> global_object, | 
| -                          size_t context_snapshot_index) { | 
| +Local<Context> NewContext( | 
| +    v8::Isolate* external_isolate, v8::ExtensionConfiguration* extensions, | 
| +    v8::MaybeLocal<ObjectTemplate> global_template, | 
| +    v8::MaybeLocal<Value> global_object, size_t context_snapshot_index, | 
| +    v8::DeserializeInternalFieldsCallback internal_fields_deserializer) { | 
| i::Isolate* isolate = reinterpret_cast<i::Isolate*>(external_isolate); | 
| TRACE_EVENT_CALL_STATS_SCOPED(isolate, "v8", "V8.NewContext"); | 
| LOG_API(isolate, Context, New); | 
| i::HandleScope scope(isolate); | 
| ExtensionConfiguration no_extensions; | 
| if (extensions == NULL) extensions = &no_extensions; | 
| -  i::Handle<i::Context> env = | 
| -      CreateEnvironment<i::Context>(isolate, extensions, global_template, | 
| -                                    global_object, context_snapshot_index); | 
| +  i::Handle<i::Context> env = CreateEnvironment<i::Context>( | 
| +      isolate, extensions, global_template, global_object, | 
| +      context_snapshot_index, internal_fields_deserializer); | 
| if (env.is_null()) { | 
| if (isolate->has_pending_exception()) { | 
| isolate->OptionalRescheduleException(true); | 
| @@ -6290,11 +6297,12 @@ Local<Context> v8::Context::New(v8::Isolate* external_isolate, | 
| v8::MaybeLocal<ObjectTemplate> global_template, | 
| v8::MaybeLocal<Value> global_object) { | 
| return NewContext(external_isolate, extensions, global_template, | 
| -                    global_object, 0); | 
| +                    global_object, 0, nullptr); | 
| } | 
|  | 
| MaybeLocal<Context> v8::Context::FromSnapshot( | 
| v8::Isolate* external_isolate, size_t context_snapshot_index, | 
| +    v8::DeserializeInternalFieldsCallback internal_fields_deserializer, | 
| v8::ExtensionConfiguration* extensions, MaybeLocal<Value> global_object) { | 
| size_t index_including_default_context = context_snapshot_index + 1; | 
| if (!i::Snapshot::HasContextSnapshot( | 
| @@ -6303,7 +6311,8 @@ MaybeLocal<Context> v8::Context::FromSnapshot( | 
| return MaybeLocal<Context>(); | 
| } | 
| return NewContext(external_isolate, extensions, MaybeLocal<ObjectTemplate>(), | 
| -                    global_object, index_including_default_context); | 
| +                    global_object, index_including_default_context, | 
| +                    internal_fields_deserializer); | 
| } | 
|  | 
| MaybeLocal<Object> v8::Context::NewRemoteContext( | 
| @@ -6325,7 +6334,7 @@ MaybeLocal<Object> v8::Context::NewRemoteContext( | 
| "Global template needs to have access check handlers."); | 
| i::Handle<i::JSGlobalProxy> global_proxy = | 
| CreateEnvironment<i::JSGlobalProxy>(isolate, nullptr, global_template, | 
| -                                          global_object, 0); | 
| +                                          global_object, 0, nullptr); | 
| if (global_proxy.is_null()) { | 
| if (isolate->has_pending_exception()) { | 
| isolate->OptionalRescheduleException(true); | 
| @@ -8057,8 +8066,6 @@ Isolate* Isolate::New(const Isolate::CreateParams& params) { | 
| } | 
|  | 
| isolate->set_api_external_references(params.external_references); | 
| -  isolate->set_deserialize_internal_fields_callback( | 
| -      params.deserialize_internal_fields_callback); | 
| SetResourceConstraints(isolate, params.constraints); | 
| // TODO(jochen): Once we got rid of Isolate::Current(), we can remove this. | 
| Isolate::Scope isolate_scope(v8_isolate); | 
|  |