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