| Index: src/api.cc
|
| ===================================================================
|
| --- src/api.cc (revision 959)
|
| +++ src/api.cc (working copy)
|
| @@ -2227,39 +2227,52 @@
|
| LOG_API("Context::New");
|
| ON_BAILOUT("v8::Context::New()", return Persistent<Context>());
|
|
|
| - // Make sure that the global_template has a constructor.
|
| + v8::Handle<ObjectTemplate> proxy_template = global_template;
|
| + i::Handle<i::FunctionTemplateInfo> proxy_constructor;
|
| + i::Handle<i::FunctionTemplateInfo> global_constructor;
|
| +
|
| if (!global_template.IsEmpty()) {
|
| - i::Handle<i::FunctionTemplateInfo> constructor =
|
| - EnsureConstructor(Utils::OpenHandle(*global_template));
|
| + // Make sure that the global_template has a constructor.
|
| + global_constructor = EnsureConstructor(Utils::OpenHandle(*global_template));
|
|
|
| - // Create a fresh template for global proxy object.
|
| - Local<ObjectTemplate> proxy_template = ObjectTemplate::New();
|
| + // Create a fresh template for the global proxy object.
|
| + proxy_template = ObjectTemplate::New();
|
| + proxy_constructor = EnsureConstructor(Utils::OpenHandle(*proxy_template));
|
|
|
| - i::Handle<i::FunctionTemplateInfo> proxy_constructor =
|
| - EnsureConstructor(Utils::OpenHandle(*proxy_template));
|
| -
|
| - // Set the global template to be the prototype template
|
| - // of global proxy template.
|
| + // Set the global template to be the prototype template of global
|
| + // proxy template.
|
| proxy_constructor->set_prototype_template(
|
| *Utils::OpenHandle(*global_template));
|
|
|
| - // Migrate security handlers from global_template to proxy_template.
|
| - if (!constructor->access_check_info()->IsUndefined()) {
|
| - proxy_constructor->set_access_check_info(
|
| - constructor->access_check_info());
|
| - proxy_constructor->set_needs_access_check(true);
|
| -
|
| - // Remove access check info from global_template.
|
| - constructor->set_needs_access_check(false);
|
| - constructor->set_access_check_info(i::Heap::undefined_value());
|
| + // Migrate security handlers from global_template to
|
| + // proxy_template. Temporarily removing access check information
|
| + // from the global template.
|
| + if (!global_constructor->access_check_info()->IsUndefined()) {
|
| + proxy_constructor->set_access_check_info(
|
| + global_constructor->access_check_info());
|
| + proxy_constructor->set_needs_access_check(
|
| + global_constructor->needs_access_check());
|
| + global_constructor->set_needs_access_check(false);
|
| + global_constructor->set_access_check_info(i::Heap::undefined_value());
|
| }
|
| -
|
| - global_template = proxy_template;
|
| }
|
|
|
| + // Create the environment.
|
| i::Handle<i::Context> env = i::Bootstrapper::CreateEnvironment(
|
| Utils::OpenHandle(*global_object),
|
| - global_template, extensions);
|
| + proxy_template,
|
| + extensions);
|
| +
|
| + // Restore the access check info on the global template.
|
| + if (!global_template.IsEmpty()) {
|
| + ASSERT(!global_constructor.is_null());
|
| + ASSERT(!proxy_constructor.is_null());
|
| + global_constructor->set_access_check_info(
|
| + proxy_constructor->access_check_info());
|
| + global_constructor->set_needs_access_check(
|
| + proxy_constructor->needs_access_check());
|
| + }
|
| +
|
| if (!ApiCheck(!env.is_null(),
|
| "v8::Context::New()",
|
| "Could not initialize environment"))
|
|
|