1402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu// Copyright 2010 the V8 project authors. All rights reserved.
2402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu// Redistribution and use in source and binary forms, with or without
3402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu// modification, are permitted provided that the following conditions are
4402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu// met:
5402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu//
6402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu//     * Redistributions of source code must retain the above copyright
7402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu//       notice, this list of conditions and the following disclaimer.
8402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu//     * Redistributions in binary form must reproduce the above
9402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu//       copyright notice, this list of conditions and the following
10402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu//       disclaimer in the documentation and/or other materials provided
11402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu//       with the distribution.
12402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu//     * Neither the name of Google Inc. nor the names of its
13402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu//       contributors may be used to endorse or promote products derived
14402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu//       from this software without specific prior written permission.
15402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu//
16402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
28402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu// Check that slicing array of holes keeps it as array of holes
29402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu(function() {
30402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  var array = new Array(10);
31402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  for (var i = 0; i < 7; i++) {
32402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    var sliced = array.slice();
33402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    assertEquals(array.length, sliced.length);
34402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    assertFalse(0 in sliced);
35402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  }
36402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu})();
37402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
38402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
396ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// Check various variants of empty array's slicing.
406ded16be15dd865a9b21ea304d5273c8be299c87Steve Block(function() {
416ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  for (var i = 0; i < 7; i++) {
426ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    assertEquals([], [].slice(0, 0));
436ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    assertEquals([], [].slice(1, 0));
446ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    assertEquals([], [].slice(0, 1));
456ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    assertEquals([], [].slice(-1, 0));
466ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  }
476ded16be15dd865a9b21ea304d5273c8be299c87Steve Block})();
486ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
496ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
50402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu// Check various forms of arguments omission.
51402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu(function() {
52402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  var array = new Array(7);
53402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
54402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  for (var i = 0; i < 7; i++) {
55402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    assertEquals(array, array.slice());
56402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    assertEquals(array, array.slice(0));
57402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    assertEquals(array, array.slice(undefined));
58402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    assertEquals(array, array.slice("foobar"));
59402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    assertEquals(array, array.slice(undefined, undefined));
60402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  }
61402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu})();
62402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
63402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
64402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu// Check variants of negatives and positive indices.
65402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu(function() {
66402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  var array = new Array(7);
67402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
68402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  for (var i = 0; i < 7; i++) {
69402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    assertEquals(7, array.slice(-100).length);
70402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    assertEquals(3, array.slice(-3).length);
71402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    assertEquals(3, array.slice(4).length);
72402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    assertEquals(1, array.slice(6).length);
73402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    assertEquals(0, array.slice(7).length);
74402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    assertEquals(0, array.slice(8).length);
75402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    assertEquals(0, array.slice(100).length);
76402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
77402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    assertEquals(0, array.slice(0, -100).length);
78402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    assertEquals(4, array.slice(0, -3).length);
79402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    assertEquals(4, array.slice(0, 4).length);
80402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    assertEquals(6, array.slice(0, 6).length);
81402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    assertEquals(7, array.slice(0, 7).length);
82402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    assertEquals(7, array.slice(0, 8).length);
83402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    assertEquals(7, array.slice(0, 100).length);
84402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
85402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    // Some exotic cases.
86402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
87402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    obj = { toString: function() { throw 'Exception'; } };
88402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
89402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    // More than 2 arguments:
90402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    assertEquals(7, array.slice(0, 7, obj, null, undefined).length);
91402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
92402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    // Custom conversion:
93402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    assertEquals(1, array.slice({valueOf: function() { return 1; }},
94402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu                                {toString: function() { return 2; }}).length);
95402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
96402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    // Throwing an exception in conversion:
97402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    try {
98402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu      assertEquals(7, array.slice(0, obj).length);
99402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu      throw 'Should have thrown';
100402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    } catch (e) {
101402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu      assertEquals('Exception', e);
102402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    }
103402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  }
104402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu})();
105402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
106402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
107402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu// Nasty: modify the array in ToInteger.
108402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu(function() {
109402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  var array = [];
110402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  var expected = []
111402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  bad_guy = { valueOf: function() { array.push(array.length); return -1; } };
112402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
113402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  for (var i = 0; i < 13; i++) {
114402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    var sliced = array.slice(bad_guy);
115402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    expected.push(i);
116402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    assertEquals(expected, array);
117402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    // According to the spec (15.4.4.10), length is calculated before
118402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    // performing ToInteger on arguments.
119402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    if (i == 0) {
120402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu      assertEquals([], sliced);  // Length was 0, nothing to get.
121402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    } else {
122402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu      // Actually out of array [0..i] we get [i - 1] as length is i.
123402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu      assertEquals([i - 1], sliced);
124402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    }
125402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  }
126402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu})();
127402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
128402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
129402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu// Now check the case with array of holes and some elements on prototype.
13025f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen// Note: that is important that this test runs before the next one
13125f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen// as the next one tampers Array.prototype.
13225f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen(function() {
13325f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen  var len = 9;
13425f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen  var array = new Array(len);
13525f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen
13625f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen  var at3 = "@3";
13725f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen  var at7 = "@7";
13825f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen
13925f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen  for (var i = 0; i < 7; i++) {
14025f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen    var array_proto = [];
14125f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen    array_proto[3] = at3;
14225f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen    array_proto[7] = at7;
14325f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen    array.__proto__ = array_proto;
14425f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen
14525f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen    assertEquals(len, array.length);
14625f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen    for (var i = 0; i < array.length; i++) {
14725f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen      assertEquals(array[i], array_proto[i]);
14825f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen    }
14925f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen
15025f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen    var sliced = array.slice();
15125f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen
15225f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen    assertEquals(len, sliced.length);
15325f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen
15425f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen    assertTrue(delete array_proto[3]);
15525f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen    assertTrue(delete array_proto[7]);
15625f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen
15725f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen    // Note that slice copies values from prototype into the array.
15825f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen    assertEquals(array[3], undefined);
15925f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen    assertFalse(array.hasOwnProperty(3));
16025f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen    assertEquals(sliced[3], at3);
16125f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen    assertTrue(sliced.hasOwnProperty(3));
16225f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen
16325f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen    assertEquals(array[7], undefined);
16425f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen    assertFalse(array.hasOwnProperty(7));
16525f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen    assertEquals(sliced[7], at7);
16625f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen    assertTrue(sliced.hasOwnProperty(7));
16725f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen
16825f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen    // ... but keeps the rest as holes:
16925f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen    array_proto[5] = "@5";
17025f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen    assertEquals(array[5], array_proto[5]);
17125f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen    assertFalse(array.hasOwnProperty(5));
17225f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen  }
17325f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen})();
17425f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen
17525f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen
17625f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen// Now check the case with array of holes and some elements on prototype.
177402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu(function() {
178402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  var len = 9;
179402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  var array = new Array(len);
180402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
181402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  var at3 = "@3";
182402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  var at7 = "@7";
183402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
184402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  for (var i = 0; i < 7; i++) {
185402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    Array.prototype[3] = at3;
186402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    Array.prototype[7] = at7;
187402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
188402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    assertEquals(len, array.length);
189402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    for (var i = 0; i < array.length; i++) {
190402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu      assertEquals(array[i], Array.prototype[i]);
191402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    }
192402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
193402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    var sliced = array.slice();
194402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
195402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    assertEquals(len, sliced.length);
196402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
197402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    assertTrue(delete Array.prototype[3]);
198402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    assertTrue(delete Array.prototype[7]);
199402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
200402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    // Note that slice copies values from prototype into the array.
201402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    assertEquals(array[3], undefined);
202402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    assertFalse(array.hasOwnProperty(3));
203402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    assertEquals(sliced[3], at3);
204402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    assertTrue(sliced.hasOwnProperty(3));
205402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
206402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    assertEquals(array[7], undefined);
207402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    assertFalse(array.hasOwnProperty(7));
208402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    assertEquals(sliced[7], at7);
209402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    assertTrue(sliced.hasOwnProperty(7));
210402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
211402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    // ... but keeps the rest as holes:
212402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    Array.prototype[5] = "@5";
213402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    assertEquals(array[5], Array.prototype[5]);
214402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    assertFalse(array.hasOwnProperty(5));
215402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    assertEquals(sliced[5], Array.prototype[5]);
216402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    assertFalse(sliced.hasOwnProperty(5));
217402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu
218402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu    assertTrue(delete Array.prototype[5]);
219402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  }
220402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu})();
221b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
222b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// Check slicing on arguments object.
223b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch(function() {
224b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  function func(expected, a0, a1, a2) {
225b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    assertEquals(expected, Array.prototype.slice.call(arguments, 1));
226b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
227b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
228b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  func([]);
229b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  func(['a'], 'a');
230b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  func(['a', 1], 'a', 1);
231b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  func(['a', 1, undefined], 'a', 1, undefined);
232b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  func(['a', 1, undefined, void(0)], 'a', 1, undefined, void(0));
233b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch})();
234b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
235b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch// Check slicing on arguments object when missing arguments get assigined.
236b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch(function() {
237b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  function func(x, y) {
238b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    assertEquals(1, arguments.length);
239b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    assertEquals(undefined, y);
240b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    y = 239;
241b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    assertEquals(1, arguments.length);  // arguments length is the same.
242b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    assertEquals([x], Array.prototype.slice.call(arguments, 0));
243b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
244b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
245b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  func('a');
246b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch})();
247b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
248b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch// Check slicing on arguments object when length property has been set.
249b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch(function() {
250b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  function func(x, y) {
251b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    assertEquals(1, arguments.length);
252b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    arguments.length = 7;
253b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    assertEquals([x,,,,,,,], Array.prototype.slice.call(arguments, 0));
254b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
255b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
256b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  func('a');
257b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch})();
258b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
259b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch// Check slicing on arguments object when length property has been set to
260b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch// some strange value.
261b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch(function() {
262b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  function func(x, y) {
263b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    assertEquals(1, arguments.length);
264b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    arguments.length = 'foobar';
265b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    assertEquals([], Array.prototype.slice.call(arguments, 0));
266b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
267b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
268b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  func('a');
269b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch})();
270b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
271b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch// Check slicing on arguments object when extra argument has been added
272b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch// via indexed assignment.
273b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch(function() {
274b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  function func(x, y) {
275b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    assertEquals(1, arguments.length);
276b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    arguments[3] = 239;
277b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    assertEquals([x], Array.prototype.slice.call(arguments, 0));
278b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
279b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
280b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  func('a');
281b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch})();
282b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
283b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch// Check slicing on arguments object when argument has been deleted by index.
284b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch(function() {
285b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  function func(x, y, z) {
286b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    assertEquals(3, arguments.length);
287b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    delete arguments[1];
288b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    assertEquals([x,,z], Array.prototype.slice.call(arguments, 0));
289b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
290b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
291b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  func('a', 'b', 'c');
292b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch})();
293