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()); |