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