1ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// Copyright 2010 the V8 project authors. All rights reserved. 2ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// Redistribution and use in source and binary forms, with or without 3ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// modification, are permitted provided that the following conditions are 4ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// met: 5ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// 6ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// * Redistributions of source code must retain the above copyright 7ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// notice, this list of conditions and the following disclaimer. 8ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// * Redistributions in binary form must reproduce the above 9ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// copyright notice, this list of conditions and the following 10ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// disclaimer in the documentation and/or other materials provided 11ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// with the distribution. 12ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// * Neither the name of Google Inc. nor the names of its 13ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// contributors may be used to endorse or promote products derived 14ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// from this software without specific prior written permission. 15ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// 16ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 28ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org//////////////////////////////////////////////////////////////////////// 29ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// Tests below verify that elements set on Array.prototype's proto propagate 30ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// for various Array.prototype functions (like unshift, shift, etc.) 31ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// If add any new tests here, consider adding them to all other files: 32ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// array-elements-from-array-prototype.js 33ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// array-elements-from-array-prototype-chain.js 34ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// array-elements-from-object-prototype.js 35ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// those ideally should be identical modulo host of elements and 36ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// the way elements introduced. 37ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// 38ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// Note: they are put into a separate file as we need maximally clean 39ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// VM setup---some optimizations might be already turned off in 40ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// 'dirty' VM. 41ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org//////////////////////////////////////////////////////////////////////// 42ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 43ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgvar at3 = '@3' 44ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgvar at7 = '@7' 45ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 46ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgArray.prototype.__proto__ = {3: at3}; 47ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgArray.prototype.__proto__.__proto__ = {7: at7}; 48ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 49ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgvar a = new Array(13) 50ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 51ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at3, a[3]) 52ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertFalse(a.hasOwnProperty(3)) 53ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 54ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at7, a[7]) 55ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertFalse(a.hasOwnProperty(7)) 56ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 57ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(undefined, a.shift(), 'hole should be returned as undefined') 58ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// Side-effects: Array.prototype[3] percolates into a[2] and Array.prototype[7[ 59ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// into a[6], still visible at the corresponding indices. 60ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 61ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at3, a[2]) 62ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(a.hasOwnProperty(2)) 63ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at3, a[3]) 64ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertFalse(a.hasOwnProperty(3)) 65ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 66ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at7, a[6]) 67ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(a.hasOwnProperty(6)) 68ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at7, a[7]) 69ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertFalse(a.hasOwnProperty(7)) 70ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 71ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orga.unshift('foo', 'bar') 72ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// Side-effects: Array.prototype[3] now percolates into a[5] and Array.prototype[7] 73ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// into a[9]. 74ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 75ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at3, a[3]) 76ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertFalse(a.hasOwnProperty(3)) 77ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at3, a[4]) 78ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(a.hasOwnProperty(4)) 79ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at3, a[5]) 80ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(a.hasOwnProperty(5)) 81ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 82ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(undefined, a[6]) 83ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertFalse(a.hasOwnProperty(6)) 84ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 85ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at7, a[7]) 86ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertFalse(a.hasOwnProperty(7)) 87ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at7, a[8]) 88ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(a.hasOwnProperty(8)) 89ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at7, a[9]) 90ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(a.hasOwnProperty(9)) 91ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 92ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgvar sliced = a.slice(3, 10) 93ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// Slice must keep intact a and reify holes at indices 0--2 and 4--6. 94ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 95ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at3, a[3]) 96ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertFalse(a.hasOwnProperty(3)) 97ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at3, a[4]) 98ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(a.hasOwnProperty(4)) 99ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at3, a[5]) 100ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(a.hasOwnProperty(5)) 101ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 102ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(undefined, a[6]) 103ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertFalse(a.hasOwnProperty(6)) 104ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 105ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at7, a[7]) 106ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertFalse(a.hasOwnProperty(7)) 107ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at7, a[8]) 108ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(a.hasOwnProperty(8)) 109ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at7, a[9]) 110ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(a.hasOwnProperty(9)) 111ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 112ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at3, sliced[0]) 113ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(sliced.hasOwnProperty(0)) 114ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at3, sliced[1]) 115ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(sliced.hasOwnProperty(1)) 116ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at3, sliced[2]) 117ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(sliced.hasOwnProperty(2)) 118ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 119ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// Note: sliced[3] comes directly from Array.prototype[3] 120ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at3, sliced[3]); 121ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertFalse(sliced.hasOwnProperty(3)) 122ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 123ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at7, sliced[4]) 124ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(sliced.hasOwnProperty(4)) 125ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at7, sliced[5]) 126ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(sliced.hasOwnProperty(5)) 127ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at7, sliced[6]) 128ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(sliced.hasOwnProperty(6)) 129ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 130ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 131ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// Splice is too complicated the operation, start afresh. 132ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 133ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// Shrking array. 134ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgvar a0 = [0, 1, , , 4, 5, , , , 9] 135ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgvar result = a0.splice(4, 1) 136ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// Side-effects: everything before 4 is kept intact: 137ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 138ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(0, a0[0]) 139ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(a0.hasOwnProperty(0)) 140ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(1, a0[1]) 141ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(a0.hasOwnProperty(1)) 142ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(undefined, a0[2]) 143ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertFalse(a0.hasOwnProperty(2)) 144ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at3, a0[3]) 145ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertFalse(a0.hasOwnProperty(3)) 146ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 147ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// 4 and above shifted left by one reifying at7 into a0[6] and keeping 148ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// a hole at a0[7] 149ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 150ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(5, a0[4]) 151ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(a0.hasOwnProperty(4)) 152ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(undefined, a0[5]) 153ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertFalse(a0.hasOwnProperty(5)) 154ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at7, a0[6]) 155ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(a0.hasOwnProperty(6)) 156ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at7, a0[7]) 157ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertFalse(a0.hasOwnProperty(7)) 158ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(9, a0[8]) 159ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(a0.hasOwnProperty(8)) 160ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 161ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// Growing array. 162ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgvar a1 = [0, 1, , , 4, 5, , , , 9] 163ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgvar result = a1.splice(4, 0, undefined) 164ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// Side-effects: everything before 4 is kept intact: 165ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 166ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(0, a1[0]) 167ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(a1.hasOwnProperty(0)) 168ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(1, a1[1]) 169ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(a1.hasOwnProperty(1)) 170ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(undefined, a1[2]) 171ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertFalse(a1.hasOwnProperty(2)) 172ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at3, a1[3]) 173ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertFalse(a1.hasOwnProperty(3)) 174ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 175ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// Now owned undefined resides at 4 and rest is shifted right by one 176ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// reifying at7 into a0[8] and keeping a hole at a0[7]. 177ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 178ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(undefined, a1[4]) 179ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(a1.hasOwnProperty(4)) 180ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(4, a1[5]) 181ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(a1.hasOwnProperty(5)) 182ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(5, a1[6]) 183ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(a1.hasOwnProperty(6)) 184ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at7, a1[7]) 185ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertFalse(a1.hasOwnProperty(7)) 186ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(at7, a1[8]) 187ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(a1.hasOwnProperty(8)) 188ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(undefined, a1[9]) 189ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertFalse(a1.hasOwnProperty(9)) 190ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertEquals(9, a1[10]) 191ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgassertTrue(a1.hasOwnProperty(10)) 192