| Index: src/bootstrapper.cc
|
| diff --git a/src/bootstrapper.cc b/src/bootstrapper.cc
|
| index c16285af45a4317dc3dba154af9aefdac3f5e91d..3af83d1d3bd15b44515e5142c93379e3f4a880cd 100644
|
| --- a/src/bootstrapper.cc
|
| +++ b/src/bootstrapper.cc
|
| @@ -141,6 +141,8 @@ class Genesis BASE_EMBEDDED {
|
| v8::Local<v8::ObjectTemplate> global_proxy_template,
|
| v8::ExtensionConfiguration* extensions, size_t context_snapshot_index,
|
| GlobalContextType context_type);
|
| + Genesis(Isolate* isolate, MaybeHandle<JSGlobalProxy> maybe_global_proxy,
|
| + v8::Local<v8::ObjectTemplate> global_proxy_template);
|
| ~Genesis() { }
|
|
|
| Isolate* isolate() const { return isolate_; }
|
| @@ -149,6 +151,8 @@ class Genesis BASE_EMBEDDED {
|
|
|
| Handle<Context> result() { return result_; }
|
|
|
| + Handle<JSGlobalProxy> global_proxy() { return global_proxy_; }
|
| +
|
| private:
|
| Handle<Context> native_context() { return native_context_; }
|
|
|
| @@ -302,6 +306,7 @@ class Genesis BASE_EMBEDDED {
|
| Isolate* isolate_;
|
| Handle<Context> result_;
|
| Handle<Context> native_context_;
|
| + Handle<JSGlobalProxy> global_proxy_;
|
|
|
| // Function maps. Function maps are created initially with a read only
|
| // prototype for the processing of JS builtins. Later the function maps are
|
| @@ -337,6 +342,15 @@ Handle<Context> Bootstrapper::CreateEnvironment(
|
| return scope.CloseAndEscape(env);
|
| }
|
|
|
| +Handle<JSGlobalProxy> Bootstrapper::NewRemoteContext(
|
| + MaybeHandle<JSGlobalProxy> maybe_global_proxy,
|
| + v8::Local<v8::ObjectTemplate> global_proxy_template) {
|
| + HandleScope scope(isolate_);
|
| + Genesis genesis(isolate_, maybe_global_proxy, global_proxy_template);
|
| + Handle<JSGlobalProxy> global_proxy = genesis.global_proxy();
|
| + if (global_proxy.is_null()) return Handle<JSGlobalProxy>();
|
| + return scope.CloseAndEscape(global_proxy);
|
| +}
|
|
|
| static void SetObjectPrototype(Handle<JSObject> object, Handle<Object> proto) {
|
| // object.__proto__ = proto;
|
| @@ -3884,6 +3898,8 @@ Genesis::Genesis(Isolate* isolate,
|
| : isolate_(isolate), active_(isolate->bootstrapper()) {
|
| NoTrackDoubleFieldsForSerializerScope disable_scope(isolate);
|
| result_ = Handle<Context>::null();
|
| + global_proxy_ = Handle<JSGlobalProxy>::null();
|
| +
|
| // Before creating the roots we must save the context and restore it
|
| // on all function exits.
|
| SaveContext saved_context(isolate);
|
| @@ -3992,6 +4008,67 @@ Genesis::Genesis(Isolate* isolate,
|
| result_ = native_context();
|
| }
|
|
|
| +Genesis::Genesis(Isolate* isolate,
|
| + MaybeHandle<JSGlobalProxy> maybe_global_proxy,
|
| + v8::Local<v8::ObjectTemplate> global_proxy_template)
|
| + : isolate_(isolate), active_(isolate->bootstrapper()) {
|
| + NoTrackDoubleFieldsForSerializerScope disable_scope(isolate);
|
| + result_ = Handle<Context>::null();
|
| + global_proxy_ = Handle<JSGlobalProxy>::null();
|
| +
|
| + // Before creating the roots we must save the context and restore it
|
| + // on all function exits.
|
| + SaveContext saved_context(isolate);
|
| +
|
| + // During genesis, the boilerplate for stack overflow won't work until the
|
| + // environment has been at least partially initialized. Add a stack check
|
| + // before entering JS code to catch overflow early.
|
| + StackLimitCheck check(isolate);
|
| + if (check.HasOverflowed()) {
|
| + isolate->StackOverflow();
|
| + return;
|
| + }
|
| +
|
| + Handle<JSGlobalProxy> global_proxy;
|
| + if (!maybe_global_proxy.ToHandle(&global_proxy)) {
|
| + global_proxy = factory()->NewUninitializedJSGlobalProxy();
|
| + }
|
| +
|
| + // CreateNewGlobals.
|
| + Handle<ObjectTemplateInfo> global_proxy_data =
|
| + v8::Utils::OpenHandle(*global_proxy_template);
|
| + Handle<FunctionTemplateInfo> global_constructor(
|
| + FunctionTemplateInfo::cast(global_proxy_data->constructor()));
|
| + Handle<SharedFunctionInfo> shared =
|
| + FunctionTemplateInfo::GetOrCreateSharedFunctionInfo(isolate,
|
| + global_constructor);
|
| + Handle<Map> initial_map =
|
| + CreateSloppyFunctionMap(FUNCTION_WITH_WRITEABLE_PROTOTYPE);
|
| + Handle<JSFunction> global_proxy_function =
|
| + isolate->factory()->NewFunctionFromSharedFunctionInfo(
|
| + initial_map, shared, factory()->undefined_value());
|
| + DCHECK_EQ(global_proxy_data->internal_field_count(), 0);
|
| + Handle<Map> global_proxy_map = isolate->factory()->NewMap(
|
| + JS_GLOBAL_PROXY_TYPE, JSGlobalProxy::kSize, FAST_HOLEY_SMI_ELEMENTS);
|
| + JSFunction::SetInitialMap(global_proxy_function, global_proxy_map,
|
| + factory()->null_value());
|
| + global_proxy_map->set_is_access_check_needed(true);
|
| + global_proxy_map->set_is_callable();
|
| + global_proxy_map->set_is_constructor(true);
|
| + global_proxy_map->set_has_hidden_prototype(true);
|
| +
|
| + Handle<String> global_name = factory()->global_string();
|
| + global_proxy_function->shared()->set_instance_class_name(*global_name);
|
| + factory()->ReinitializeJSGlobalProxy(global_proxy, global_proxy_function);
|
| +
|
| + // HookUpGlobalProxy.
|
| + global_proxy->set_native_context(*factory()->null_value());
|
| +
|
| + // DetachGlobal.
|
| + SetObjectPrototype(global_proxy, factory()->null_value());
|
| +
|
| + global_proxy_ = global_proxy;
|
| +}
|
|
|
| // Support for thread preemption.
|
|
|
|
|