15c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Copyright 2010 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// Check that shifting array of holes keeps it as array of holes 295c838251403b0be9a882540f1922577abba4c872ager@chromium.org(function() { 305c838251403b0be9a882540f1922577abba4c872ager@chromium.org var array = new Array(10); 315c838251403b0be9a882540f1922577abba4c872ager@chromium.org array.shift(); 325c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertFalse(0 in array); 335c838251403b0be9a882540f1922577abba4c872ager@chromium.org})(); 345c838251403b0be9a882540f1922577abba4c872ager@chromium.org 355c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Now check the case with array of holes and some elements on prototype. 365c838251403b0be9a882540f1922577abba4c872ager@chromium.org(function() { 375c838251403b0be9a882540f1922577abba4c872ager@chromium.org var len = 9; 385c838251403b0be9a882540f1922577abba4c872ager@chromium.org var array = new Array(len); 395c838251403b0be9a882540f1922577abba4c872ager@chromium.org Array.prototype[3] = "@3"; 405c838251403b0be9a882540f1922577abba4c872ager@chromium.org Array.prototype[7] = "@7"; 415c838251403b0be9a882540f1922577abba4c872ager@chromium.org 425c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(len, array.length); 435c838251403b0be9a882540f1922577abba4c872ager@chromium.org for (var i = 0; i < array.length; i++) { 445c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(array[i], Array.prototype[i]); 455c838251403b0be9a882540f1922577abba4c872ager@chromium.org } 465c838251403b0be9a882540f1922577abba4c872ager@chromium.org 475c838251403b0be9a882540f1922577abba4c872ager@chromium.org array.shift(); 485c838251403b0be9a882540f1922577abba4c872ager@chromium.org 495c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(len - 1, array.length); 505c838251403b0be9a882540f1922577abba4c872ager@chromium.org // Note that shift copies values from prototype into the array. 515c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(array[2], Array.prototype[3]); 525c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertTrue(array.hasOwnProperty(2)); 535c838251403b0be9a882540f1922577abba4c872ager@chromium.org 545c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(array[6], Array.prototype[7]); 555c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertTrue(array.hasOwnProperty(6)); 565c838251403b0be9a882540f1922577abba4c872ager@chromium.org 575c838251403b0be9a882540f1922577abba4c872ager@chromium.org // ... but keeps the rest as holes: 585c838251403b0be9a882540f1922577abba4c872ager@chromium.org Array.prototype[5] = "@5"; 595c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(array[5], Array.prototype[5]); 605c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertFalse(array.hasOwnProperty(5)); 615c838251403b0be9a882540f1922577abba4c872ager@chromium.org 625c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(array[3], Array.prototype[3]); 635c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertFalse(array.hasOwnProperty(3)); 645c838251403b0be9a882540f1922577abba4c872ager@chromium.org 655c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(array[7], Array.prototype[7]); 665c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertFalse(array.hasOwnProperty(7)); 675c838251403b0be9a882540f1922577abba4c872ager@chromium.org 685c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertTrue(delete Array.prototype[3]); 695c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertTrue(delete Array.prototype[5]); 705c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertTrue(delete Array.prototype[7]); 715c838251403b0be9a882540f1922577abba4c872ager@chromium.org})(); 72dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org 73dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org// Now check the case with array of holes and some elements on prototype 74dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org// which is an array itself. 75dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org(function() { 76dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org var len = 9; 77dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org var array = new Array(len); 78dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org var array_proto = new Array(); 79dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org array_proto[3] = "@3"; 80dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org array_proto[7] = "@7"; 81dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org array.__proto__ = array_proto; 82dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org 83dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org assertEquals(len, array.length); 84dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org for (var i = 0; i < array.length; i++) { 85dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org assertEquals(array[i], array_proto[i]); 86dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org } 87dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org 88dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org array.shift(); 89dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org 90dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org assertEquals(len - 1, array.length); 91dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org // Note that shift copies values from prototype into the array. 92dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org assertEquals(array[2], array_proto[3]); 93dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org assertTrue(array.hasOwnProperty(2)); 94dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org 95dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org assertEquals(array[6], array_proto[7]); 96dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org assertTrue(array.hasOwnProperty(6)); 97dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org 98dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org // ... but keeps the rest as holes: 99dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org array_proto[5] = "@5"; 100dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org assertEquals(array[5], array_proto[5]); 101dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org assertFalse(array.hasOwnProperty(5)); 102dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org 103dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org assertEquals(array[3], array_proto[3]); 104dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org assertFalse(array.hasOwnProperty(3)); 105dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org 106dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org assertEquals(array[7], array_proto[7]); 107dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org assertFalse(array.hasOwnProperty(7)); 108dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org})(); 109f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org 110f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org// Check that non-enumerable elements are treated appropriately 111f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org(function() { 112f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org var array = [1, 2, 3]; 113f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org Object.defineProperty(array, '1', {enumerable: false}); 114f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org assertEquals(1, array.shift()); 115f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org assertEquals([2, 3], array); 116f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org 117f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org array = [1,,3]; 118f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org array.__proto__[1] = 2; 119f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org Object.defineProperty(array.__proto__, '1', {enumerable: false}); 120f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org assertEquals(1, array.shift()); 121f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org assertEquals([2, 3], array); 122f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org})(); 123