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