Commit e8ff3245 authored by ricow@chromium.org's avatar ricow@chromium.org

Follow Safari on not throwing when __defineGetter__ fails.

In addition, this fixes defineOwnProperty to actually not throw when
the should_throw flag is false (we had no usage of this priorly).

Review URL: http://codereview.chromium.org/6695018

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@7176 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 7cb35bcf
......@@ -255,7 +255,7 @@ function ObjectDefineGetter(name, fun) {
desc.setGet(fun);
desc.setEnumerable(true);
desc.setConfigurable(true);
DefineOwnProperty(ToObject(this), ToString(name), desc, true);
DefineOwnProperty(ToObject(this), ToString(name), desc, false);
}
......@@ -279,7 +279,7 @@ function ObjectDefineSetter(name, fun) {
desc.setSet(fun);
desc.setEnumerable(true);
desc.setConfigurable(true);
DefineOwnProperty(ToObject(this), ToString(name), desc, true);
DefineOwnProperty(ToObject(this), ToString(name), desc, false);
}
......@@ -573,8 +573,13 @@ function DefineOwnProperty(obj, p, desc, should_throw) {
// Error handling according to spec.
// Step 3
if (IS_UNDEFINED(current) && !extensible)
if (IS_UNDEFINED(current) && !extensible) {
if (should_throw) {
throw MakeTypeError("define_disallowed", ["defineProperty"]);
} else {
return;
}
}
if (!IS_UNDEFINED(current)) {
// Step 5 and 6
......@@ -599,31 +604,55 @@ function DefineOwnProperty(obj, p, desc, should_throw) {
if (desc.isConfigurable() ||
(desc.hasEnumerable() &&
desc.isEnumerable() != current.isEnumerable())) {
if (should_throw) {
throw MakeTypeError("redefine_disallowed", ["defineProperty"]);
} else {
return;
}
}
// Step 8
if (!IsGenericDescriptor(desc)) {
// Step 9a
if (IsDataDescriptor(current) != IsDataDescriptor(desc)) {
if (should_throw) {
throw MakeTypeError("redefine_disallowed", ["defineProperty"]);
} else {
return;
}
}
// Step 10a
if (IsDataDescriptor(current) && IsDataDescriptor(desc)) {
if (!current.isWritable() && desc.isWritable()) {
if (should_throw) {
throw MakeTypeError("redefine_disallowed", ["defineProperty"]);
} else {
return;
}
}
if (!current.isWritable() && desc.hasValue() &&
!SameValue(desc.getValue(), current.getValue())) {
if (should_throw) {
throw MakeTypeError("redefine_disallowed", ["defineProperty"]);
} else {
return;
}
}
}
// Step 11
if (IsAccessorDescriptor(desc) && IsAccessorDescriptor(current)) {
if (desc.hasSetter() && !SameValue(desc.getSet(), current.getSet())) {
if (should_throw) {
throw MakeTypeError("redefine_disallowed", ["defineProperty"]);
} else {
return;
}
}
if (desc.hasGetter() && !SameValue(desc.getGet(),current.getGet())) {
if (should_throw) {
throw MakeTypeError("redefine_disallowed", ["defineProperty"]);
} else {
return;
}
}
}
}
......
......@@ -32,55 +32,8 @@
var a = {};
Object.defineProperty(a, 'b',
{ get: function () { return 42; }, configurable: false });
try {
a.__defineGetter__('b', function _b(){ return 'foo'; });
assertUnreachable();
} catch (e) {
assertTrue(/Cannot redefine property/.test(e));
}
assertEquals(42, a.b);
var desc = Object.getOwnPropertyDescriptor(a, 'b');
assertFalse(desc.configurable);
// Copyright 2011 the V8 project authors. All rights reserved.
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following
// disclaimer in the documentation and/or other materials provided
// with the distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived
// from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// This regression tests that we are not allowed to overwrite an existing
// non-configurable getter with a new getter. In addition, we should not
// be able to change the configurable flag from false to true.
var a = {};
Object.defineProperty(a, 'b',
{ get: function () { return 42; }, configurable: false });
try {
a.__defineGetter__('b', function _b(){ return 'foo'; });
assertUnreachable();
} catch (e) {
assertTrue(/Cannot redefine property/.test(e));
}
// Do not allow us to redefine b on a.
a.__defineGetter__('b', function _b(){ return 'foo'; });
assertEquals(42, a.b);
var desc = Object.getOwnPropertyDescriptor(a, 'b');
assertFalse(desc.configurable);
......@@ -745,12 +745,6 @@ js1_5/extensions/regress-342960: FAIL_OK || TIMEOUT if $mode == debug
# error message in debug mode.
js1_5/extensions/regress-336410-1: FAIL_OK || TIMEOUT if ($mode == debug && $arch == x64)
# These tests also fails in firefox 4 beta and is disabled in the firefox
# test manifest.
js1_5/extensions/regress-313500: FAIL_OK
js1_5/extensions/regress-325269: FAIL_OK
##################### DECOMPILATION TESTS #####################
# We don't really about the outcome of running the
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment