Index: src/runtime.cc |
diff --git a/src/runtime.cc b/src/runtime.cc |
index 9d3bb1d83b567480be63d4e4a355beecc636441e..d1fe1c7c1675377ead4e8d7bdc8d7717630abe07 100644 |
--- a/src/runtime.cc |
+++ b/src/runtime.cc |
@@ -1149,22 +1149,14 @@ static Failure* ThrowRedeclarationError(Isolate* isolate, |
RUNTIME_FUNCTION(MaybeObject*, Runtime_DeclareGlobals) { |
- ASSERT(args.length() == 4); |
+ ASSERT(args.length() == 3); |
HandleScope scope(isolate); |
Handle<GlobalObject> global = Handle<GlobalObject>( |
isolate->context()->global()); |
Handle<Context> context = args.at<Context>(0); |
CONVERT_ARG_CHECKED(FixedArray, pairs, 1); |
- bool is_eval = args.smi_at(2) == 1; |
- StrictModeFlag strict_mode = static_cast<StrictModeFlag>(args.smi_at(3)); |
- ASSERT(strict_mode == kStrictMode || strict_mode == kNonStrictMode); |
- |
- // 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. |
- PropertyAttributes base = is_eval ? NONE : DONT_DELETE; |
+ CONVERT_SMI_ARG_CHECKED(flags, 2); |
// Traverse the name/value pairs and set the properties. |
int length = pairs->length(); |
@@ -1177,7 +1169,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_DeclareGlobals) { |
// 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) { |
// Lookup the property in the global object, and don't set the |
// value of the variable if the property is already there. |
@@ -1226,6 +1218,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_DeclareGlobals) { |
} |
} |
} else { |
+ is_function_declaration = true; |
// Copy the function and update its context. Use it as value. |
Handle<SharedFunctionInfo> shared = |
Handle<SharedFunctionInfo>::cast(value); |
@@ -1239,10 +1232,6 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_DeclareGlobals) { |
LookupResult lookup; |
global->LocalLookup(*name, &lookup); |
- PropertyAttributes attributes = is_const_property |
- ? static_cast<PropertyAttributes>(base | READ_ONLY) |
- : base; |
- |
// There's a local property that we need to overwrite because |
// we're either declaring a function or there's an interceptor |
// that claims the property is absent. |
@@ -1257,6 +1246,19 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_DeclareGlobals) { |
return ThrowRedeclarationError(isolate, type, name); |
} |
+ // 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. |
+ int attr = NONE; |
+ if ((flags & kDeclareGlobalsEvalFlag) == 0) { |
+ attr |= DONT_DELETE; |
+ } |
+ bool is_native = (flags & kDeclareGlobalsNativeFlag) != 0; |
+ if (is_const_property || (is_native && is_function_declaration)) { |
+ attr |= READ_ONLY; |
+ } |
+ |
// Safari does not allow the invocation of callback setters for |
// function declarations. To mimic this behavior, we do not allow |
// the invocation of setters for function values. This makes a |
@@ -1267,20 +1269,24 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_DeclareGlobals) { |
if (value->IsJSFunction()) { |
// Do not change DONT_DELETE to false from true. |
if (lookup.IsProperty() && (lookup.type() != INTERCEPTOR)) { |
- attributes = static_cast<PropertyAttributes>( |
- attributes | (lookup.GetAttributes() & DONT_DELETE)); |
+ attr |= lookup.GetAttributes() & DONT_DELETE; |
} |
+ PropertyAttributes attributes = static_cast<PropertyAttributes>(attr); |
+ |
RETURN_IF_EMPTY_HANDLE(isolate, |
SetLocalPropertyIgnoreAttributes(global, |
name, |
value, |
attributes)); |
} else { |
+ StrictModeFlag strict_mode = |
+ ((flags & kDeclareGlobalsStrictModeFlag) != 0) ? kStrictMode |
+ : kNonStrictMode; |
RETURN_IF_EMPTY_HANDLE(isolate, |
SetProperty(global, |
name, |
value, |
- attributes, |
+ static_cast<PropertyAttributes>(attr), |
strict_mode)); |
} |
} |