| Index: src/api.cc
|
| diff --git a/src/api.cc b/src/api.cc
|
| index 07351c9aab150fb42e9c20d33192cd0700e448ee..8a745707debcf4a3c4e0bff39700f77e02a524b7 100644
|
| --- a/src/api.cc
|
| +++ b/src/api.cc
|
| @@ -5630,20 +5630,51 @@ const char* v8::V8::GetVersion() {
|
| return i::Version::GetVersion();
|
| }
|
|
|
| -static i::Handle<i::Context> CreateEnvironment(
|
| +template <typename ObjectType>
|
| +struct InvokeBootstrapper;
|
| +
|
| +template <>
|
| +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) {
|
| + return isolate->bootstrapper()->CreateEnvironment(
|
| + maybe_global_proxy, global_object_template, extensions,
|
| + context_snapshot_index);
|
| + }
|
| +};
|
| +
|
| +template <>
|
| +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) {
|
| + USE(extensions);
|
| + USE(context_snapshot_index);
|
| + return isolate->bootstrapper()->NewRemoteContext(maybe_global_proxy,
|
| + global_object_template);
|
| + }
|
| +};
|
| +
|
| +template <typename ObjectType>
|
| +static i::Handle<ObjectType> CreateEnvironment(
|
| i::Isolate* isolate, v8::ExtensionConfiguration* extensions,
|
| - v8::Local<ObjectTemplate> global_template,
|
| - v8::Local<Value> maybe_global_proxy, size_t context_snapshot_index) {
|
| - i::Handle<i::Context> env;
|
| + v8::MaybeLocal<ObjectTemplate> maybe_global_template,
|
| + v8::MaybeLocal<Value> maybe_global_proxy, size_t context_snapshot_index) {
|
| + i::Handle<ObjectType> result;
|
|
|
| // Enter V8 via an ENTER_V8 scope.
|
| {
|
| ENTER_V8(isolate);
|
| - v8::Local<ObjectTemplate> proxy_template = global_template;
|
| + v8::Local<ObjectTemplate> proxy_template;
|
| i::Handle<i::FunctionTemplateInfo> proxy_constructor;
|
| i::Handle<i::FunctionTemplateInfo> global_constructor;
|
|
|
| - if (!global_template.IsEmpty()) {
|
| + if (!maybe_global_template.IsEmpty()) {
|
| + v8::Local<v8::ObjectTemplate> global_template =
|
| + maybe_global_template.ToLocalChecked();
|
| // Make sure that the global_template has a constructor.
|
| global_constructor = EnsureConstructor(isolate, *global_template);
|
|
|
| @@ -5671,17 +5702,18 @@ static i::Handle<i::Context> CreateEnvironment(
|
| }
|
| }
|
|
|
| - i::Handle<i::Object> proxy = Utils::OpenHandle(*maybe_global_proxy, true);
|
| i::MaybeHandle<i::JSGlobalProxy> maybe_proxy;
|
| - if (!proxy.is_null()) {
|
| - maybe_proxy = i::Handle<i::JSGlobalProxy>::cast(proxy);
|
| + if (!maybe_global_proxy.IsEmpty()) {
|
| + maybe_proxy = i::Handle<i::JSGlobalProxy>::cast(
|
| + Utils::OpenHandle(*maybe_global_proxy.ToLocalChecked()));
|
| }
|
| // Create the environment.
|
| - env = isolate->bootstrapper()->CreateEnvironment(
|
| - maybe_proxy, proxy_template, extensions, context_snapshot_index);
|
| + InvokeBootstrapper<ObjectType> invoke;
|
| + result = invoke.Invoke(isolate, maybe_proxy, proxy_template, extensions,
|
| + context_snapshot_index);
|
|
|
| // Restore the access check info on the global template.
|
| - if (!global_template.IsEmpty()) {
|
| + if (!maybe_global_template.IsEmpty()) {
|
| DCHECK(!global_constructor.is_null());
|
| DCHECK(!proxy_constructor.is_null());
|
| global_constructor->set_access_check_info(
|
| @@ -5692,13 +5724,13 @@ static i::Handle<i::Context> CreateEnvironment(
|
| }
|
| // Leave V8.
|
|
|
| - return env;
|
| + return result;
|
| }
|
|
|
| Local<Context> NewContext(v8::Isolate* external_isolate,
|
| v8::ExtensionConfiguration* extensions,
|
| - v8::Local<ObjectTemplate> global_template,
|
| - v8::Local<Value> global_object,
|
| + v8::MaybeLocal<ObjectTemplate> global_template,
|
| + v8::MaybeLocal<Value> global_object,
|
| size_t context_snapshot_index) {
|
| i::Isolate* isolate = reinterpret_cast<i::Isolate*>(external_isolate);
|
| LOG_API(isolate, Context, New);
|
| @@ -5706,8 +5738,8 @@ Local<Context> NewContext(v8::Isolate* external_isolate,
|
| ExtensionConfiguration no_extensions;
|
| if (extensions == NULL) extensions = &no_extensions;
|
| i::Handle<i::Context> env =
|
| - CreateEnvironment(isolate, extensions, global_template, global_object,
|
| - context_snapshot_index);
|
| + CreateEnvironment<i::Context>(isolate, extensions, global_template,
|
| + global_object, context_snapshot_index);
|
| if (env.is_null()) {
|
| if (isolate->has_pending_exception()) {
|
| isolate->OptionalRescheduleException(true);
|
| @@ -5719,8 +5751,8 @@ Local<Context> NewContext(v8::Isolate* external_isolate,
|
|
|
| Local<Context> v8::Context::New(v8::Isolate* external_isolate,
|
| v8::ExtensionConfiguration* extensions,
|
| - v8::Local<ObjectTemplate> global_template,
|
| - v8::Local<Value> global_object) {
|
| + v8::MaybeLocal<ObjectTemplate> global_template,
|
| + v8::MaybeLocal<Value> global_object) {
|
| return NewContext(external_isolate, extensions, global_template,
|
| global_object, 0);
|
| }
|
| @@ -5728,7 +5760,8 @@ 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::Local<ObjectTemplate> global_template, v8::Local<Value> global_object) {
|
| + v8::MaybeLocal<ObjectTemplate> global_template,
|
| + v8::MaybeLocal<Value> global_object) {
|
| if (!i::Snapshot::HasContextSnapshot(
|
| reinterpret_cast<i::Isolate*>(external_isolate),
|
| context_snapshot_index)) {
|
| @@ -5738,6 +5771,36 @@ MaybeLocal<Context> v8::Context::FromSnapshot(
|
| global_object, context_snapshot_index);
|
| }
|
|
|
| +MaybeLocal<Object> v8::Context::NewRemoteContext(
|
| + v8::Isolate* external_isolate, v8::Local<ObjectTemplate> global_template,
|
| + v8::MaybeLocal<v8::Value> global_object) {
|
| + i::Isolate* isolate = reinterpret_cast<i::Isolate*>(external_isolate);
|
| + LOG_API(isolate, Context, NewRemoteContext);
|
| + i::HandleScope scope(isolate);
|
| + i::Handle<i::FunctionTemplateInfo> global_constructor =
|
| + EnsureConstructor(isolate, *global_template);
|
| + Utils::ApiCheck(global_constructor->needs_access_check(),
|
| + "v8::Context::NewRemoteContext",
|
| + "Global template needs to have access checks enabled.");
|
| + i::Handle<i::AccessCheckInfo> access_check_info = i::handle(
|
| + i::AccessCheckInfo::cast(global_constructor->access_check_info()),
|
| + isolate);
|
| + Utils::ApiCheck(access_check_info->named_interceptor() != nullptr,
|
| + "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);
|
| + if (global_proxy.is_null()) {
|
| + if (isolate->has_pending_exception()) {
|
| + isolate->OptionalRescheduleException(true);
|
| + }
|
| + return MaybeLocal<Object>();
|
| + }
|
| + return Utils::ToLocal(
|
| + scope.CloseAndEscape(i::Handle<i::JSObject>::cast(global_proxy)));
|
| +}
|
| +
|
| void v8::Context::SetSecurityToken(Local<Value> token) {
|
| i::Handle<i::Context> env = Utils::OpenHandle(this);
|
| i::Handle<i::Object> token_handle = Utils::OpenHandle(*token);
|
|
|