15c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Copyright 2008 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/** 295c838251403b0be9a882540f1922577abba4c872ager@chromium.org * @fileoverview Test splice, shift, unshift, slice and join on small 305c838251403b0be9a882540f1922577abba4c872ager@chromium.org * and large arrays. Some of these methods are specified such that they 315c838251403b0be9a882540f1922577abba4c872ager@chromium.org * should work on other objects too, so we test that too. 325c838251403b0be9a882540f1922577abba4c872ager@chromium.org */ 335c838251403b0be9a882540f1922577abba4c872ager@chromium.org 34ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.orgvar LARGE = 4000000; 355c838251403b0be9a882540f1922577abba4c872ager@chromium.orgvar VERYLARGE = 4000000000; 365c838251403b0be9a882540f1922577abba4c872ager@chromium.org 375c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Nicer for firefox 1.5. Unless you uncomment the following two lines, 385c838251403b0be9a882540f1922577abba4c872ager@chromium.org// smjs will appear to hang on this file. 395c838251403b0be9a882540f1922577abba4c872ager@chromium.org//var LARGE = 40000; 405c838251403b0be9a882540f1922577abba4c872ager@chromium.org//var VERYLARGE = 40000; 415c838251403b0be9a882540f1922577abba4c872ager@chromium.org 425c838251403b0be9a882540f1922577abba4c872ager@chromium.orgvar fourhundredth = LARGE/400; 435c838251403b0be9a882540f1922577abba4c872ager@chromium.org 445c838251403b0be9a882540f1922577abba4c872ager@chromium.orgfunction PseudoArray() { 455c838251403b0be9a882540f1922577abba4c872ager@chromium.org}; 465c838251403b0be9a882540f1922577abba4c872ager@chromium.org 475c838251403b0be9a882540f1922577abba4c872ager@chromium.orgfor (var use_real_arrays = 0; use_real_arrays <= 1; use_real_arrays++) { 485c838251403b0be9a882540f1922577abba4c872ager@chromium.org var poses = [0, 140, 20000, VERYLARGE]; 495c838251403b0be9a882540f1922577abba4c872ager@chromium.org var the_prototype; 505c838251403b0be9a882540f1922577abba4c872ager@chromium.org var new_function; 515c838251403b0be9a882540f1922577abba4c872ager@chromium.org var push_function; 525c838251403b0be9a882540f1922577abba4c872ager@chromium.org var concat_function; 535c838251403b0be9a882540f1922577abba4c872ager@chromium.org var slice_function; 545c838251403b0be9a882540f1922577abba4c872ager@chromium.org var splice_function; 555c838251403b0be9a882540f1922577abba4c872ager@chromium.org var splice_function_2; 565c838251403b0be9a882540f1922577abba4c872ager@chromium.org var unshift_function; 575c838251403b0be9a882540f1922577abba4c872ager@chromium.org var unshift_function_2; 585c838251403b0be9a882540f1922577abba4c872ager@chromium.org var shift_function; 595c838251403b0be9a882540f1922577abba4c872ager@chromium.org if (use_real_arrays) { 605c838251403b0be9a882540f1922577abba4c872ager@chromium.org new_function = function(length) { 615c838251403b0be9a882540f1922577abba4c872ager@chromium.org return new Array(length); 625c838251403b0be9a882540f1922577abba4c872ager@chromium.org }; 635c838251403b0be9a882540f1922577abba4c872ager@chromium.org the_prototype = Array.prototype; 645c838251403b0be9a882540f1922577abba4c872ager@chromium.org push_function = function(array, elt) { 655c838251403b0be9a882540f1922577abba4c872ager@chromium.org return array.push(elt); 665c838251403b0be9a882540f1922577abba4c872ager@chromium.org }; 675c838251403b0be9a882540f1922577abba4c872ager@chromium.org concat_function = function(array, other) { 685c838251403b0be9a882540f1922577abba4c872ager@chromium.org return array.concat(other); 695c838251403b0be9a882540f1922577abba4c872ager@chromium.org }; 705c838251403b0be9a882540f1922577abba4c872ager@chromium.org slice_function = function(array, start, len) { 715c838251403b0be9a882540f1922577abba4c872ager@chromium.org return array.slice(start, len); 725c838251403b0be9a882540f1922577abba4c872ager@chromium.org }; 735c838251403b0be9a882540f1922577abba4c872ager@chromium.org splice_function = function(array, start, len) { 745c838251403b0be9a882540f1922577abba4c872ager@chromium.org return array.splice(start, len); 755c838251403b0be9a882540f1922577abba4c872ager@chromium.org }; 765c838251403b0be9a882540f1922577abba4c872ager@chromium.org splice_function_2 = function(array, start, len, elt) { 775c838251403b0be9a882540f1922577abba4c872ager@chromium.org return array.splice(start, len, elt); 785c838251403b0be9a882540f1922577abba4c872ager@chromium.org }; 795c838251403b0be9a882540f1922577abba4c872ager@chromium.org unshift_function = function(array, elt) { 805c838251403b0be9a882540f1922577abba4c872ager@chromium.org return array.unshift(elt); 815c838251403b0be9a882540f1922577abba4c872ager@chromium.org }; 825c838251403b0be9a882540f1922577abba4c872ager@chromium.org unshift_function_2 = function(array, elt1, elt2) { 835c838251403b0be9a882540f1922577abba4c872ager@chromium.org return array.unshift(elt1, elt2); 845c838251403b0be9a882540f1922577abba4c872ager@chromium.org }; 855c838251403b0be9a882540f1922577abba4c872ager@chromium.org shift_function = function(array) { 865c838251403b0be9a882540f1922577abba4c872ager@chromium.org return array.shift(); 875c838251403b0be9a882540f1922577abba4c872ager@chromium.org }; 885c838251403b0be9a882540f1922577abba4c872ager@chromium.org } else { 895c838251403b0be9a882540f1922577abba4c872ager@chromium.org // Don't run largest size on non-arrays or we'll be here for ever. 905c838251403b0be9a882540f1922577abba4c872ager@chromium.org poses.pop(); 915c838251403b0be9a882540f1922577abba4c872ager@chromium.org new_function = function(length) { 925c838251403b0be9a882540f1922577abba4c872ager@chromium.org var obj = new PseudoArray(); 935c838251403b0be9a882540f1922577abba4c872ager@chromium.org obj.length = length; 945c838251403b0be9a882540f1922577abba4c872ager@chromium.org return obj; 955c838251403b0be9a882540f1922577abba4c872ager@chromium.org }; 965c838251403b0be9a882540f1922577abba4c872ager@chromium.org the_prototype = PseudoArray.prototype; 975c838251403b0be9a882540f1922577abba4c872ager@chromium.org push_function = function(array, elt) { 985c838251403b0be9a882540f1922577abba4c872ager@chromium.org array[array.length] = elt; 995c838251403b0be9a882540f1922577abba4c872ager@chromium.org array.length++; 1005c838251403b0be9a882540f1922577abba4c872ager@chromium.org }; 1015c838251403b0be9a882540f1922577abba4c872ager@chromium.org concat_function = function(array, other) { 1025c838251403b0be9a882540f1922577abba4c872ager@chromium.org return Array.prototype.concat.call(array, other); 1035c838251403b0be9a882540f1922577abba4c872ager@chromium.org }; 1045c838251403b0be9a882540f1922577abba4c872ager@chromium.org slice_function = function(array, start, len) { 1055c838251403b0be9a882540f1922577abba4c872ager@chromium.org return Array.prototype.slice.call(array, start, len); 1065c838251403b0be9a882540f1922577abba4c872ager@chromium.org }; 1075c838251403b0be9a882540f1922577abba4c872ager@chromium.org splice_function = function(array, start, len) { 1085c838251403b0be9a882540f1922577abba4c872ager@chromium.org return Array.prototype.splice.call(array, start, len); 1095c838251403b0be9a882540f1922577abba4c872ager@chromium.org }; 1105c838251403b0be9a882540f1922577abba4c872ager@chromium.org splice_function_2 = function(array, start, len, elt) { 1115c838251403b0be9a882540f1922577abba4c872ager@chromium.org return Array.prototype.splice.call(array, start, len, elt); 1125c838251403b0be9a882540f1922577abba4c872ager@chromium.org }; 1135c838251403b0be9a882540f1922577abba4c872ager@chromium.org unshift_function = function(array, elt) { 1145c838251403b0be9a882540f1922577abba4c872ager@chromium.org return Array.prototype.unshift.call(array, elt); 1155c838251403b0be9a882540f1922577abba4c872ager@chromium.org }; 1165c838251403b0be9a882540f1922577abba4c872ager@chromium.org unshift_function_2 = function(array, elt1, elt2) { 1175c838251403b0be9a882540f1922577abba4c872ager@chromium.org return Array.prototype.unshift.call(array, elt1, elt2); 1185c838251403b0be9a882540f1922577abba4c872ager@chromium.org }; 1195c838251403b0be9a882540f1922577abba4c872ager@chromium.org shift_function = function(array) { 1205c838251403b0be9a882540f1922577abba4c872ager@chromium.org return Array.prototype.shift.call(array); 1215c838251403b0be9a882540f1922577abba4c872ager@chromium.org }; 1225c838251403b0be9a882540f1922577abba4c872ager@chromium.org } 1235c838251403b0be9a882540f1922577abba4c872ager@chromium.org 1245c838251403b0be9a882540f1922577abba4c872ager@chromium.org for (var pos_pos = 0; pos_pos < poses.length; pos_pos++) { 1255c838251403b0be9a882540f1922577abba4c872ager@chromium.org var pos = poses[pos_pos]; 1265c838251403b0be9a882540f1922577abba4c872ager@chromium.org if (pos > 100) { 1275c838251403b0be9a882540f1922577abba4c872ager@chromium.org var a = new_function(pos); 1285c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(pos, a.length); 1295c838251403b0be9a882540f1922577abba4c872ager@chromium.org push_function(a, 'foo'); 1305c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(pos + 1, a.length); 1315c838251403b0be9a882540f1922577abba4c872ager@chromium.org var b = ['bar']; 1325c838251403b0be9a882540f1922577abba4c872ager@chromium.org // Delete a huge number of holes. 1335c838251403b0be9a882540f1922577abba4c872ager@chromium.org var c = splice_function(a, 10, pos - 20); 1345c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(pos - 20, c.length); 1355c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(21, a.length); 1365c838251403b0be9a882540f1922577abba4c872ager@chromium.org } 1375c838251403b0be9a882540f1922577abba4c872ager@chromium.org 1385c838251403b0be9a882540f1922577abba4c872ager@chromium.org // Add a numeric property to the prototype of the array class. This 1395c838251403b0be9a882540f1922577abba4c872ager@chromium.org // allows us to test some borderline stuff relative to the standard. 1405c838251403b0be9a882540f1922577abba4c872ager@chromium.org the_prototype["" + (pos + 1)] = 'baz'; 1415c838251403b0be9a882540f1922577abba4c872ager@chromium.org 1425c838251403b0be9a882540f1922577abba4c872ager@chromium.org if (use_real_arrays) { 1435c838251403b0be9a882540f1922577abba4c872ager@chromium.org // It seems quite clear from ECMAScript spec 15.4.4.5. Just call Get on 1445c838251403b0be9a882540f1922577abba4c872ager@chromium.org // every integer in the range. 1455c838251403b0be9a882540f1922577abba4c872ager@chromium.org // IE, Safari get this right. 1465c838251403b0be9a882540f1922577abba4c872ager@chromium.org // FF, Opera get this wrong. 1475c838251403b0be9a882540f1922577abba4c872ager@chromium.org var a = ['zero', ,'two']; 1485c838251403b0be9a882540f1922577abba4c872ager@chromium.org if (pos == 0) { 1495c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals("zero,baz,two", a.join(",")); 1505c838251403b0be9a882540f1922577abba4c872ager@chromium.org } 1515c838251403b0be9a882540f1922577abba4c872ager@chromium.org 1525c838251403b0be9a882540f1922577abba4c872ager@chromium.org // Concat only applies to real arrays, unlike most of the other methods. 1535c838251403b0be9a882540f1922577abba4c872ager@chromium.org var a = new_function(pos); 1545c838251403b0be9a882540f1922577abba4c872ager@chromium.org push_function(a, "con"); 1555c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals("con", a[pos]); 1565c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(pos + 1, a.length); 1575c838251403b0be9a882540f1922577abba4c872ager@chromium.org var b = new_function(0); 1585c838251403b0be9a882540f1922577abba4c872ager@chromium.org push_function(b, "cat"); 1595c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals("cat", b[0]); 1605c838251403b0be9a882540f1922577abba4c872ager@chromium.org var ab = concat_function(a, b); 1615c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals("con", ab[pos]); 1625c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(pos + 2, ab.length); 1635c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals("cat", ab[pos + 1]); 1645c838251403b0be9a882540f1922577abba4c872ager@chromium.org var ba = concat_function(b, a); 1655c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals("con", ba[pos + 1]); 1665c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(pos + 2, ba.length); 1675c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals("cat", ba[0]); 1685c838251403b0be9a882540f1922577abba4c872ager@chromium.org 1695c838251403b0be9a882540f1922577abba4c872ager@chromium.org // Join with '' as separator. 1705c838251403b0be9a882540f1922577abba4c872ager@chromium.org var join = a.join(''); 1715c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals("con", join); 1725c838251403b0be9a882540f1922577abba4c872ager@chromium.org join = b.join(''); 1735c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals("cat", join); 1745c838251403b0be9a882540f1922577abba4c872ager@chromium.org join = ab.join(''); 1755c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals("concat", join); 1765c838251403b0be9a882540f1922577abba4c872ager@chromium.org join = ba.join(''); 1775c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals("catcon", join); 1785c838251403b0be9a882540f1922577abba4c872ager@chromium.org 1795c838251403b0be9a882540f1922577abba4c872ager@chromium.org var sparse = []; 1805c838251403b0be9a882540f1922577abba4c872ager@chromium.org sparse[pos + 1000] = 'is '; 1815c838251403b0be9a882540f1922577abba4c872ager@chromium.org sparse[pos + 271828] = 'time '; 1825c838251403b0be9a882540f1922577abba4c872ager@chromium.org sparse[pos + 31415] = 'the '; 1835c838251403b0be9a882540f1922577abba4c872ager@chromium.org sparse[pos + 012260199] = 'all '; 1845c838251403b0be9a882540f1922577abba4c872ager@chromium.org sparse[-1] = 'foo'; 1855c838251403b0be9a882540f1922577abba4c872ager@chromium.org sparse[pos + 22591927] = 'good '; 1865c838251403b0be9a882540f1922577abba4c872ager@chromium.org sparse[pos + 1618033] = 'for '; 1875c838251403b0be9a882540f1922577abba4c872ager@chromium.org sparse[pos + 91] = ': Now '; 1885c838251403b0be9a882540f1922577abba4c872ager@chromium.org sparse[pos + 86720199] = 'men.'; 1895c838251403b0be9a882540f1922577abba4c872ager@chromium.org sparse.hest = 'fisk'; 1905c838251403b0be9a882540f1922577abba4c872ager@chromium.org 1915c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals("baz: Now is the time for all good men.", sparse.join('')); 1925c838251403b0be9a882540f1922577abba4c872ager@chromium.org } 1935c838251403b0be9a882540f1922577abba4c872ager@chromium.org 1945c838251403b0be9a882540f1922577abba4c872ager@chromium.org a = new_function(pos); 1955c838251403b0be9a882540f1922577abba4c872ager@chromium.org push_function(a, 'zero'); 1965c838251403b0be9a882540f1922577abba4c872ager@chromium.org push_function(a, void 0); 1975c838251403b0be9a882540f1922577abba4c872ager@chromium.org push_function(a, 'two'); 1985c838251403b0be9a882540f1922577abba4c872ager@chromium.org 1995c838251403b0be9a882540f1922577abba4c872ager@chromium.org // Splice works differently from join. 2005c838251403b0be9a882540f1922577abba4c872ager@chromium.org // IE, Safari get this wrong. 2015c838251403b0be9a882540f1922577abba4c872ager@chromium.org // FF, Opera get this right. 2025c838251403b0be9a882540f1922577abba4c872ager@chromium.org // 15.4.4.12 line 24 says the object itself has to have the property... 2035c838251403b0be9a882540f1922577abba4c872ager@chromium.org var zero = splice_function(a, pos, 1); 2045c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals("undefined", typeof(a[pos])); 2055c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals("two", a[pos+1], "pos1:" + pos); 2065c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(pos + 2, a.length, "a length"); 2075c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(1, zero.length, "zero length"); 2085c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals("zero", zero[0]); 2095c838251403b0be9a882540f1922577abba4c872ager@chromium.org 2105c838251403b0be9a882540f1922577abba4c872ager@chromium.org // 15.4.4.12 line 41 says the object itself has to have the property... 2115c838251403b0be9a882540f1922577abba4c872ager@chromium.org a = new_function(pos); 2125c838251403b0be9a882540f1922577abba4c872ager@chromium.org push_function(a, 'zero'); 2135c838251403b0be9a882540f1922577abba4c872ager@chromium.org push_function(a, void 0); 2145c838251403b0be9a882540f1922577abba4c872ager@chromium.org push_function(a, 'two'); 2155c838251403b0be9a882540f1922577abba4c872ager@chromium.org var nothing = splice_function_2(a, pos, 0, 'minus1'); 2165c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals("minus1", a[pos]); 2175c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals("zero", a[pos+1]); 2185c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals("undefined", typeof(a[pos+2]), "toot!"); 2195c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals("two", a[pos+3], "pos3"); 2205c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(pos + 4, a.length); 2215c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(1, zero.length); 2225c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals("zero", zero[0]); 2235c838251403b0be9a882540f1922577abba4c872ager@chromium.org 2245c838251403b0be9a882540f1922577abba4c872ager@chromium.org // 15.4.4.12 line 10 says the object itself has to have the property... 2255c838251403b0be9a882540f1922577abba4c872ager@chromium.org a = new_function(pos); 2265c838251403b0be9a882540f1922577abba4c872ager@chromium.org push_function(a, 'zero'); 2275c838251403b0be9a882540f1922577abba4c872ager@chromium.org push_function(a, void 0); 2285c838251403b0be9a882540f1922577abba4c872ager@chromium.org push_function(a, 'two'); 2295c838251403b0be9a882540f1922577abba4c872ager@chromium.org var one = splice_function(a, pos + 1, 1); 2305c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals("", one.join(",")); 2315c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(pos + 2, a.length); 2325c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals("zero", a[pos]); 2335c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals("two", a[pos+1]); 2345c838251403b0be9a882540f1922577abba4c872ager@chromium.org 2355c838251403b0be9a882540f1922577abba4c872ager@chromium.org // Set things back to the way they were. 2365c838251403b0be9a882540f1922577abba4c872ager@chromium.org the_prototype[pos + 1] = undefined; 2375c838251403b0be9a882540f1922577abba4c872ager@chromium.org 2385c838251403b0be9a882540f1922577abba4c872ager@chromium.org // Unshift. 2395c838251403b0be9a882540f1922577abba4c872ager@chromium.org var a = new_function(pos); 2405c838251403b0be9a882540f1922577abba4c872ager@chromium.org push_function(a, "foo"); 2415c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals("foo", a[pos]); 2425c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(pos + 1, a.length); 2435c838251403b0be9a882540f1922577abba4c872ager@chromium.org unshift_function(a, "bar"); 2445c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals("foo", a[pos+1]); 2455c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(pos + 2, a.length); 2465c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals("bar", a[0]); 2475c838251403b0be9a882540f1922577abba4c872ager@chromium.org unshift_function_2(a, "baz", "boo"); 2485c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals("foo", a[pos+3]); 2495c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(pos + 4, a.length); 2505c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals("baz", a[0]); 2515c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals("boo", a[1]); 2525c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals("bar", a[2]); 2535c838251403b0be9a882540f1922577abba4c872ager@chromium.org 2545c838251403b0be9a882540f1922577abba4c872ager@chromium.org // Shift. 2555c838251403b0be9a882540f1922577abba4c872ager@chromium.org var baz = shift_function(a); 2565c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals("baz", baz); 2575c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals("boo", a[0]); 2585c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(pos + 3, a.length); 2595c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals("foo", a[pos + 2]); 2605c838251403b0be9a882540f1922577abba4c872ager@chromium.org 2615c838251403b0be9a882540f1922577abba4c872ager@chromium.org // Slice. 2625c838251403b0be9a882540f1922577abba4c872ager@chromium.org var bar = slice_function(a, 1, 0); // don't throw an exception please. 2635c838251403b0be9a882540f1922577abba4c872ager@chromium.org bar = slice_function(a, 1, 2); 2645c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals("bar", bar[0]); 2655c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(1, bar.length); 2665c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals("bar", a[1]); 2675c838251403b0be9a882540f1922577abba4c872ager@chromium.org 2685c838251403b0be9a882540f1922577abba4c872ager@chromium.org } 2695c838251403b0be9a882540f1922577abba4c872ager@chromium.org} 2705c838251403b0be9a882540f1922577abba4c872ager@chromium.org 2715c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Lets see if performance is reasonable. 2725c838251403b0be9a882540f1922577abba4c872ager@chromium.org 2735c838251403b0be9a882540f1922577abba4c872ager@chromium.orgvar a = new Array(LARGE + 10); 2745c838251403b0be9a882540f1922577abba4c872ager@chromium.orgfor (var i = 0; i < a.length; i += 1000) { 2755c838251403b0be9a882540f1922577abba4c872ager@chromium.org a[i] = i; 2765c838251403b0be9a882540f1922577abba4c872ager@chromium.org} 2775c838251403b0be9a882540f1922577abba4c872ager@chromium.org 2785c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Take something near the end of the array. 279ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.orgfor (var i = 0; i < 10; i++) { 2805c838251403b0be9a882540f1922577abba4c872ager@chromium.org var top = a.splice(LARGE, 5); 2815c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(5, top.length); 2825c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(LARGE, top[0]); 2835c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals("undefined", typeof(top[1])); 2845c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(LARGE + 5, a.length); 2855c838251403b0be9a882540f1922577abba4c872ager@chromium.org a.splice(LARGE, 0, LARGE); 2865c838251403b0be9a882540f1922577abba4c872ager@chromium.org a.length = LARGE + 10; 2875c838251403b0be9a882540f1922577abba4c872ager@chromium.org} 2885c838251403b0be9a882540f1922577abba4c872ager@chromium.org 2895c838251403b0be9a882540f1922577abba4c872ager@chromium.orgvar a = new Array(LARGE + 10); 2905c838251403b0be9a882540f1922577abba4c872ager@chromium.orgfor (var i = 0; i < a.length; i += fourhundredth) { 2915c838251403b0be9a882540f1922577abba4c872ager@chromium.org a[i] = i; 2925c838251403b0be9a882540f1922577abba4c872ager@chromium.org} 2935c838251403b0be9a882540f1922577abba4c872ager@chromium.org 2945c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Take something near the middle of the array. 2955c838251403b0be9a882540f1922577abba4c872ager@chromium.orgfor (var i = 0; i < 10; i++) { 2965c838251403b0be9a882540f1922577abba4c872ager@chromium.org var top = a.splice(LARGE >> 1, 5); 2975c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(5, top.length); 2985c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(LARGE >> 1, top[0]); 2995c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals("undefined", typeof(top[1])); 3005c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(LARGE + 5, a.length); 3015c838251403b0be9a882540f1922577abba4c872ager@chromium.org a.splice(LARGE >> 1, 0, LARGE >> 1, void 0, void 0, void 0, void 0); 3025c838251403b0be9a882540f1922577abba4c872ager@chromium.org} 3035c838251403b0be9a882540f1922577abba4c872ager@chromium.org 3045c838251403b0be9a882540f1922577abba4c872ager@chromium.org 3055c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Test http://b/issue?id=1202711 3065c838251403b0be9a882540f1922577abba4c872ager@chromium.orgarr = [0]; 3075c838251403b0be9a882540f1922577abba4c872ager@chromium.orgarr.length = 2; 3085c838251403b0be9a882540f1922577abba4c872ager@chromium.orgArray.prototype[1] = 1; 3095c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(1, arr.pop()); 3105c838251403b0be9a882540f1922577abba4c872ager@chromium.orgassertEquals(0, arr.pop()); 3115c838251403b0be9a882540f1922577abba4c872ager@chromium.orgArray.prototype[1] = undefined; 3125c838251403b0be9a882540f1922577abba4c872ager@chromium.org 3135c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Test http://code.google.com/p/chromium/issues/detail?id=21860 3145c838251403b0be9a882540f1922577abba4c872ager@chromium.orgArray.prototype.push.apply([], [1].splice(0, -(-1 % 5))); 315