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 slicing array of holes keeps it as array of holes 295c838251403b0be9a882540f1922577abba4c872ager@chromium.org(function() { 305c838251403b0be9a882540f1922577abba4c872ager@chromium.org var array = new Array(10); 315c838251403b0be9a882540f1922577abba4c872ager@chromium.org for (var i = 0; i < 7; i++) { 325c838251403b0be9a882540f1922577abba4c872ager@chromium.org var sliced = array.slice(); 335c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(array.length, sliced.length); 345c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertFalse(0 in sliced); 355c838251403b0be9a882540f1922577abba4c872ager@chromium.org } 365c838251403b0be9a882540f1922577abba4c872ager@chromium.org})(); 375c838251403b0be9a882540f1922577abba4c872ager@chromium.org 385c838251403b0be9a882540f1922577abba4c872ager@chromium.org 39ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// Check various variants of empty array's slicing. 40ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org(function() { 41ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org for (var i = 0; i < 7; i++) { 42ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org assertEquals([], [].slice(0, 0)); 43ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org assertEquals([], [].slice(1, 0)); 44ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org assertEquals([], [].slice(0, 1)); 45ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org assertEquals([], [].slice(-1, 0)); 46ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org } 47ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org})(); 48ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 49ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 505c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Check various forms of arguments omission. 515c838251403b0be9a882540f1922577abba4c872ager@chromium.org(function() { 525c838251403b0be9a882540f1922577abba4c872ager@chromium.org var array = new Array(7); 535c838251403b0be9a882540f1922577abba4c872ager@chromium.org 545c838251403b0be9a882540f1922577abba4c872ager@chromium.org for (var i = 0; i < 7; i++) { 555c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(array, array.slice()); 565c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(array, array.slice(0)); 575c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(array, array.slice(undefined)); 585c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(array, array.slice("foobar")); 595c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(array, array.slice(undefined, undefined)); 605c838251403b0be9a882540f1922577abba4c872ager@chromium.org } 615c838251403b0be9a882540f1922577abba4c872ager@chromium.org})(); 625c838251403b0be9a882540f1922577abba4c872ager@chromium.org 635c838251403b0be9a882540f1922577abba4c872ager@chromium.org 645c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Check variants of negatives and positive indices. 655c838251403b0be9a882540f1922577abba4c872ager@chromium.org(function() { 665c838251403b0be9a882540f1922577abba4c872ager@chromium.org var array = new Array(7); 675c838251403b0be9a882540f1922577abba4c872ager@chromium.org 685c838251403b0be9a882540f1922577abba4c872ager@chromium.org for (var i = 0; i < 7; i++) { 695c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(7, array.slice(-100).length); 705c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(3, array.slice(-3).length); 715c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(3, array.slice(4).length); 725c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(1, array.slice(6).length); 735c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(0, array.slice(7).length); 745c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(0, array.slice(8).length); 755c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(0, array.slice(100).length); 765c838251403b0be9a882540f1922577abba4c872ager@chromium.org 775c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(0, array.slice(0, -100).length); 785c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(4, array.slice(0, -3).length); 795c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(4, array.slice(0, 4).length); 805c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(6, array.slice(0, 6).length); 815c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(7, array.slice(0, 7).length); 825c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(7, array.slice(0, 8).length); 835c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(7, array.slice(0, 100).length); 845c838251403b0be9a882540f1922577abba4c872ager@chromium.org 855c838251403b0be9a882540f1922577abba4c872ager@chromium.org // Some exotic cases. 865c838251403b0be9a882540f1922577abba4c872ager@chromium.org 875c838251403b0be9a882540f1922577abba4c872ager@chromium.org obj = { toString: function() { throw 'Exception'; } }; 885c838251403b0be9a882540f1922577abba4c872ager@chromium.org 895c838251403b0be9a882540f1922577abba4c872ager@chromium.org // More than 2 arguments: 905c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(7, array.slice(0, 7, obj, null, undefined).length); 915c838251403b0be9a882540f1922577abba4c872ager@chromium.org 925c838251403b0be9a882540f1922577abba4c872ager@chromium.org // Custom conversion: 935c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(1, array.slice({valueOf: function() { return 1; }}, 945c838251403b0be9a882540f1922577abba4c872ager@chromium.org {toString: function() { return 2; }}).length); 955c838251403b0be9a882540f1922577abba4c872ager@chromium.org 965c838251403b0be9a882540f1922577abba4c872ager@chromium.org // Throwing an exception in conversion: 975c838251403b0be9a882540f1922577abba4c872ager@chromium.org try { 985c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(7, array.slice(0, obj).length); 995c838251403b0be9a882540f1922577abba4c872ager@chromium.org throw 'Should have thrown'; 1005c838251403b0be9a882540f1922577abba4c872ager@chromium.org } catch (e) { 1015c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals('Exception', e); 1025c838251403b0be9a882540f1922577abba4c872ager@chromium.org } 1035c838251403b0be9a882540f1922577abba4c872ager@chromium.org } 1045c838251403b0be9a882540f1922577abba4c872ager@chromium.org})(); 1055c838251403b0be9a882540f1922577abba4c872ager@chromium.org 1065c838251403b0be9a882540f1922577abba4c872ager@chromium.org 1075c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Nasty: modify the array in ToInteger. 1085c838251403b0be9a882540f1922577abba4c872ager@chromium.org(function() { 1095c838251403b0be9a882540f1922577abba4c872ager@chromium.org var array = []; 1105c838251403b0be9a882540f1922577abba4c872ager@chromium.org var expected = [] 1115c838251403b0be9a882540f1922577abba4c872ager@chromium.org bad_guy = { valueOf: function() { array.push(array.length); return -1; } }; 1125c838251403b0be9a882540f1922577abba4c872ager@chromium.org 1135c838251403b0be9a882540f1922577abba4c872ager@chromium.org for (var i = 0; i < 13; i++) { 1145c838251403b0be9a882540f1922577abba4c872ager@chromium.org var sliced = array.slice(bad_guy); 1155c838251403b0be9a882540f1922577abba4c872ager@chromium.org expected.push(i); 1165c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(expected, array); 1175c838251403b0be9a882540f1922577abba4c872ager@chromium.org // According to the spec (15.4.4.10), length is calculated before 1185c838251403b0be9a882540f1922577abba4c872ager@chromium.org // performing ToInteger on arguments. 1195c838251403b0be9a882540f1922577abba4c872ager@chromium.org if (i == 0) { 1205c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals([], sliced); // Length was 0, nothing to get. 1215c838251403b0be9a882540f1922577abba4c872ager@chromium.org } else { 1225c838251403b0be9a882540f1922577abba4c872ager@chromium.org // Actually out of array [0..i] we get [i - 1] as length is i. 1235c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals([i - 1], sliced); 1245c838251403b0be9a882540f1922577abba4c872ager@chromium.org } 1255c838251403b0be9a882540f1922577abba4c872ager@chromium.org } 1265c838251403b0be9a882540f1922577abba4c872ager@chromium.org})(); 1275c838251403b0be9a882540f1922577abba4c872ager@chromium.org 1285c838251403b0be9a882540f1922577abba4c872ager@chromium.org 1295c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Now check the case with array of holes and some elements on prototype. 130dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org// Note: that is important that this test runs before the next one 131dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org// as the next one tampers Array.prototype. 132dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org(function() { 133dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org var len = 9; 134dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org var array = new Array(len); 135dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org 136dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org var at3 = "@3"; 137dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org var at7 = "@7"; 138dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org 139dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org for (var i = 0; i < 7; i++) { 140dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org var array_proto = []; 141dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org array_proto[3] = at3; 142dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org array_proto[7] = at7; 143dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org array.__proto__ = array_proto; 144dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org 145dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org assertEquals(len, array.length); 146dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org for (var i = 0; i < array.length; i++) { 147dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org assertEquals(array[i], array_proto[i]); 148dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org } 149dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org 150dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org var sliced = array.slice(); 151dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org 152dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org assertEquals(len, sliced.length); 153dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org 154dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org assertTrue(delete array_proto[3]); 155dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org assertTrue(delete array_proto[7]); 156dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org 157dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org // Note that slice copies values from prototype into the array. 158dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org assertEquals(array[3], undefined); 159dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org assertFalse(array.hasOwnProperty(3)); 160dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org assertEquals(sliced[3], at3); 161dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org assertTrue(sliced.hasOwnProperty(3)); 162dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org 163dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org assertEquals(array[7], undefined); 164dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org assertFalse(array.hasOwnProperty(7)); 165dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org assertEquals(sliced[7], at7); 166dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org assertTrue(sliced.hasOwnProperty(7)); 167dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org 168dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org // ... but keeps the rest as holes: 169dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org array_proto[5] = "@5"; 170dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org assertEquals(array[5], array_proto[5]); 171dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org assertFalse(array.hasOwnProperty(5)); 172dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org } 173dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org})(); 174dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org 175dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org 176dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org// Now check the case with array of holes and some elements on prototype. 1775c838251403b0be9a882540f1922577abba4c872ager@chromium.org(function() { 1785c838251403b0be9a882540f1922577abba4c872ager@chromium.org var len = 9; 1795c838251403b0be9a882540f1922577abba4c872ager@chromium.org var array = new Array(len); 1805c838251403b0be9a882540f1922577abba4c872ager@chromium.org 1815c838251403b0be9a882540f1922577abba4c872ager@chromium.org var at3 = "@3"; 1825c838251403b0be9a882540f1922577abba4c872ager@chromium.org var at7 = "@7"; 1835c838251403b0be9a882540f1922577abba4c872ager@chromium.org 1845c838251403b0be9a882540f1922577abba4c872ager@chromium.org for (var i = 0; i < 7; i++) { 1855c838251403b0be9a882540f1922577abba4c872ager@chromium.org Array.prototype[3] = at3; 1865c838251403b0be9a882540f1922577abba4c872ager@chromium.org Array.prototype[7] = at7; 1875c838251403b0be9a882540f1922577abba4c872ager@chromium.org 1885c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(len, array.length); 1895c838251403b0be9a882540f1922577abba4c872ager@chromium.org for (var i = 0; i < array.length; i++) { 1905c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(array[i], Array.prototype[i]); 1915c838251403b0be9a882540f1922577abba4c872ager@chromium.org } 1925c838251403b0be9a882540f1922577abba4c872ager@chromium.org 1935c838251403b0be9a882540f1922577abba4c872ager@chromium.org var sliced = array.slice(); 1945c838251403b0be9a882540f1922577abba4c872ager@chromium.org 1955c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(len, sliced.length); 1965c838251403b0be9a882540f1922577abba4c872ager@chromium.org 1975c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertTrue(delete Array.prototype[3]); 1985c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertTrue(delete Array.prototype[7]); 1995c838251403b0be9a882540f1922577abba4c872ager@chromium.org 2005c838251403b0be9a882540f1922577abba4c872ager@chromium.org // Note that slice copies values from prototype into the array. 2015c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(array[3], undefined); 2025c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertFalse(array.hasOwnProperty(3)); 2035c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(sliced[3], at3); 2045c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertTrue(sliced.hasOwnProperty(3)); 2055c838251403b0be9a882540f1922577abba4c872ager@chromium.org 2065c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(array[7], undefined); 2075c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertFalse(array.hasOwnProperty(7)); 2085c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(sliced[7], at7); 2095c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertTrue(sliced.hasOwnProperty(7)); 2105c838251403b0be9a882540f1922577abba4c872ager@chromium.org 2115c838251403b0be9a882540f1922577abba4c872ager@chromium.org // ... but keeps the rest as holes: 2125c838251403b0be9a882540f1922577abba4c872ager@chromium.org Array.prototype[5] = "@5"; 2135c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(array[5], Array.prototype[5]); 2145c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertFalse(array.hasOwnProperty(5)); 2155c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(sliced[5], Array.prototype[5]); 2165c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertFalse(sliced.hasOwnProperty(5)); 2175c838251403b0be9a882540f1922577abba4c872ager@chromium.org 2185c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertTrue(delete Array.prototype[5]); 2195c838251403b0be9a882540f1922577abba4c872ager@chromium.org } 2205c838251403b0be9a882540f1922577abba4c872ager@chromium.org})(); 221023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org 222023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org// Check slicing on arguments object. 223023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org(function() { 224023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org function func(expected, a0, a1, a2) { 225023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org assertEquals(expected, Array.prototype.slice.call(arguments, 1)); 226023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org } 227023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org 228023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org func([]); 229023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org func(['a'], 'a'); 230023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org func(['a', 1], 'a', 1); 231023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org func(['a', 1, undefined], 'a', 1, undefined); 232023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org func(['a', 1, undefined, void(0)], 'a', 1, undefined, void(0)); 233023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org})(); 234c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 235c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org// Check slicing on arguments object when missing arguments get assigined. 236c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org(function() { 237c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org function func(x, y) { 238c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org assertEquals(1, arguments.length); 239c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org assertEquals(undefined, y); 240c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org y = 239; 241c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org assertEquals(1, arguments.length); // arguments length is the same. 242c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org assertEquals([x], Array.prototype.slice.call(arguments, 0)); 243c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org } 244c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 245c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org func('a'); 246c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org})(); 247c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 248c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org// Check slicing on arguments object when length property has been set. 249c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org(function() { 250c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org function func(x, y) { 251c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org assertEquals(1, arguments.length); 252c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org arguments.length = 7; 253c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org assertEquals([x,,,,,,,], Array.prototype.slice.call(arguments, 0)); 254c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org } 255c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 256c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org func('a'); 257c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org})(); 258c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 259c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org// Check slicing on arguments object when length property has been set to 260c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org// some strange value. 261c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org(function() { 262c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org function func(x, y) { 263c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org assertEquals(1, arguments.length); 264c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org arguments.length = 'foobar'; 265c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org assertEquals([], Array.prototype.slice.call(arguments, 0)); 266c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org } 267c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 268c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org func('a'); 269c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org})(); 270c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 271c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org// Check slicing on arguments object when extra argument has been added 272c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org// via indexed assignment. 273c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org(function() { 274c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org function func(x, y) { 275c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org assertEquals(1, arguments.length); 276c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org arguments[3] = 239; 277c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org assertEquals([x], Array.prototype.slice.call(arguments, 0)); 278c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org } 279c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 280c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org func('a'); 281c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org})(); 282c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 283c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org// Check slicing on arguments object when argument has been deleted by index. 284c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org(function() { 285c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org function func(x, y, z) { 286c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org assertEquals(3, arguments.length); 287c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org delete arguments[1]; 288c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org assertEquals([x,,z], Array.prototype.slice.call(arguments, 0)); 289c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org } 290c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 291c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org func('a', 'b', 'c'); 292c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org})(); 293fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org 294fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org// Check slicing of holey objects with elements in the prototype 295fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org(function() { 296fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org function f() { 297fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org delete arguments[1]; 298fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org arguments.__proto__[1] = 5; 299fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org var result = Array.prototype.slice.call(arguments); 300fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org delete arguments.__proto__[1]; 301fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org assertEquals([1,5,3], result); 302fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org } 303fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org f(1,2,3); 304fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org})(); 305