11b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Copyright 2016 the V8 project authors. All rights reserved. 21b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 31b268ca467c924004286c97bac133db489cf43d0Ben Murdoch// found in the LICENSE file. 41b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 51b268ca467c924004286c97bac133db489cf43d0Ben Murdochfunction enumerate(o) { 61b268ca467c924004286c97bac133db489cf43d0Ben Murdoch var keys = []; 71b268ca467c924004286c97bac133db489cf43d0Ben Murdoch for (var key in o) keys.push(key); 81b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return keys; 91b268ca467c924004286c97bac133db489cf43d0Ben Murdoch} 101b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 111b268ca467c924004286c97bac133db489cf43d0Ben Murdoch(function testSlowSloppyArgumentsElements() { 121b268ca467c924004286c97bac133db489cf43d0Ben Murdoch function slowSloppyArguments(a, b, c) { 131b268ca467c924004286c97bac133db489cf43d0Ben Murdoch arguments[10000] = "last"; 141b268ca467c924004286c97bac133db489cf43d0Ben Murdoch arguments[4000] = "first"; 151b268ca467c924004286c97bac133db489cf43d0Ben Murdoch arguments[6000] = "second"; 161b268ca467c924004286c97bac133db489cf43d0Ben Murdoch arguments[5999] = "x"; 171b268ca467c924004286c97bac133db489cf43d0Ben Murdoch arguments[3999] = "y"; 181b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return arguments; 191b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 201b268ca467c924004286c97bac133db489cf43d0Ben Murdoch assertEquals(["0", "1", "2", "3999", "4000", "5999", "6000", "10000"], 211b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Object.keys(slowSloppyArguments(1, 2, 3))); 221b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 231b268ca467c924004286c97bac133db489cf43d0Ben Murdoch assertEquals(["0", "1", "2", "3999", "4000", "5999", "6000", "10000"], 241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch enumerate(slowSloppyArguments(1,2,3))); 251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch})(); 261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch(function testSlowSloppyArgumentsElementsNotEnumerable() { 281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch function slowSloppyArguments(a, b, c) { 291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Object.defineProperty(arguments, 10000, { 301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch enumerable: false, configurable: false, value: "NOPE" 311b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }); 321b268ca467c924004286c97bac133db489cf43d0Ben Murdoch arguments[4000] = "first"; 331b268ca467c924004286c97bac133db489cf43d0Ben Murdoch arguments[6000] = "second"; 341b268ca467c924004286c97bac133db489cf43d0Ben Murdoch arguments[5999] = "x"; 351b268ca467c924004286c97bac133db489cf43d0Ben Murdoch arguments[3999] = "y"; 361b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return arguments; 371b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 381b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 391b268ca467c924004286c97bac133db489cf43d0Ben Murdoch assertEquals(["0", "1", "2", "3999", "4000", "5999", "6000"], 401b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Object.keys(slowSloppyArguments(1, 2, 3))); 411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 421b268ca467c924004286c97bac133db489cf43d0Ben Murdoch assertEquals(["0", "1", "2", "3999", "4000", "5999", "6000"], 431b268ca467c924004286c97bac133db489cf43d0Ben Murdoch enumerate(slowSloppyArguments(1,2,3))); 441b268ca467c924004286c97bac133db489cf43d0Ben Murdoch})(); 451b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 461b268ca467c924004286c97bac133db489cf43d0Ben Murdoch(function testFastSloppyArgumentsElements() { 471b268ca467c924004286c97bac133db489cf43d0Ben Murdoch function fastSloppyArguments(a, b, c) { 481b268ca467c924004286c97bac133db489cf43d0Ben Murdoch arguments[5] = 1; 491b268ca467c924004286c97bac133db489cf43d0Ben Murdoch arguments[7] = 0; 501b268ca467c924004286c97bac133db489cf43d0Ben Murdoch arguments[3] = 2; 511b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return arguments; 521b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 531b268ca467c924004286c97bac133db489cf43d0Ben Murdoch assertEquals(["0", "1", "2", "3", "5", "7"], 541b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Object.keys(fastSloppyArguments(1, 2, 3))); 551b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 561b268ca467c924004286c97bac133db489cf43d0Ben Murdoch assertEquals( 571b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ["0", "1", "2", "3", "5", "7"], enumerate(fastSloppyArguments(1, 2, 3))); 581b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 591b268ca467c924004286c97bac133db489cf43d0Ben Murdoch function fastSloppyArguments2(a, b, c) { 601b268ca467c924004286c97bac133db489cf43d0Ben Murdoch delete arguments[0]; 611b268ca467c924004286c97bac133db489cf43d0Ben Murdoch arguments[0] = "test"; 621b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return arguments; 631b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 641b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch assertEquals(["0", "1", "2"], Object.keys(fastSloppyArguments2(1, 2, 3))); 661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch assertEquals(["0", "1", "2"], enumerate(fastSloppyArguments2(1, 2, 3))); 671b268ca467c924004286c97bac133db489cf43d0Ben Murdoch})(); 681b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 691b268ca467c924004286c97bac133db489cf43d0Ben Murdoch(function testFastSloppyArgumentsElementsNotEnumerable() { 701b268ca467c924004286c97bac133db489cf43d0Ben Murdoch function fastSloppyArguments(a, b, c) { 711b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Object.defineProperty(arguments, 5, { 721b268ca467c924004286c97bac133db489cf43d0Ben Murdoch enumerable: false, configurable: false, value: "NOPE" 731b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }); 741b268ca467c924004286c97bac133db489cf43d0Ben Murdoch arguments[7] = 0; 751b268ca467c924004286c97bac133db489cf43d0Ben Murdoch arguments[3] = 2; 761b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return arguments; 771b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 781b268ca467c924004286c97bac133db489cf43d0Ben Murdoch assertEquals( 791b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ["0", "1", "2", "3", "7"], Object.keys(fastSloppyArguments(1, 2, 3))); 801b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 811b268ca467c924004286c97bac133db489cf43d0Ben Murdoch assertEquals( 821b268ca467c924004286c97bac133db489cf43d0Ben Murdoch ["0", "1", "2", "3", "7"], enumerate(fastSloppyArguments(1,2,3))); 831b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 841b268ca467c924004286c97bac133db489cf43d0Ben Murdoch function fastSloppyArguments2(a, b, c) { 851b268ca467c924004286c97bac133db489cf43d0Ben Murdoch delete arguments[0]; 861b268ca467c924004286c97bac133db489cf43d0Ben Murdoch Object.defineProperty(arguments, 1, { 871b268ca467c924004286c97bac133db489cf43d0Ben Murdoch enumerable: false, configurable: false, value: "NOPE" 881b268ca467c924004286c97bac133db489cf43d0Ben Murdoch }); 891b268ca467c924004286c97bac133db489cf43d0Ben Murdoch arguments[0] = "test"; 901b268ca467c924004286c97bac133db489cf43d0Ben Murdoch return arguments; 911b268ca467c924004286c97bac133db489cf43d0Ben Murdoch } 921b268ca467c924004286c97bac133db489cf43d0Ben Murdoch 931b268ca467c924004286c97bac133db489cf43d0Ben Murdoch assertEquals(["0", "2"], Object.keys(fastSloppyArguments2(1, 2, 3))); 941b268ca467c924004286c97bac133db489cf43d0Ben Murdoch assertEquals(["0", "2"], enumerate(fastSloppyArguments2(1, 2, 3))); 951b268ca467c924004286c97bac133db489cf43d0Ben Murdoch})(); 96