| Index: src/runtime/runtime-scopes.cc
|
| diff --git a/src/runtime/runtime-scopes.cc b/src/runtime/runtime-scopes.cc
|
| index cf885ec0d87a9eca8c8c617648c0c1e890346abd..911958dc01f8e84cc165bcab5984a0a751befd26 100644
|
| --- a/src/runtime/runtime-scopes.cc
|
| +++ b/src/runtime/runtime-scopes.cc
|
| @@ -250,6 +250,12 @@ RUNTIME_FUNCTION(Runtime_DeclareLookupSlot) {
|
| JSGlobalObject::cast(context_arg->extension()), isolate);
|
| return DeclareGlobals(isolate, global, name, value, attr, is_var, is_const,
|
| is_function);
|
| + } else if (context->IsScriptContext()) {
|
| + DCHECK(context->global_object()->IsJSGlobalObject());
|
| + Handle<JSGlobalObject> global(
|
| + JSGlobalObject::cast(context->global_object()), isolate);
|
| + return DeclareGlobals(isolate, global, name, value, attr, is_var, is_const,
|
| + is_function);
|
| }
|
|
|
| if (attributes != ABSENT) {
|
| @@ -325,8 +331,12 @@ RUNTIME_FUNCTION(Runtime_InitializeLegacyConstLookupSlot) {
|
| // meanwhile. If so, re-introduce the variable in the context extension.
|
| if (attributes == ABSENT) {
|
| Handle<Context> declaration_context(context_arg->declaration_context());
|
| - DCHECK(declaration_context->has_extension());
|
| - holder = handle(declaration_context->extension(), isolate);
|
| + if (declaration_context->IsScriptContext()) {
|
| + holder = handle(declaration_context->global_object(), isolate);
|
| + } else {
|
| + DCHECK(declaration_context->has_extension());
|
| + holder = handle(declaration_context->extension(), isolate);
|
| + }
|
| CHECK(holder->IsJSObject());
|
| } else {
|
| // For JSContextExtensionObjects, the initializer can be run multiple times
|
| @@ -630,8 +640,12 @@ RUNTIME_FUNCTION(Runtime_NewScriptContext) {
|
| FindNameClash(scope_info, global_object, script_context_table);
|
| if (isolate->has_pending_exception()) return name_clash_result;
|
|
|
| + // Script contexts have a canonical empty function as their closure, not the
|
| + // anonymous closure containing the global code. See
|
| + // FullCodeGenerator::PushFunctionArgumentForContextAllocation.
|
| + Handle<JSFunction> closure(native_context->closure());
|
| Handle<Context> result =
|
| - isolate->factory()->NewScriptContext(function, scope_info);
|
| + isolate->factory()->NewScriptContext(closure, scope_info);
|
|
|
| DCHECK(function->context() == isolate->context());
|
| DCHECK(function->context()->global_object() == result->global_object());
|
|
|