| Index: src/runtime.cc | 
| diff --git a/src/runtime.cc b/src/runtime.cc | 
| index 3b883f5cbeb00536d3ec72ab7e6d99cf0bf430bb..68d8c8401f9bc5526b45db5651e411995329e8aa 100644 | 
| --- a/src/runtime.cc | 
| +++ b/src/runtime.cc | 
| @@ -1289,9 +1289,13 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_DeclareGlobals) { | 
| // We have to declare a global const property. To capture we only | 
| // assign to it when evaluating the assignment for "const x = | 
| // <expr>" the initial value is the hole. | 
| -    bool is_const_property = value->IsTheHole(); | 
| -    bool is_function_declaration = false; | 
| -    if (value->IsUndefined() || is_const_property) { | 
| +    bool is_var = value->IsUndefined(); | 
| +    bool is_const = value->IsTheHole(); | 
| +    bool is_function = value->IsSharedFunctionInfo(); | 
| +    bool is_module = value->IsJSObject(); | 
| +    ASSERT(is_var + is_const + is_function + is_module == 1); | 
| + | 
| +    if (is_var || is_const) { | 
| // Lookup the property in the global object, and don't set the | 
| // value of the variable if the property is already there. | 
| LookupResult lookup(isolate); | 
| @@ -1299,41 +1303,34 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_DeclareGlobals) { | 
| if (lookup.IsProperty()) { | 
| // We found an existing property. Unless it was an interceptor | 
| // that claims the property is absent, skip this declaration. | 
| -        if (lookup.type() != INTERCEPTOR) { | 
| -          continue; | 
| -        } | 
| +        if (lookup.type() != INTERCEPTOR) continue; | 
| PropertyAttributes attributes = global->GetPropertyAttribute(*name); | 
| -        if (attributes != ABSENT) { | 
| -          continue; | 
| -        } | 
| +        if (attributes != ABSENT) continue; | 
| // Fall-through and introduce the absent property by using | 
| // SetProperty. | 
| } | 
| -    } else { | 
| -      is_function_declaration = true; | 
| +    } else if (is_function) { | 
| // Copy the function and update its context. Use it as value. | 
| Handle<SharedFunctionInfo> shared = | 
| Handle<SharedFunctionInfo>::cast(value); | 
| Handle<JSFunction> function = | 
| -          isolate->factory()->NewFunctionFromSharedFunctionInfo(shared, | 
| -                                                                context, | 
| -                                                                TENURED); | 
| +          isolate->factory()->NewFunctionFromSharedFunctionInfo( | 
| +              shared, context, TENURED); | 
| value = function; | 
| } | 
|  | 
| LookupResult lookup(isolate); | 
| global->LocalLookup(*name, &lookup); | 
|  | 
| -    // Compute the property attributes. According to ECMA-262, section | 
| -    // 13, page 71, the property must be read-only and | 
| -    // non-deletable. However, neither SpiderMonkey nor KJS creates the | 
| -    // property as read-only, so we don't either. | 
| +    // Compute the property attributes. According to ECMA-262, | 
| +    // the property must be non-configurable except in eval. | 
| int attr = NONE; | 
| -    if (!DeclareGlobalsEvalFlag::decode(flags)) { | 
| +    bool is_eval = DeclareGlobalsEvalFlag::decode(flags); | 
| +    if (!is_eval || is_module) { | 
| attr |= DONT_DELETE; | 
| } | 
| bool is_native = DeclareGlobalsNativeFlag::decode(flags); | 
| -    if (is_const_property || (is_native && is_function_declaration)) { | 
| +    if (is_const || is_module || (is_native && is_function)) { | 
| attr |= READ_ONLY; | 
| } | 
|  | 
| @@ -1346,7 +1343,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_DeclareGlobals) { | 
| // handlers such as "function onload() {}". Firefox does call the | 
| // onload setter in those case and Safari does not. We follow | 
| // Safari for compatibility. | 
| -    if (is_function_declaration) { | 
| +    if (is_function || is_module) { | 
| if (lookup.IsProperty() && (lookup.type() != INTERCEPTOR)) { | 
| // Do not overwrite READ_ONLY properties. | 
| if (lookup.GetAttributes() & READ_ONLY) { | 
|  |