1bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com// Copyright 2012 the V8 project authors. All rights reserved.
25c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Redistribution and use in source and binary forms, with or without
35c838251403b0be9a882540f1922577abba4c872ager@chromium.org// modification, are permitted provided that the following conditions are
45c838251403b0be9a882540f1922577abba4c872ager@chromium.org// met:
55c838251403b0be9a882540f1922577abba4c872ager@chromium.org//
65c838251403b0be9a882540f1922577abba4c872ager@chromium.org//     * Redistributions of source code must retain the above copyright
75c838251403b0be9a882540f1922577abba4c872ager@chromium.org//       notice, this list of conditions and the following disclaimer.
85c838251403b0be9a882540f1922577abba4c872ager@chromium.org//     * Redistributions in binary form must reproduce the above
95c838251403b0be9a882540f1922577abba4c872ager@chromium.org//       copyright notice, this list of conditions and the following
105c838251403b0be9a882540f1922577abba4c872ager@chromium.org//       disclaimer in the documentation and/or other materials provided
115c838251403b0be9a882540f1922577abba4c872ager@chromium.org//       with the distribution.
125c838251403b0be9a882540f1922577abba4c872ager@chromium.org//     * Neither the name of Google Inc. nor the names of its
135c838251403b0be9a882540f1922577abba4c872ager@chromium.org//       contributors may be used to endorse or promote products derived
145c838251403b0be9a882540f1922577abba4c872ager@chromium.org//       from this software without specific prior written permission.
155c838251403b0be9a882540f1922577abba4c872ager@chromium.org//
165c838251403b0be9a882540f1922577abba4c872ager@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
175c838251403b0be9a882540f1922577abba4c872ager@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
185c838251403b0be9a882540f1922577abba4c872ager@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
195c838251403b0be9a882540f1922577abba4c872ager@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
205c838251403b0be9a882540f1922577abba4c872ager@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
215c838251403b0be9a882540f1922577abba4c872ager@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
225c838251403b0be9a882540f1922577abba4c872ager@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
235c838251403b0be9a882540f1922577abba4c872ager@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
245c838251403b0be9a882540f1922577abba4c872ager@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
255c838251403b0be9a882540f1922577abba4c872ager@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
265c838251403b0be9a882540f1922577abba4c872ager@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
275c838251403b0be9a882540f1922577abba4c872ager@chromium.org
285c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Tests the object.defineProperty method - ES 15.2.3.6
295c838251403b0be9a882540f1922577abba4c872ager@chromium.org
3012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Flags: --allow-natives-syntax
315c838251403b0be9a882540f1922577abba4c872ager@chromium.org
325c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Check that an exception is thrown when null is passed as object.
33d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.orgvar exception = false;
345c838251403b0be9a882540f1922577abba4c872ager@chromium.orgtry {
355c838251403b0be9a882540f1922577abba4c872ager@chromium.org  Object.defineProperty(null, null, null);
365c838251403b0be9a882540f1922577abba4c872ager@chromium.org} catch (e) {
37d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org  exception = true;
385c838251403b0be9a882540f1922577abba4c872ager@chromium.org  assertTrue(/called on non-object/.test(e));
395c838251403b0be9a882540f1922577abba4c872ager@chromium.org}
40d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.orgassertTrue(exception);
415c838251403b0be9a882540f1922577abba4c872ager@chromium.org
425c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Check that an exception is thrown when undefined is passed as object.
43d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.orgexception = false;
445c838251403b0be9a882540f1922577abba4c872ager@chromium.orgtry {
455c838251403b0be9a882540f1922577abba4c872ager@chromium.org  Object.defineProperty(undefined, undefined, undefined);
465c838251403b0be9a882540f1922577abba4c872ager@chromium.org} catch (e) {
47d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org  exception = true;
485c838251403b0be9a882540f1922577abba4c872ager@chromium.org  assertTrue(/called on non-object/.test(e));
495c838251403b0be9a882540f1922577abba4c872ager@chromium.org}
50d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.orgassertTrue(exception);
515c838251403b0be9a882540f1922577abba4c872ager@chromium.org
525c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Check that an exception is thrown when non-object is passed as object.
53d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.orgexception = false;
545c838251403b0be9a882540f1922577abba4c872ager@chromium.orgtry {
555c838251403b0be9a882540f1922577abba4c872ager@chromium.org  Object.defineProperty(0, "foo", undefined);
565c838251403b0be9a882540f1922577abba4c872ager@chromium.org} catch (e) {
57d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org  exception = true;
585c838251403b0be9a882540f1922577abba4c872ager@chromium.org  assertTrue(/called on non-object/.test(e));
595c838251403b0be9a882540f1922577abba4c872ager@chromium.org}
60d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.orgassertTrue(exception);
615c838251403b0be9a882540f1922577abba4c872ager@chromium.org
629155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org// Object.
635c838251403b0be9a882540f1922577abba4c872ager@chromium.orgvar obj1 = {};
645c838251403b0be9a882540f1922577abba4c872ager@chromium.org
659155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org// Values.
665c838251403b0be9a882540f1922577abba4c872ager@chromium.orgvar val1 = 0;
675c838251403b0be9a882540f1922577abba4c872ager@chromium.orgvar val2 = 0;
685c838251403b0be9a882540f1922577abba4c872ager@chromium.orgvar val3 = 0;
695c838251403b0be9a882540f1922577abba4c872ager@chromium.org
709155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgfunction setter1() {val1++; }
719155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgfunction getter1() {return val1; }
729155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
739155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgfunction setter2() {val2++; }
749155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgfunction getter2() {return val2; }
759155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
769155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgfunction setter3() {val3++; }
779155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgfunction getter3() {return val3; }
789155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
799155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
809155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org// Descriptors.
815c838251403b0be9a882540f1922577abba4c872ager@chromium.orgvar emptyDesc = {};
825c838251403b0be9a882540f1922577abba4c872ager@chromium.org
835f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgvar accessorConfigurable = {
849155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org    set: setter1,
859155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org    get: getter1,
865c838251403b0be9a882540f1922577abba4c872ager@chromium.org    configurable: true
875c838251403b0be9a882540f1922577abba4c872ager@chromium.org};
885c838251403b0be9a882540f1922577abba4c872ager@chromium.org
895c838251403b0be9a882540f1922577abba4c872ager@chromium.orgvar accessorNoConfigurable = {
909155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org    set: setter2,
919155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org    get: getter2,
925f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org    configurable: false
935c838251403b0be9a882540f1922577abba4c872ager@chromium.org};
945c838251403b0be9a882540f1922577abba4c872ager@chromium.org
955c838251403b0be9a882540f1922577abba4c872ager@chromium.orgvar accessorOnlySet = {
969155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  set: setter3,
975c838251403b0be9a882540f1922577abba4c872ager@chromium.org  configurable: true
985c838251403b0be9a882540f1922577abba4c872ager@chromium.org};
995c838251403b0be9a882540f1922577abba4c872ager@chromium.org
1005c838251403b0be9a882540f1922577abba4c872ager@chromium.orgvar accessorOnlyGet = {
1019155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  get: getter3,
1025c838251403b0be9a882540f1922577abba4c872ager@chromium.org  configurable: true
1035c838251403b0be9a882540f1922577abba4c872ager@chromium.org};
1045c838251403b0be9a882540f1922577abba4c872ager@chromium.org
1055c838251403b0be9a882540f1922577abba4c872ager@chromium.orgvar accessorDefault = {set: function(){} };
1065c838251403b0be9a882540f1922577abba4c872ager@chromium.org
1075c838251403b0be9a882540f1922577abba4c872ager@chromium.orgvar dataConfigurable = { value: 1000, configurable: true };
1085c838251403b0be9a882540f1922577abba4c872ager@chromium.org
1095c838251403b0be9a882540f1922577abba4c872ager@chromium.orgvar dataNoConfigurable = { value: 2000, configurable: false };
1105c838251403b0be9a882540f1922577abba4c872ager@chromium.org
1115c838251403b0be9a882540f1922577abba4c872ager@chromium.orgvar dataWritable = { value: 3000, writable: true};
1125c838251403b0be9a882540f1922577abba4c872ager@chromium.org
1135c838251403b0be9a882540f1922577abba4c872ager@chromium.org
1145c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Check that we can't add property with undefined attributes.
1155c838251403b0be9a882540f1922577abba4c872ager@chromium.orgtry {
1165c838251403b0be9a882540f1922577abba4c872ager@chromium.org  Object.defineProperty(obj1, "foo", undefined);
1175c838251403b0be9a882540f1922577abba4c872ager@chromium.org  assertTrue(false);
1185c838251403b0be9a882540f1922577abba4c872ager@chromium.org} catch (e) {
1195c838251403b0be9a882540f1922577abba4c872ager@chromium.org  assertTrue(/must be an object/.test(e));
1205c838251403b0be9a882540f1922577abba4c872ager@chromium.org}
1215c838251403b0be9a882540f1922577abba4c872ager@chromium.org
1225c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Make sure that we can add a property with an empty descriptor and
1235c838251403b0be9a882540f1922577abba4c872ager@chromium.org// that it has the default descriptor values.
1245c838251403b0be9a882540f1922577abba4c872ager@chromium.orgObject.defineProperty(obj1, "foo", emptyDesc);
1255c838251403b0be9a882540f1922577abba4c872ager@chromium.org
1265c838251403b0be9a882540f1922577abba4c872ager@chromium.org// foo should be undefined as it has no get, set or value
1275c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(undefined, obj1.foo);
1285c838251403b0be9a882540f1922577abba4c872ager@chromium.org
1295c838251403b0be9a882540f1922577abba4c872ager@chromium.org// We should, however, be able to retrieve the propertydescriptor which should
1305c838251403b0be9a882540f1922577abba4c872ager@chromium.org// have all default values (according to 8.6.1).
1315c838251403b0be9a882540f1922577abba4c872ager@chromium.orgvar desc = Object.getOwnPropertyDescriptor(obj1, "foo");
1325c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertFalse(desc.configurable);
1335c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertFalse(desc.enumerable);
1345c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertFalse(desc.writable);
1355c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.get, undefined);
1365c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.set, undefined);
1375c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.value, undefined);
1385c838251403b0be9a882540f1922577abba4c872ager@chromium.org
1395c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Make sure that getOwnPropertyDescriptor does not return a descriptor
1405c838251403b0be9a882540f1922577abba4c872ager@chromium.org// with default values if called with non existing property (otherwise
1415c838251403b0be9a882540f1922577abba4c872ager@chromium.org// the test above is invalid).
1425c838251403b0be9a882540f1922577abba4c872ager@chromium.orgdesc = Object.getOwnPropertyDescriptor(obj1, "bar");
1435c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc, undefined);
1445c838251403b0be9a882540f1922577abba4c872ager@chromium.org
1455c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Make sure that foo can't be reset (as configurable is false).
1465c838251403b0be9a882540f1922577abba4c872ager@chromium.orgtry {
1475c838251403b0be9a882540f1922577abba4c872ager@chromium.org  Object.defineProperty(obj1, "foo", accessorConfigurable);
1485c838251403b0be9a882540f1922577abba4c872ager@chromium.org} catch (e) {
1495c838251403b0be9a882540f1922577abba4c872ager@chromium.org  assertTrue(/Cannot redefine property/.test(e));
1505c838251403b0be9a882540f1922577abba4c872ager@chromium.org}
1515c838251403b0be9a882540f1922577abba4c872ager@chromium.org
1525c838251403b0be9a882540f1922577abba4c872ager@chromium.org
1535c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Accessor properties
1545c838251403b0be9a882540f1922577abba4c872ager@chromium.org
1555c838251403b0be9a882540f1922577abba4c872ager@chromium.orgObject.defineProperty(obj1, "bar", accessorConfigurable);
1565c838251403b0be9a882540f1922577abba4c872ager@chromium.orgdesc = Object.getOwnPropertyDescriptor(obj1, "bar");
1575c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertTrue(desc.configurable);
1585c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertFalse(desc.enumerable);
1595c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.writable, undefined);
1605c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.get, accessorConfigurable.get);
1615c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.set, accessorConfigurable.set);
1625c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.value, undefined);
1635c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(1, obj1.bar = 1);
1645c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(1, val1);
1655c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(1, obj1.bar = 1);
1665c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(2, val1);
1675c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(2, obj1.bar);
1685c838251403b0be9a882540f1922577abba4c872ager@chromium.org
1695c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Redefine bar with non configurable test
1705c838251403b0be9a882540f1922577abba4c872ager@chromium.orgObject.defineProperty(obj1, "bar", accessorNoConfigurable);
1715c838251403b0be9a882540f1922577abba4c872ager@chromium.orgdesc = Object.getOwnPropertyDescriptor(obj1, "bar");
1725c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertFalse(desc.configurable);
1735c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertFalse(desc.enumerable);
1745c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.writable, undefined);
1755c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.get, accessorNoConfigurable.get);
1765c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.set, accessorNoConfigurable.set);
1775c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.value, undefined);
1785c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(1, obj1.bar = 1);
1795c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(2, val1);
1805c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(1, val2);
1815c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(1, obj1.bar = 1)
1825c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(2, val1);
1835c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(2, val2);
1845c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(2, obj1.bar);
1855c838251403b0be9a882540f1922577abba4c872ager@chromium.org
1865c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Try to redefine bar again - should fail as configurable is false.
1875c838251403b0be9a882540f1922577abba4c872ager@chromium.orgtry {
1885c838251403b0be9a882540f1922577abba4c872ager@chromium.org  Object.defineProperty(obj1, "bar", accessorConfigurable);
1895c838251403b0be9a882540f1922577abba4c872ager@chromium.org  assertTrue(false);
1905c838251403b0be9a882540f1922577abba4c872ager@chromium.org} catch(e) {
1915c838251403b0be9a882540f1922577abba4c872ager@chromium.org  assertTrue(/Cannot redefine property/.test(e));
1925c838251403b0be9a882540f1922577abba4c872ager@chromium.org}
1935c838251403b0be9a882540f1922577abba4c872ager@chromium.org
1945c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Try to redefine bar again using the data descriptor - should fail.
1955c838251403b0be9a882540f1922577abba4c872ager@chromium.orgtry {
1965c838251403b0be9a882540f1922577abba4c872ager@chromium.org  Object.defineProperty(obj1, "bar", dataConfigurable);
1975c838251403b0be9a882540f1922577abba4c872ager@chromium.org  assertTrue(false);
1985c838251403b0be9a882540f1922577abba4c872ager@chromium.org} catch(e) {
1995c838251403b0be9a882540f1922577abba4c872ager@chromium.org  assertTrue(/Cannot redefine property/.test(e));
2005c838251403b0be9a882540f1922577abba4c872ager@chromium.org}
2015c838251403b0be9a882540f1922577abba4c872ager@chromium.org
2025c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Redefine using same descriptor - should succeed.
2035c838251403b0be9a882540f1922577abba4c872ager@chromium.orgObject.defineProperty(obj1, "bar", accessorNoConfigurable);
2045c838251403b0be9a882540f1922577abba4c872ager@chromium.orgdesc = Object.getOwnPropertyDescriptor(obj1, "bar");
2055c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertFalse(desc.configurable);
2065c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertFalse(desc.enumerable);
2075c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.writable, undefined);
2085c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.get, accessorNoConfigurable.get);
2095c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.set, accessorNoConfigurable.set);
2105c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.value, undefined);
2115c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(1, obj1.bar = 1);
2125c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(2, val1);
2135c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(3, val2);
2145c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(1, obj1.bar = 1)
2155c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(2, val1);
2165c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(4, val2);
2175c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(4, obj1.bar);
2185c838251403b0be9a882540f1922577abba4c872ager@chromium.org
2199155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org// Define an accessor that has only a setter.
2205c838251403b0be9a882540f1922577abba4c872ager@chromium.orgObject.defineProperty(obj1, "setOnly", accessorOnlySet);
2215c838251403b0be9a882540f1922577abba4c872ager@chromium.orgdesc = Object.getOwnPropertyDescriptor(obj1, "setOnly");
2225c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertTrue(desc.configurable);
2235c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertFalse(desc.enumerable);
2245c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.set, accessorOnlySet.set);
2255c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.writable, undefined);
2265c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.value, undefined);
2275c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.get, undefined);
2285c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(1, obj1.setOnly = 1);
2295c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(1, val3);
2305c838251403b0be9a882540f1922577abba4c872ager@chromium.org
2319155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org// Add a getter - should not touch the setter.
2325c838251403b0be9a882540f1922577abba4c872ager@chromium.orgObject.defineProperty(obj1, "setOnly", accessorOnlyGet);
2335c838251403b0be9a882540f1922577abba4c872ager@chromium.orgdesc = Object.getOwnPropertyDescriptor(obj1, "setOnly");
2345c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertTrue(desc.configurable);
2355c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertFalse(desc.enumerable);
2365c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.get, accessorOnlyGet.get);
2375c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.set, accessorOnlySet.set);
2385c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.writable, undefined);
2395c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.value, undefined);
2405c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(1, obj1.setOnly = 1);
2415c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(2, val3);
2425c838251403b0be9a882540f1922577abba4c872ager@chromium.org
2435f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org// The above should also work if redefining just a getter or setter on
2445c838251403b0be9a882540f1922577abba4c872ager@chromium.org// an existing property with both a getter and a setter.
2455c838251403b0be9a882540f1922577abba4c872ager@chromium.orgObject.defineProperty(obj1, "both", accessorConfigurable);
2465c838251403b0be9a882540f1922577abba4c872ager@chromium.org
2475c838251403b0be9a882540f1922577abba4c872ager@chromium.orgObject.defineProperty(obj1, "both", accessorOnlySet);
2485c838251403b0be9a882540f1922577abba4c872ager@chromium.orgdesc = Object.getOwnPropertyDescriptor(obj1, "both");
2495c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertTrue(desc.configurable);
2505c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertFalse(desc.enumerable);
2515c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.set, accessorOnlySet.set);
2525c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.get, accessorConfigurable.get);
2535c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.writable, undefined);
2545c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.value, undefined);
2555c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(1, obj1.both = 1);
2565c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(3, val3);
2575c838251403b0be9a882540f1922577abba4c872ager@chromium.org
2585c838251403b0be9a882540f1922577abba4c872ager@chromium.org
2595c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Data properties
2605c838251403b0be9a882540f1922577abba4c872ager@chromium.org
2615c838251403b0be9a882540f1922577abba4c872ager@chromium.orgObject.defineProperty(obj1, "foobar", dataConfigurable);
2625c838251403b0be9a882540f1922577abba4c872ager@chromium.orgdesc = Object.getOwnPropertyDescriptor(obj1, "foobar");
2635c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(obj1.foobar, 1000);
2645c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.value, 1000);
2655c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertTrue(desc.configurable);
2665c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertFalse(desc.writable);
2675c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertFalse(desc.enumerable);
2685c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.get, undefined);
2695c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.set, undefined);
2705c838251403b0be9a882540f1922577abba4c872ager@chromium.org//Try writing to non writable attribute - should remain 1000
2715c838251403b0be9a882540f1922577abba4c872ager@chromium.orgobj1.foobar = 1001;
2725c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(obj1.foobar, 1000);
2735c838251403b0be9a882540f1922577abba4c872ager@chromium.org
2745c838251403b0be9a882540f1922577abba4c872ager@chromium.org
2759155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org// Redefine to writable descriptor - now writing to foobar should be allowed.
2765c838251403b0be9a882540f1922577abba4c872ager@chromium.orgObject.defineProperty(obj1, "foobar", dataWritable);
2775c838251403b0be9a882540f1922577abba4c872ager@chromium.orgdesc = Object.getOwnPropertyDescriptor(obj1, "foobar");
2785c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(obj1.foobar, 3000);
2795c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.value, 3000);
2805c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Note that since dataWritable does not define configurable the configurable
2815c838251403b0be9a882540f1922577abba4c872ager@chromium.org// setting from the redefined property (in this case true) is used.
2825c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertTrue(desc.configurable);
2835c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertTrue(desc.writable);
2845c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertFalse(desc.enumerable);
2855c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.get, undefined);
2865c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.set, undefined);
2875c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Writing to the property should now be allowed
2885c838251403b0be9a882540f1922577abba4c872ager@chromium.orgobj1.foobar = 1001;
2895c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(obj1.foobar, 1001);
2905c838251403b0be9a882540f1922577abba4c872ager@chromium.org
2915c838251403b0be9a882540f1922577abba4c872ager@chromium.org
2925c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Redefine with non configurable data property.
2935c838251403b0be9a882540f1922577abba4c872ager@chromium.orgObject.defineProperty(obj1, "foobar", dataNoConfigurable);
2945c838251403b0be9a882540f1922577abba4c872ager@chromium.orgdesc = Object.getOwnPropertyDescriptor(obj1, "foobar");
2955c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(obj1.foobar, 2000);
2965c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.value, 2000);
2975c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertFalse(desc.configurable);
2989155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgassertTrue(desc.writable);
2995c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertFalse(desc.enumerable);
3005c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.get, undefined);
3015c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.set, undefined);
3025c838251403b0be9a882540f1922577abba4c872ager@chromium.org
3035c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Try redefine again - shold fail because configurable is now false.
3045c838251403b0be9a882540f1922577abba4c872ager@chromium.orgtry {
3055c838251403b0be9a882540f1922577abba4c872ager@chromium.org  Object.defineProperty(obj1, "foobar", dataConfigurable);
3065c838251403b0be9a882540f1922577abba4c872ager@chromium.org  assertTrue(false);
3075c838251403b0be9a882540f1922577abba4c872ager@chromium.org} catch (e) {
3085c838251403b0be9a882540f1922577abba4c872ager@chromium.org  assertTrue(/Cannot redefine property/.test(e));
3095c838251403b0be9a882540f1922577abba4c872ager@chromium.org}
3105c838251403b0be9a882540f1922577abba4c872ager@chromium.org
3115c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Try redefine again with accessor property - shold also fail.
3125c838251403b0be9a882540f1922577abba4c872ager@chromium.orgtry {
3135c838251403b0be9a882540f1922577abba4c872ager@chromium.org  Object.defineProperty(obj1, "foobar", dataConfigurable);
3145c838251403b0be9a882540f1922577abba4c872ager@chromium.org  assertTrue(false);
3155c838251403b0be9a882540f1922577abba4c872ager@chromium.org} catch (e) {
3165c838251403b0be9a882540f1922577abba4c872ager@chromium.org  assertTrue(/Cannot redefine property/.test(e));
3175c838251403b0be9a882540f1922577abba4c872ager@chromium.org}
3185c838251403b0be9a882540f1922577abba4c872ager@chromium.org
3195c838251403b0be9a882540f1922577abba4c872ager@chromium.org
3205c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Redifine with the same descriptor - should succeed (step 6).
3215c838251403b0be9a882540f1922577abba4c872ager@chromium.orgObject.defineProperty(obj1, "foobar", dataNoConfigurable);
3225c838251403b0be9a882540f1922577abba4c872ager@chromium.orgdesc = Object.getOwnPropertyDescriptor(obj1, "foobar");
3235c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(obj1.foobar, 2000);
3245c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.value, 2000);
3255c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertFalse(desc.configurable);
3269155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgassertTrue(desc.writable);
3275c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertFalse(desc.enumerable);
3285c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.get, undefined);
3295c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.set, undefined);
3305c838251403b0be9a882540f1922577abba4c872ager@chromium.org
3315c838251403b0be9a882540f1922577abba4c872ager@chromium.org
3325c838251403b0be9a882540f1922577abba4c872ager@chromium.org// New object
3335c838251403b0be9a882540f1922577abba4c872ager@chromium.orgvar obj2 = {};
3345c838251403b0be9a882540f1922577abba4c872ager@chromium.org
3355c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Make accessor - redefine to data
3365c838251403b0be9a882540f1922577abba4c872ager@chromium.orgObject.defineProperty(obj2, "foo", accessorConfigurable);
3375c838251403b0be9a882540f1922577abba4c872ager@chromium.org
3385c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Redefine to data property
3395c838251403b0be9a882540f1922577abba4c872ager@chromium.orgObject.defineProperty(obj2, "foo", dataConfigurable);
3405c838251403b0be9a882540f1922577abba4c872ager@chromium.orgdesc = Object.getOwnPropertyDescriptor(obj2, "foo");
3415c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(obj2.foo, 1000);
3425c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.value, 1000);
3435c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertTrue(desc.configurable);
3445c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertFalse(desc.writable);
3455c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertFalse(desc.enumerable);
3465c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.get, undefined);
3475c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.set, undefined);
3485c838251403b0be9a882540f1922577abba4c872ager@chromium.org
3495c838251403b0be9a882540f1922577abba4c872ager@chromium.org
3505c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Redefine back to accessor
3515c838251403b0be9a882540f1922577abba4c872ager@chromium.orgObject.defineProperty(obj2, "foo", accessorConfigurable);
3525c838251403b0be9a882540f1922577abba4c872ager@chromium.orgdesc = Object.getOwnPropertyDescriptor(obj2, "foo");
3535c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertTrue(desc.configurable);
3545c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertFalse(desc.enumerable);
3555c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.writable, undefined);
3565c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.get, accessorConfigurable.get);
3575c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.set, accessorConfigurable.set);
3585c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.value, undefined);
3595c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(1, obj2.foo = 1);
3605c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(3, val1);
3615c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(4, val2);
3625c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(3, obj2.foo);
3635c838251403b0be9a882540f1922577abba4c872ager@chromium.org
3645c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Make data - redefine to accessor
3655c838251403b0be9a882540f1922577abba4c872ager@chromium.orgObject.defineProperty(obj2, "bar", dataConfigurable)
3665c838251403b0be9a882540f1922577abba4c872ager@chromium.org
3675c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Redefine to accessor property
3685c838251403b0be9a882540f1922577abba4c872ager@chromium.orgObject.defineProperty(obj2, "bar", accessorConfigurable);
3695c838251403b0be9a882540f1922577abba4c872ager@chromium.orgdesc = Object.getOwnPropertyDescriptor(obj2, "bar");
3705c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertTrue(desc.configurable);
3715c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertFalse(desc.enumerable);
3725c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.writable, undefined);
3735c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.get, accessorConfigurable.get);
3745c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.set, accessorConfigurable.set);
3755c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.value, undefined);
3765c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(1, obj2.bar = 1);
3775c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(4, val1);
3785c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(4, val2);
3795c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(4, obj2.foo);
3805c838251403b0be9a882540f1922577abba4c872ager@chromium.org
3815c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Redefine back to data property
3825c838251403b0be9a882540f1922577abba4c872ager@chromium.orgObject.defineProperty(obj2, "bar", dataConfigurable);
3835c838251403b0be9a882540f1922577abba4c872ager@chromium.orgdesc = Object.getOwnPropertyDescriptor(obj2, "bar");
3845c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(obj2.bar, 1000);
3855c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.value, 1000);
3865c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertTrue(desc.configurable);
3875c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertFalse(desc.writable);
3885c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertFalse(desc.enumerable);
3895c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.get, undefined);
3905c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.set, undefined);
3915c838251403b0be9a882540f1922577abba4c872ager@chromium.org
3925c838251403b0be9a882540f1922577abba4c872ager@chromium.org
3935f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org// Redefinition of an accessor defined using __defineGetter__ and
3949155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org// __defineSetter__.
3955c838251403b0be9a882540f1922577abba4c872ager@chromium.orgfunction get(){return this.x}
3965c838251403b0be9a882540f1922577abba4c872ager@chromium.orgfunction set(x){this.x=x};
3975c838251403b0be9a882540f1922577abba4c872ager@chromium.org
3985c838251403b0be9a882540f1922577abba4c872ager@chromium.orgvar obj3 = {x:1000};
3995c838251403b0be9a882540f1922577abba4c872ager@chromium.orgobj3.__defineGetter__("foo", get);
4005c838251403b0be9a882540f1922577abba4c872ager@chromium.orgobj3.__defineSetter__("foo", set);
4015c838251403b0be9a882540f1922577abba4c872ager@chromium.org
4025c838251403b0be9a882540f1922577abba4c872ager@chromium.orgdesc = Object.getOwnPropertyDescriptor(obj3, "foo");
4035c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertTrue(desc.configurable);
4045c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertTrue(desc.enumerable);
4055c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.writable, undefined);
4065c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.get, get);
4075c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.set, set);
4085c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.value, undefined);
4095c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(1, obj3.foo = 1);
4105c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(1, obj3.x);
4115c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(1, obj3.foo);
4125c838251403b0be9a882540f1922577abba4c872ager@chromium.org
4135c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Redefine to accessor property (non configurable) - note that enumerable
4145c838251403b0be9a882540f1922577abba4c872ager@chromium.org// which we do not redefine should remain the same (true).
4155c838251403b0be9a882540f1922577abba4c872ager@chromium.orgObject.defineProperty(obj3, "foo", accessorNoConfigurable);
4165c838251403b0be9a882540f1922577abba4c872ager@chromium.orgdesc = Object.getOwnPropertyDescriptor(obj3, "foo");
4175c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertFalse(desc.configurable);
4185c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertTrue(desc.enumerable);
4195c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.writable, undefined);
4205c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.get, accessorNoConfigurable.get);
4215c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.set, accessorNoConfigurable.set);
4225c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.value, undefined);
4235c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(1, obj3.foo = 1);
4245c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(5, val2);
4255c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(5, obj3.foo);
4265c838251403b0be9a882540f1922577abba4c872ager@chromium.org
4275c838251403b0be9a882540f1922577abba4c872ager@chromium.org
4285c838251403b0be9a882540f1922577abba4c872ager@chromium.orgobj3.__defineGetter__("bar", get);
4295c838251403b0be9a882540f1922577abba4c872ager@chromium.orgobj3.__defineSetter__("bar", set);
4305c838251403b0be9a882540f1922577abba4c872ager@chromium.org
4315c838251403b0be9a882540f1922577abba4c872ager@chromium.org
4325c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Redefine back to data property
4335c838251403b0be9a882540f1922577abba4c872ager@chromium.orgObject.defineProperty(obj3, "bar", dataConfigurable);
4345c838251403b0be9a882540f1922577abba4c872ager@chromium.orgdesc = Object.getOwnPropertyDescriptor(obj3, "bar");
4355c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(obj3.bar, 1000);
4365c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.value, 1000);
4375c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertTrue(desc.configurable);
4385c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertFalse(desc.writable);
4395c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertTrue(desc.enumerable);
4405c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.get, undefined);
4415c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.set, undefined);
4425c838251403b0be9a882540f1922577abba4c872ager@chromium.org
4435c838251403b0be9a882540f1922577abba4c872ager@chromium.org
4445c838251403b0be9a882540f1922577abba4c872ager@chromium.orgvar obj4 = {};
4455c838251403b0be9a882540f1922577abba4c872ager@chromium.orgvar func = function (){return 42;};
4465c838251403b0be9a882540f1922577abba4c872ager@chromium.orgobj4.bar = func;
4475c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(42, obj4.bar());
4485c838251403b0be9a882540f1922577abba4c872ager@chromium.org
4495c838251403b0be9a882540f1922577abba4c872ager@chromium.orgObject.defineProperty(obj4, "bar", accessorConfigurable);
4505c838251403b0be9a882540f1922577abba4c872ager@chromium.orgdesc = Object.getOwnPropertyDescriptor(obj4, "bar");
4515c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertTrue(desc.configurable);
4525c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertTrue(desc.enumerable);
4535c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.writable, undefined);
4545c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.get, accessorConfigurable.get);
4555c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.set, accessorConfigurable.set);
4565c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(desc.value, undefined);
4575c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(1, obj4.bar = 1);
4585c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(5, val1);
4595c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(5, obj4.bar);
4605c838251403b0be9a882540f1922577abba4c872ager@chromium.org
4619155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org// Make sure an error is thrown when trying to access to redefined function.
4625c838251403b0be9a882540f1922577abba4c872ager@chromium.orgtry {
4635c838251403b0be9a882540f1922577abba4c872ager@chromium.org  obj4.bar();
4645c838251403b0be9a882540f1922577abba4c872ager@chromium.org  assertTrue(false);
4655c838251403b0be9a882540f1922577abba4c872ager@chromium.org} catch (e) {
4665c838251403b0be9a882540f1922577abba4c872ager@chromium.org  assertTrue(/is not a function/.test(e));
4675c838251403b0be9a882540f1922577abba4c872ager@chromium.org}
4685c838251403b0be9a882540f1922577abba4c872ager@chromium.org
4695c838251403b0be9a882540f1922577abba4c872ager@chromium.org
470248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org// Test runtime calls to DefineDataPropertyUnchecked and
471248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org// DefineAccessorPropertyUnchecked - make sure we don't
4729155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org// crash.
4735c838251403b0be9a882540f1922577abba4c872ager@chromium.orgtry {
474248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org  %DefineAccessorPropertyUnchecked(0, 0, 0, 0, 0);
4755c838251403b0be9a882540f1922577abba4c872ager@chromium.org} catch (e) {
4765c838251403b0be9a882540f1922577abba4c872ager@chromium.org  assertTrue(/illegal access/.test(e));
4775c838251403b0be9a882540f1922577abba4c872ager@chromium.org}
4785c838251403b0be9a882540f1922577abba4c872ager@chromium.org
4795c838251403b0be9a882540f1922577abba4c872ager@chromium.orgtry {
480248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org  %DefineDataPropertyUnchecked(0, 0, 0, 0);
4815c838251403b0be9a882540f1922577abba4c872ager@chromium.org} catch (e) {
4825c838251403b0be9a882540f1922577abba4c872ager@chromium.org  assertTrue(/illegal access/.test(e));
4835c838251403b0be9a882540f1922577abba4c872ager@chromium.org}
4845c838251403b0be9a882540f1922577abba4c872ager@chromium.org
4855c838251403b0be9a882540f1922577abba4c872ager@chromium.orgtry {
486248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org  %DefineDataPropertyUnchecked(null, null, null, null);
4875c838251403b0be9a882540f1922577abba4c872ager@chromium.org} catch (e) {
4885c838251403b0be9a882540f1922577abba4c872ager@chromium.org  assertTrue(/illegal access/.test(e));
4895c838251403b0be9a882540f1922577abba4c872ager@chromium.org}
4905c838251403b0be9a882540f1922577abba4c872ager@chromium.org
4915c838251403b0be9a882540f1922577abba4c872ager@chromium.orgtry {
492248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org  %DefineAccessorPropertyUnchecked(null, null, null, null, null);
4935c838251403b0be9a882540f1922577abba4c872ager@chromium.org} catch (e) {
4945c838251403b0be9a882540f1922577abba4c872ager@chromium.org  assertTrue(/illegal access/.test(e));
4955c838251403b0be9a882540f1922577abba4c872ager@chromium.org}
4965c838251403b0be9a882540f1922577abba4c872ager@chromium.org
4975c838251403b0be9a882540f1922577abba4c872ager@chromium.orgtry {
498248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org  %DefineDataPropertyUnchecked({}, null, null, null);
4995c838251403b0be9a882540f1922577abba4c872ager@chromium.org} catch (e) {
5005c838251403b0be9a882540f1922577abba4c872ager@chromium.org  assertTrue(/illegal access/.test(e));
5015c838251403b0be9a882540f1922577abba4c872ager@chromium.org}
5025c838251403b0be9a882540f1922577abba4c872ager@chromium.org
5035c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Defining properties null should fail even when we have
5045c838251403b0be9a882540f1922577abba4c872ager@chromium.org// other allowed values
5055c838251403b0be9a882540f1922577abba4c872ager@chromium.orgtry {
506248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org  %DefineAccessorPropertyUnchecked(null, 'foo', func, null, 0);
5075c838251403b0be9a882540f1922577abba4c872ager@chromium.org} catch (e) {
5085c838251403b0be9a882540f1922577abba4c872ager@chromium.org  assertTrue(/illegal access/.test(e));
5095c838251403b0be9a882540f1922577abba4c872ager@chromium.org}
5105c838251403b0be9a882540f1922577abba4c872ager@chromium.org
5115c838251403b0be9a882540f1922577abba4c872ager@chromium.orgtry {
512248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org  %DefineDataPropertyUnchecked(null, 'foo', 0, 0);
5135c838251403b0be9a882540f1922577abba4c872ager@chromium.org} catch (e) {
5145c838251403b0be9a882540f1922577abba4c872ager@chromium.org  assertTrue(/illegal access/.test(e));
5155c838251403b0be9a882540f1922577abba4c872ager@chromium.org}
5169155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
5179155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org// Test that all possible differences in step 6 in DefineOwnProperty are
5189155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org// exercised, i.e., any difference in the given property descriptor and the
5199155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org// existing properties should not return true, but throw an error if the
5205f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org// existing configurable property is false.
5219155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
5229155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgvar obj5 = {};
5239155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org// Enumerable will default to false.
5249155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgObject.defineProperty(obj5, 'foo', accessorNoConfigurable);
5259155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgdesc = Object.getOwnPropertyDescriptor(obj5, 'foo');
5269155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org// First, test that we are actually allowed to set the accessor if all
5279155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org// values are of the descriptor are the same as the existing one.
5289155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgObject.defineProperty(obj5, 'foo', accessorNoConfigurable);
5299155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
5309155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org// Different setter.
5319155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgvar descDifferent = {
5329155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  configurable:false,
5339155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  enumerable:false,
5349155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  set: setter1,
5359155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  get: getter2
5369155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org};
5379155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
5389155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgtry {
5399155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  Object.defineProperty(obj5, 'foo', descDifferent);
5409155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  assertTrue(false);
5419155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org} catch (e) {
5429155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  assertTrue(/Cannot redefine property/.test(e));
5439155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org}
5449155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
5459155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org// Different getter.
5469155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgdescDifferent = {
5479155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  configurable:false,
5489155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  enumerable:false,
5499155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  set: setter2,
5509155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  get: getter1
5519155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org};
5529155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
5539155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgtry {
5549155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  Object.defineProperty(obj5, 'foo', descDifferent);
5559155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  assertTrue(false);
5569155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org} catch (e) {
5579155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  assertTrue(/Cannot redefine property/.test(e));
5589155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org}
5599155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
5609155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org// Different enumerable.
5619155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgdescDifferent = {
5629155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  configurable:false,
5639155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  enumerable:true,
5649155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  set: setter2,
5659155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  get: getter2
5669155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org};
5679155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
5689155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgtry {
5699155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  Object.defineProperty(obj5, 'foo', descDifferent);
5709155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  assertTrue(false);
5719155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org} catch (e) {
5729155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  assertTrue(/Cannot redefine property/.test(e));
5739155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org}
5749155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
5759155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org// Different configurable.
5769155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgdescDifferent = {
5779155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  configurable:false,
5789155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  enumerable:true,
5799155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  set: setter2,
5809155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  get: getter2
5819155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org};
5829155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
5839155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgtry {
5849155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  Object.defineProperty(obj5, 'foo', descDifferent);
5859155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  assertTrue(false);
5869155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org} catch (e) {
5879155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  assertTrue(/Cannot redefine property/.test(e));
5889155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org}
5899155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
5909155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org// No difference.
5919155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgdescDifferent = {
5929155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  configurable:false,
5939155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  enumerable:false,
5949155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  set: setter2,
5959155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  get: getter2
5969155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org};
5979155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org// Make sure we can still redefine if all properties are the same.
5989155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgObject.defineProperty(obj5, 'foo', descDifferent);
5999155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
6009155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org// Make sure that obj5 still holds the original values.
6019155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgdesc = Object.getOwnPropertyDescriptor(obj5, 'foo');
6029155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgassertEquals(desc.get, getter2);
6039155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgassertEquals(desc.set, setter2);
6049155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgassertFalse(desc.enumerable);
6059155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgassertFalse(desc.configurable);
6069155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
6079155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
6089155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org// Also exercise step 6 on data property, writable and enumerable
6099155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org// defaults to false.
6109155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgObject.defineProperty(obj5, 'bar', dataNoConfigurable);
6119155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
6129155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org// Test that redefinition with the same property descriptor is possible
6139155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgObject.defineProperty(obj5, 'bar', dataNoConfigurable);
6149155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
6159155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org// Different value.
6169155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgdescDifferent = {
6179155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  configurable:false,
6189155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  enumerable:false,
6199155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  writable: false,
6209155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  value: 1999
6219155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org};
6229155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
6239155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgtry {
6249155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  Object.defineProperty(obj5, 'bar', descDifferent);
6259155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  assertTrue(false);
6269155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org} catch (e) {
6279155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  assertTrue(/Cannot redefine property/.test(e));
6289155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org}
6299155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
6309155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org// Different writable.
6319155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgdescDifferent = {
6329155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  configurable:false,
6339155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  enumerable:false,
6349155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  writable: true,
6359155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  value: 2000
6369155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org};
6379155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
6389155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgtry {
6399155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  Object.defineProperty(obj5, 'bar', descDifferent);
6409155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  assertTrue(false);
6419155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org} catch (e) {
6429155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  assertTrue(/Cannot redefine property/.test(e));
6439155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org}
6449155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
6459155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
6469155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org// Different enumerable.
6479155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgdescDifferent = {
6489155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  configurable:false,
6499155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  enumerable:true ,
6509155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  writable:false,
6519155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  value: 2000
6529155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org};
6539155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
6549155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgtry {
6559155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  Object.defineProperty(obj5, 'bar', descDifferent);
6569155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  assertTrue(false);
6579155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org} catch (e) {
6589155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  assertTrue(/Cannot redefine property/.test(e));
6599155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org}
6609155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
6619155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
6629155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org// Different configurable.
6639155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgdescDifferent = {
6649155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  configurable:true,
6659155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  enumerable:false,
6669155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  writable:false,
6679155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  value: 2000
6689155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org};
6699155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
6709155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgtry {
6719155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  Object.defineProperty(obj5, 'bar', descDifferent);
6729155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  assertTrue(false);
6739155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org} catch (e) {
6749155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  assertTrue(/Cannot redefine property/.test(e));
6759155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org}
6769155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
6779155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org// No difference.
6789155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgdescDifferent = {
6799155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  configurable:false,
6809155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  enumerable:false,
6819155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  writable:false,
6829155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  value:2000
6839155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org};
6849155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org// Make sure we can still redefine if all properties are the same.
6859155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgObject.defineProperty(obj5, 'bar', descDifferent);
6869155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
6879155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org// Make sure that obj5 still holds the original values.
6889155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgdesc = Object.getOwnPropertyDescriptor(obj5, 'bar');
6899155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgassertEquals(desc.value, 2000);
6909155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgassertFalse(desc.writable);
6919155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgassertFalse(desc.enumerable);
6929155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgassertFalse(desc.configurable);
6939155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
6949155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
6959155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org// Make sure that we can't overwrite +0 with -0 and vice versa.
6969155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgvar descMinusZero = {value: -0, configurable: false};
6979155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgvar descPlusZero = {value: +0, configurable: false};
6989155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
6999155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgObject.defineProperty(obj5, 'minuszero', descMinusZero);
7009155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
7019155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org// Make sure we can redefine with -0.
7029155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgObject.defineProperty(obj5, 'minuszero', descMinusZero);
7039155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
704d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.orgexception = false;
7059155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgtry {
7069155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  Object.defineProperty(obj5, 'minuszero', descPlusZero);
7079155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org} catch (e) {
708d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org  exception = true;
7099155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  assertTrue(/Cannot redefine property/.test(e));
7109155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org}
711d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.orgassertTrue(exception);
7129155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
7139155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
7149155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgObject.defineProperty(obj5, 'pluszero', descPlusZero);
7159155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
7169155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org// Make sure we can redefine with +0.
7179155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgObject.defineProperty(obj5, 'pluszero', descPlusZero);
7189155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
719d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.orgexception = false;
7209155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgtry {
7219155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  Object.defineProperty(obj5, 'pluszero', descMinusZero);
7229155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org} catch (e) {
723d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org  exception = true;
7249155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  assertTrue(/Cannot redefine property/.test(e));
7259155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org}
726d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.orgassertTrue(exception);
7272c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org
7282c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org
7292c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgvar obj6 = {};
7302c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgobj6[1] = 'foo';
7312c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgobj6[2] = 'bar';
7322c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgobj6[3] = '42';
7332c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgobj6[4] = '43';
7342c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgobj6[5] = '44';
7352c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org
7362c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgvar descElement = { value: 'foobar' };
7372c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgvar descElementNonConfigurable = { value: 'barfoo', configurable: false };
7382c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgvar descElementNonWritable = { value: 'foofoo', writable: false };
7392c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgvar descElementNonEnumerable = { value: 'barbar', enumerable: false };
7405f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgvar descElementAllFalse = { value: 'foofalse',
7412c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org                            configurable: false,
7422c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org                            writable: false,
7432c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org                            enumerable: false };
7442c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org
7452c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org
7462c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org// Redefine existing property.
7472c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgObject.defineProperty(obj6, '1', descElement);
7482c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgdesc = Object.getOwnPropertyDescriptor(obj6, '1');
7492c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgassertEquals(desc.value, 'foobar');
7502c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgassertTrue(desc.writable);
7512c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgassertTrue(desc.enumerable);
7522c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgassertTrue(desc.configurable);
7532c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org
7542c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org// Redefine existing property with configurable: false.
7552c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgObject.defineProperty(obj6, '2', descElementNonConfigurable);
7562c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgdesc = Object.getOwnPropertyDescriptor(obj6, '2');
7572c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgassertEquals(desc.value, 'barfoo');
7582c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgassertTrue(desc.writable);
7592c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgassertTrue(desc.enumerable);
7602c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgassertFalse(desc.configurable);
7612c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org
76283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org// Can use defineProperty to change the value of a non
76383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org// configurable property.
7642c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgtry {
7652c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org  Object.defineProperty(obj6, '2', descElement);
76683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  desc = Object.getOwnPropertyDescriptor(obj6, '2');
76783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  assertEquals(desc.value, 'foobar');
76883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org} catch (e) {
76983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  assertUnreachable();
77083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org}
77183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
77283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org// Ensure that we can't change the descriptor of a
77383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org// non configurable property.
774d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.orgexception = false;
77583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgtry {
77683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  var descAccessor = { get: function() { return 0; } };
77783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  Object.defineProperty(obj6, '2', descAccessor);
7782c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org} catch (e) {
779d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org  exception = true;
7802c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org  assertTrue(/Cannot redefine property/.test(e));
7812c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org}
782d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.orgassertTrue(exception);
7832c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org
78483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgObject.defineProperty(obj6, '2', descElementNonWritable);
78583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgdesc = Object.getOwnPropertyDescriptor(obj6, '2');
78683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgassertEquals(desc.value, 'foofoo');
78783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgassertFalse(desc.writable);
78883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgassertTrue(desc.enumerable);
78983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgassertFalse(desc.configurable);
79083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
7912c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgObject.defineProperty(obj6, '3', descElementNonWritable);
7922c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgdesc = Object.getOwnPropertyDescriptor(obj6, '3');
7932c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgassertEquals(desc.value, 'foofoo');
7942c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgassertFalse(desc.writable);
7952c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgassertTrue(desc.enumerable);
7962c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgassertTrue(desc.configurable);
7972c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org
7982c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org// Redefine existing property with configurable: false.
7992c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgObject.defineProperty(obj6, '4', descElementNonEnumerable);
8002c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgdesc = Object.getOwnPropertyDescriptor(obj6, '4');
8012c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgassertEquals(desc.value, 'barbar');
8022c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgassertTrue(desc.writable);
8032c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgassertFalse(desc.enumerable);
8042c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgassertTrue(desc.configurable);
8052c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org
8062c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org// Redefine existing property with configurable: false.
8072c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgObject.defineProperty(obj6, '5', descElementAllFalse);
8082c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgdesc = Object.getOwnPropertyDescriptor(obj6, '5');
8092c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgassertEquals(desc.value, 'foofalse');
8102c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgassertFalse(desc.writable);
8112c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgassertFalse(desc.enumerable);
8122c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgassertFalse(desc.configurable);
8132c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org
8142c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org// Define non existing property - all attributes should default to false.
8152c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgObject.defineProperty(obj6, '15', descElement);
8162c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgdesc = Object.getOwnPropertyDescriptor(obj6, '15');
8172c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgassertEquals(desc.value, 'foobar');
8182c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgassertFalse(desc.writable);
8192c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgassertFalse(desc.enumerable);
8202c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgassertFalse(desc.configurable);
8212c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org
8222c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org// Make sure that we can't redefine using direct access.
8232c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgobj6[15] ='overwrite';
8245f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgassertEquals(obj6[15],'foobar');
8252c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org
8262c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org
8272c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org// Repeat the above tests on an array.
8282c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgvar arr = new Array();
8292c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgarr[1] = 'foo';
8302c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgarr[2] = 'bar';
8312c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgarr[3] = '42';
8322c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgarr[4] = '43';
8332c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgarr[5] = '44';
8342c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org
8352c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgvar descElement = { value: 'foobar' };
8362c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgvar descElementNonConfigurable = { value: 'barfoo', configurable: false };
8372c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgvar descElementNonWritable = { value: 'foofoo', writable: false };
8382c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgvar descElementNonEnumerable = { value: 'barbar', enumerable: false };
8395f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgvar descElementAllFalse = { value: 'foofalse',
8402c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org                            configurable: false,
8412c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org                            writable: false,
8422c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org                            enumerable: false };
8432c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org
8442c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org
8452c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org// Redefine existing property.
8462c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgObject.defineProperty(arr, '1', descElement);
8472c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgdesc = Object.getOwnPropertyDescriptor(arr, '1');
8482c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgassertEquals(desc.value, 'foobar');
8492c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgassertTrue(desc.writable);
8502c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgassertTrue(desc.enumerable);
8512c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgassertTrue(desc.configurable);
8522c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org
8532c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org// Redefine existing property with configurable: false.
8542c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgObject.defineProperty(arr, '2', descElementNonConfigurable);
8552c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgdesc = Object.getOwnPropertyDescriptor(arr, '2');
8562c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgassertEquals(desc.value, 'barfoo');
8572c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgassertTrue(desc.writable);
8582c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgassertTrue(desc.enumerable);
8592c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgassertFalse(desc.configurable);
8602c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org
86183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org// Can use defineProperty to change the value of a non
86283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org// configurable property of an array.
8632c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgtry {
8642c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org  Object.defineProperty(arr, '2', descElement);
86583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  desc = Object.getOwnPropertyDescriptor(arr, '2');
86683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  assertEquals(desc.value, 'foobar');
86783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org} catch (e) {
86883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  assertUnreachable();
86983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org}
87083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
87183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org// Ensure that we can't change the descriptor of a
87283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org// non configurable property.
873d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.orgexception = false;
87483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgtry {
87583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  var descAccessor = { get: function() { return 0; } };
87683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  Object.defineProperty(arr, '2', descAccessor);
8772c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org} catch (e) {
878d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org  exception = true;
8792c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org  assertTrue(/Cannot redefine property/.test(e));
8802c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org}
881d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.orgassertTrue(exception);
8822c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org
88383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgObject.defineProperty(arr, '2', descElementNonWritable);
88483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgdesc = Object.getOwnPropertyDescriptor(arr, '2');
88583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgassertEquals(desc.value, 'foofoo');
88683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgassertFalse(desc.writable);
88783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgassertTrue(desc.enumerable);
88883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgassertFalse(desc.configurable);
88983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
8902c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgObject.defineProperty(arr, '3', descElementNonWritable);
8912c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgdesc = Object.getOwnPropertyDescriptor(arr, '3');
8922c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgassertEquals(desc.value, 'foofoo');
8932c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgassertFalse(desc.writable);
8942c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgassertTrue(desc.enumerable);
8952c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgassertTrue(desc.configurable);
8962c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org
8972c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org// Redefine existing property with configurable: false.
8982c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgObject.defineProperty(arr, '4', descElementNonEnumerable);
8992c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgdesc = Object.getOwnPropertyDescriptor(arr, '4');
9002c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgassertEquals(desc.value, 'barbar');
9012c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgassertTrue(desc.writable);
9022c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgassertFalse(desc.enumerable);
9032c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgassertTrue(desc.configurable);
9042c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org
9052c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org// Redefine existing property with configurable: false.
9062c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgObject.defineProperty(arr, '5', descElementAllFalse);
9072c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgdesc = Object.getOwnPropertyDescriptor(arr, '5');
9082c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgassertEquals(desc.value, 'foofalse');
9092c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgassertFalse(desc.writable);
9102c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgassertFalse(desc.enumerable);
9112c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgassertFalse(desc.configurable);
9122c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org
9132c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org// Define non existing property - all attributes should default to false.
9142c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgObject.defineProperty(arr, '15', descElement);
9152c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgdesc = Object.getOwnPropertyDescriptor(arr, '15');
9162c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgassertEquals(desc.value, 'foobar');
9172c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgassertFalse(desc.writable);
9182c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgassertFalse(desc.enumerable);
9192c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.orgassertFalse(desc.configurable);
9202c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org
921e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// Define non-array property, check that .length is unaffected.
922e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(16, arr.length);
923e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgObject.defineProperty(arr, '0x20', descElement);
924e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(16, arr.length);
925e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
9265f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org// See issue 968: http://code.google.com/p/v8/issues/detail?id=968
9275f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgvar o = { x : 42 };
9285f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgObject.defineProperty(o, "x", { writable: false });
9295f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgassertEquals(42, o.x);
9305f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgo.x = 37;
9315f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgassertEquals(42, o.x);
9325f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org
9335f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgo = { x : 42 };
9345f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgObject.defineProperty(o, "x", {});
9355f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgassertEquals(42, o.x);
9365f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgo.x = 37;
9375f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org// Writability is preserved.
9385f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgassertEquals(37, o.x);
9395f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org
9405f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgvar o = { };
9415f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgObject.defineProperty(o, "x", { writable: false });
9425f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgassertEquals(undefined, o.x);
9435f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgo.x = 37;
9445f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgassertEquals(undefined, o.x);
9455f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org
9465f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgo = { get x() { return 87; } };
9475f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgObject.defineProperty(o, "x", { writable: false });
9485f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgassertEquals(undefined, o.x);
9495f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgo.x = 37;
9505f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgassertEquals(undefined, o.x);
9515f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org
9525f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org// Ignore inherited properties.
9535f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgo = { __proto__ : { x : 87 } };
9545f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgObject.defineProperty(o, "x", { writable: false });
9555f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgassertEquals(undefined, o.x);
9565f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgo.x = 37;
9575f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgassertEquals(undefined, o.x);
95883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
95983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgfunction testDefineProperty(obj, propertyName, desc, resultDesc) {
96083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  Object.defineProperty(obj, propertyName, desc);
96183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  var actualDesc = Object.getOwnPropertyDescriptor(obj, propertyName);
96283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  assertEquals(resultDesc.enumerable, actualDesc.enumerable);
96383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  assertEquals(resultDesc.configurable, actualDesc.configurable);
96483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  if (resultDesc.hasOwnProperty('value')) {
96583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org    assertEquals(resultDesc.value, actualDesc.value);
96683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org    assertEquals(resultDesc.writable, actualDesc.writable);
96783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org    assertFalse(resultDesc.hasOwnProperty('get'));
96883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org    assertFalse(resultDesc.hasOwnProperty('set'));
96983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  } else {
97083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org    assertEquals(resultDesc.get, actualDesc.get);
97183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org    assertEquals(resultDesc.set, actualDesc.set);
97283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org    assertFalse(resultDesc.hasOwnProperty('value'));
97383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org    assertFalse(resultDesc.hasOwnProperty('writable'));
97483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  }
97583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org}
97683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
97783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org// tests redefining existing property with a generic descriptor
97883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgo = { p : 42 };
97983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgtestDefineProperty(o, 'p',
98083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  { },
98183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  { value : 42, writable : true, enumerable : true, configurable : true });
98283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
98383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgo = { p : 42 };
98483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgtestDefineProperty(o, 'p',
98583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  { enumerable : true },
98683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  { value : 42, writable : true, enumerable : true, configurable : true });
98783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
98883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgo = { p : 42 };
98983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgtestDefineProperty(o, 'p',
99083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  { configurable : true },
99183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  { value : 42, writable : true, enumerable : true, configurable : true });
99283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
99383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgo = { p : 42 };
99483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgtestDefineProperty(o, 'p',
99583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  { enumerable : false },
99683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  { value : 42, writable : true, enumerable : false, configurable : true });
99783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
99883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgo = { p : 42 };
99983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgtestDefineProperty(o, 'p',
100083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  { configurable : false },
100183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  { value : 42, writable : true, enumerable : true, configurable : false });
100283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
100383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgo = { p : 42 };
100483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgtestDefineProperty(o, 'p',
100583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  { enumerable : true, configurable : true },
100683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  { value : 42, writable : true, enumerable : true, configurable : true });
100783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
100883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgo = { p : 42 };
100983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgtestDefineProperty(o, 'p',
101083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  { enumerable : false, configurable : true },
101183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  { value : 42, writable : true, enumerable : false, configurable : true });
101283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
101383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgo = { p : 42 };
101483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgtestDefineProperty(o, 'p',
101583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  { enumerable : true, configurable : false },
101683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  { value : 42, writable : true, enumerable : true, configurable : false });
101783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
101883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgo = { p : 42 };
101983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgtestDefineProperty(o, 'p',
102083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  { enumerable : false, configurable : false },
102183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  { value : 42, writable : true, enumerable : false, configurable : false });
102283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
102383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org// can make a writable, non-configurable field non-writable
102483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgo = { p : 42 };
102583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgObject.defineProperty(o, 'p', { configurable: false });
102683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgtestDefineProperty(o, 'p',
102783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  { writable: false },
102883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  { value : 42, writable : false, enumerable : true, configurable : false });
102983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
103083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org// redefine of get only property with generic descriptor
103183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgo = {};
103283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgObject.defineProperty(o, 'p',
103383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  { get : getter1, enumerable: true, configurable: true });
103483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgtestDefineProperty(o, 'p',
103583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  { enumerable : false, configurable : false },
103683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  { get: getter1, set: undefined, enumerable : false, configurable : false });
103783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
103883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org// redefine of get/set only property with generic descriptor
103983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgo = {};
104083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgObject.defineProperty(o, 'p',
104183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  { get: getter1, set: setter1, enumerable: true, configurable: true });
104283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgtestDefineProperty(o, 'p',
104383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  { enumerable : false, configurable : false },
104483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  { get: getter1, set: setter1, enumerable : false, configurable : false });
104583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
104683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org// redefine of set only property with generic descriptor
104783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgo = {};
104883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgObject.defineProperty(o, 'p',
104983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  { set : setter1, enumerable: true, configurable: true });
105083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgtestDefineProperty(o, 'p',
105183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  { enumerable : false, configurable : false },
105283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  { get: undefined, set: setter1, enumerable : false, configurable : false });
1053e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org
1054e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org
1055e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org// Regression test: Ensure that growing dictionaries are not ignored.
1056e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.orgo = {};
1057e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.orgfor (var i = 0; i < 1000; i++) {
1058e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org  // Non-enumerable property forces dictionary mode.
1059e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org  Object.defineProperty(o, i, {value: i, enumerable: false});
1060e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org}
1061ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.orgassertEquals(999, o[999]);
1062ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org
1063ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org
1064ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org// Regression test: Bizzare behavior on non-strict arguments object.
106556c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org// TODO(yangguo): Tests disabled, needs investigation!
106678502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org/*
1067ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org(function test(arg0) {
1068ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org  // Here arguments[0] is a fast alias on arg0.
1069ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org  Object.defineProperty(arguments, "0", {
1070ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org    value:1,
1071ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org    enumerable:false
1072ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org  });
1073ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org  // Here arguments[0] is a slow alias on arg0.
1074ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org  Object.defineProperty(arguments, "0", {
1075ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org    value:2,
1076ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org    writable:false
1077ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org  });
1078ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org  // Here arguments[0] is no alias at all.
1079ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org  Object.defineProperty(arguments, "0", {
1080ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org    value:3
1081ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org  });
1082ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org  assertEquals(2, arg0);
1083ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org  assertEquals(3, arguments[0]);
1084ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org})(0);
108578502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org*/
1086bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com
1087bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com// Regression test: We should never observe the hole value.
1088bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.comvar objectWithGetter = {};
1089bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.comobjectWithGetter.__defineGetter__('foo', function() {});
1090bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.comassertEquals(undefined, objectWithGetter.__lookupSetter__('foo'));
1091bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com
1092bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.comvar objectWithSetter = {};
1093bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.comobjectWithSetter.__defineSetter__('foo', function(x) {});
1094bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.comassertEquals(undefined, objectWithSetter.__lookupGetter__('foo'));
1095619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.org
1096619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.org// An object with a getter on the prototype chain.
1097619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.orgfunction getter() { return 111; }
1098619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.orgfunction anotherGetter() { return 222; }
1099619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.org
1100619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.orgfunction testGetterOnProto(expected, o) {
1101619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.org  assertEquals(expected, o.quebec);
1102619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.org}
1103619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.org
1104619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.orgobj1 = {};
1105619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.orgObject.defineProperty(obj1, "quebec", { get: getter, configurable: true });
1106619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.orgobj2 = Object.create(obj1);
1107619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.orgobj3 = Object.create(obj2);
1108619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.org
1109619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.orgtestGetterOnProto(111, obj3);
1110619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.orgtestGetterOnProto(111, obj3);
1111619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.org%OptimizeFunctionOnNextCall(testGetterOnProto);
1112619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.orgtestGetterOnProto(111, obj3);
1113619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.orgtestGetterOnProto(111, obj3);
1114619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.org
1115619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.orgObject.defineProperty(obj1, "quebec", { get: anotherGetter });
1116619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.org
1117619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.orgtestGetterOnProto(222, obj3);
1118619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.orgtestGetterOnProto(222, obj3);
1119619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.org%OptimizeFunctionOnNextCall(testGetterOnProto);
1120619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.orgtestGetterOnProto(222, obj3);
1121619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.orgtestGetterOnProto(222, obj3);
1122619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.org
1123619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.org// An object with a setter on the prototype chain.
1124619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.orgvar modifyMe;
1125619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.orgfunction setter(x) { modifyMe = x+1; }
1126619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.orgfunction anotherSetter(x) { modifyMe = x+2; }
1127619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.org
1128619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.orgfunction testSetterOnProto(expected, o) {
1129619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.org  modifyMe = 333;
1130619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.org  o.romeo = 444;
1131619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.org  assertEquals(expected, modifyMe);
1132619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.org}
1133619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.org
1134619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.orgobj1 = {};
1135619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.orgObject.defineProperty(obj1, "romeo", { set: setter, configurable: true });
1136619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.orgobj2 = Object.create(obj1);
1137619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.orgobj3 = Object.create(obj2);
1138619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.org
1139619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.orgtestSetterOnProto(445, obj3);
1140619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.orgtestSetterOnProto(445, obj3);
1141619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.org%OptimizeFunctionOnNextCall(testSetterOnProto);
1142619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.orgtestSetterOnProto(445, obj3);
1143619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.orgtestSetterOnProto(445, obj3);
1144619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.org
1145619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.orgObject.defineProperty(obj1, "romeo", { set: anotherSetter });
1146619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.org
1147619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.orgtestSetterOnProto(446, obj3);
1148619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.orgtestSetterOnProto(446, obj3);
1149619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.org%OptimizeFunctionOnNextCall(testSetterOnProto);
1150619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.orgtestSetterOnProto(446, obj3);
1151619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.orgtestSetterOnProto(446, obj3);
1152619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.org
1153619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.org// Removing a setter on the prototype chain.
1154619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.orgfunction testSetterOnProtoStrict(o) {
1155619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.org  "use strict";
1156619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.org  o.sierra = 12345;
1157619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.org}
1158619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.org
1159619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.orgobj1 = {};
1160619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.orgObject.defineProperty(obj1, "sierra",
1161619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.org                      { get: getter, set: setter, configurable: true });
1162619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.orgobj2 = Object.create(obj1);
1163619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.orgobj3 = Object.create(obj2);
1164619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.org
1165619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.orgtestSetterOnProtoStrict(obj3);
1166619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.orgtestSetterOnProtoStrict(obj3);
1167619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.org%OptimizeFunctionOnNextCall(testSetterOnProtoStrict);
1168619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.orgtestSetterOnProtoStrict(obj3);
1169619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.orgtestSetterOnProtoStrict(obj3);
1170619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.org
1171619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.orgObject.defineProperty(obj1, "sierra",
1172619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.org                      { get: getter, set: undefined, configurable: true });
1173619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.org
1174619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.orgexception = false;
1175619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.orgtry {
1176619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.org  testSetterOnProtoStrict(obj3);
1177619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.org} catch (e) {
1178619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.org  exception = true;
1179619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.org  assertTrue(/which has only a getter/.test(e));
1180619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.org}
1181619781ad24991bca2894d2f677ac960da366b11esvenpanne@chromium.orgassertTrue(exception);
1182de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org
1183de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org// Test assignment to a getter-only property on the prototype chain. This makes
1184de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org// sure that crankshaft re-checks its assumptions and doesn't rely only on type
1185de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org// feedback (which would be monomorphic here).
1186de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org
1187de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.orgfunction Assign(o) {
1188de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org  o.blubb = 123;
1189de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org}
1190de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org
1191de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.orgfunction C() {}
1192de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org
1193de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.orgAssign(new C);
1194de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.orgAssign(new C);
1195de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org%OptimizeFunctionOnNextCall(Assign);
1196de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.orgObject.defineProperty(C.prototype, "blubb", {get: function() { return -42; }});
1197de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.orgAssign(new C);
1198d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org
1199d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org// Test that changes to the prototype of a simple constructor are not ignored,
1200d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org// even after creating initial instances.
1201d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.orgfunction C() {
1202d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  this.x = 23;
1203d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org}
1204d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.orgassertEquals(23, new C().x);
1205d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.orgC.prototype.__defineSetter__('x', function(value) { this.y = 23; });
1206d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.orgassertEquals(void 0, new C().x);
1207