Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(183)

Unified Diff: src/runtime.cc

Issue 7736018: Make functions on the built-in object non-writable. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 9 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/runtime.cc
diff --git a/src/runtime.cc b/src/runtime.cc
index 802fd6845d0204cabeba1de5cd070261ebbf3e66..b8885124d95951c1963795ddf3dc027b0660e03d 100644
--- a/src/runtime.cc
+++ b/src/runtime.cc
@@ -1149,16 +1149,19 @@ 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);
+ CONVERT_SMI_ARG_CHECKED(flags, 2);
+ bool is_eval = (flags & kDeclareGlobalsEvalFlag) != 0;
Kevin Millikin (Chromium) 2011/09/01 07:58:24 These flags and 'base' below are declared a away f
Lasse Reichstein 2011/09/01 09:26:58 Done.
+ StrictModeFlag strict_mode =
+ ((flags & kDeclareGlobalsStrictModeFlag) != 0) ? kStrictMode
+ : kNonStrictMode;
+ bool is_native = (flags & kDeclareGlobalsNativeFlag) != 0;
// Compute the property attributes. According to ECMA-262, section
// 13, page 71, the property must be read-only and
@@ -1177,7 +1180,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 +1229,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,7 +1243,8 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_DeclareGlobals) {
LookupResult lookup;
global->LocalLookup(*name, &lookup);
- PropertyAttributes attributes = is_const_property
+ PropertyAttributes attributes =
Kevin Millikin (Chromium) 2011/09/01 07:58:24 Here, you could just get rid of base and have the
Lasse Reichstein 2011/09/01 09:26:58 Good idea. Done!
+ (is_const_property || (is_native && is_function_declaration))
? static_cast<PropertyAttributes>(base | READ_ONLY)
: base;

Powered by Google App Engine
This is Rietveld 408576698