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

Unified Diff: src/runtime.cc

Issue 7811015: Change global const handling to silently ignore redeclarations (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
« no previous file with comments | « no previous file | src/v8natives.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/runtime.cc
diff --git a/src/runtime.cc b/src/runtime.cc
index 9d3bb1d83b567480be63d4e4a355beecc636441e..2f8f8a299720ac7a82a72cd0a72503952d4cb2a3 100644
--- a/src/runtime.cc
+++ b/src/runtime.cc
@@ -1184,44 +1184,12 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_DeclareGlobals) {
LookupResult lookup;
global->Lookup(*name, &lookup);
if (lookup.IsProperty()) {
- // Determine if the property is local by comparing the holder
- // against the global object. The information will be used to
- // avoid throwing re-declaration errors when declaring
- // variables or constants that exist in the prototype chain.
- bool is_local = (*global == lookup.holder());
- // Get the property attributes and determine if the property is
- // read-only.
PropertyAttributes attributes = global->GetPropertyAttribute(*name);
Kevin Millikin (Chromium) 2011/09/08 12:06:02 I think you could probably simplify this code a bi
Jakob Kummerow 2011/09/09 15:42:43 Done.
- bool is_read_only = (attributes & READ_ONLY) != 0;
- if (lookup.type() == INTERCEPTOR) {
- // If the interceptor says the property is there, we
- // just return undefined without overwriting the property.
- // Otherwise, we continue to setting the property.
- if (attributes != ABSENT) {
- // Check if the existing property conflicts with regards to const.
- if (is_local && (is_read_only || is_const_property)) {
- const char* type = (is_read_only) ? "const" : "var";
- return ThrowRedeclarationError(isolate, type, name);
- };
- // The property already exists without conflicting: Go to
- // the next declaration.
- continue;
- }
+ if (lookup.type() == INTERCEPTOR && attributes == ABSENT) {
// Fall-through and introduce the absent property by using
// SetProperty.
} else {
- // For const properties, we treat a callback with this name
- // even in the prototype as a conflicting declaration.
- if (is_const_property && (lookup.type() == CALLBACKS)) {
- return ThrowRedeclarationError(isolate, "const", name);
- }
- // Otherwise, we check for locally conflicting declarations.
- if (is_local && (is_read_only || is_const_property)) {
- const char* type = (is_read_only) ? "const" : "var";
- return ThrowRedeclarationError(isolate, type, name);
- }
- // The property already exists without conflicting: Go to
- // the next declaration.
+ // The property already exists: Go to the next declaration.
continue;
}
}
@@ -1253,8 +1221,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_DeclareGlobals) {
if (lookup.IsProperty() &&
(lookup.type() != INTERCEPTOR) &&
(lookup.IsReadOnly() || is_const_property)) {
- const char* type = (lookup.IsReadOnly()) ? "const" : "var";
- return ThrowRedeclarationError(isolate, type, name);
+ continue;
Kevin Millikin (Chromium) 2011/09/08 12:06:02 I don't think this is what we intend. Won't we sk
Jakob Kummerow 2011/09/09 15:42:43 Done.
}
// Safari does not allow the invocation of callback setters for
@@ -1434,7 +1401,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_InitializeVarGlobal) {
// If we found readonly property on one of hidden prototypes,
// just shadow it.
if (real_holder != isolate->context()->global()) break;
- return ThrowRedeclarationError(isolate, "const", name);
+ return isolate->heap()->undefined_value();
}
// Determine if this is a redeclaration of an intercepted read-only
@@ -1451,12 +1418,11 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_InitializeVarGlobal) {
// make sure to introduce it.
found = false;
} else if ((intercepted & READ_ONLY) != 0) {
- // The property is present, but read-only. Since we're trying to
- // overwrite it with a variable declaration we must throw a
- // re-declaration error. However if we found readonly property
+ // The property is present, but read-only, so we ignore the
+ // re-declaration. However if we found readonly property
// on one of hidden prototypes, just shadow it.
if (real_holder != isolate->context()->global()) break;
- return ThrowRedeclarationError(isolate, "const", name);
+ return isolate->heap()->undefined_value();
}
}
@@ -1524,15 +1490,15 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_InitializeConstGlobal) {
// need to ask it for the property attributes.
if (!lookup.IsReadOnly()) {
if (lookup.type() != INTERCEPTOR) {
- return ThrowRedeclarationError(isolate, "var", name);
+ return isolate->heap()->undefined_value();
Kevin Millikin (Chromium) 2011/09/08 12:06:02 I'm not sure this is our intended semantics. Do w
Jakob Kummerow 2011/09/09 15:42:43 Done.
}
PropertyAttributes intercepted = global->GetPropertyAttribute(*name);
- // Throw re-declaration error if the intercepted property is present
+ // Ignore the re-declaration if the intercepted property is present
// but not read-only.
if (intercepted != ABSENT && (intercepted & READ_ONLY) == 0) {
- return ThrowRedeclarationError(isolate, "var", name);
+ return isolate->heap()->undefined_value();
}
// Restore global object from context (in case of GC) and continue
« no previous file with comments | « no previous file | src/v8natives.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698