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