// Copyright 2016 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Flags: --allow-natives-syntax function tests() { "use strict" function countArgs() { return arguments.length; } // Array params assertEquals(3, countArgs(...[1, 2, 3])); // Smi assertEquals(4, countArgs(...[1, 2, , 3])); // HoleySmi assertEquals(3, countArgs(...[1.1, 2, 3])); // Double assertEquals(4, countArgs(...[1.1, 2, , 3])); // HoleyDouble assertEquals(3, countArgs(...[{valueOf: () => 0}, 1.1, '2'])); // Object assertEquals( 4, countArgs(...[{valueOf: () => 0}, 1.1, , '2'])); // HoleyObject // Smi param assertThrows(() => countArgs(...1), TypeError); // Object param assertThrows(() => countArgs(...{0: 0}), TypeError); // Strict arguments assertEquals(0, countArgs(...arguments)); } tests(); tests(); %OptimizeFunctionOnNextCall(tests); tests(); function testRest(...args) { function countArgs() { return arguments.length; } assertEquals(3, countArgs(...args)); assertEquals(4, countArgs(1, ...args)); assertEquals(5, countArgs(1, 2, ...args)); } testRest(1, 2, 3); testRest(1, 2, 3); %OptimizeFunctionOnNextCall(testRest); testRest(1, 2, 3); function testRestAndArgs(a, b, ...args) { function countArgs() { return arguments.length; } assertEquals(1, countArgs(...args)); assertEquals(2, countArgs(b, ...args)); assertEquals(3, countArgs(a, b, ...args)); assertEquals(4, countArgs(1, a, b, ...args)); assertEquals(5, countArgs(1, 2, a, b, ...args)); } testRestAndArgs(1, 2, 3); testRestAndArgs(1, 2, 3); %OptimizeFunctionOnNextCall(testRestAndArgs); testRestAndArgs(1, 2, 3); function testArgumentsStrict() { "use strict" function countArgs() { return arguments.length; } assertEquals(3, countArgs(...arguments)); assertEquals(4, countArgs(1, ...arguments)); assertEquals(5, countArgs(1, 2, ...arguments)); } testArgumentsStrict(1, 2, 3); testArgumentsStrict(1, 2, 3); %OptimizeFunctionOnNextCall(testArgumentsStrict); testArgumentsStrict(1, 2, 3); function testArgumentsSloppy() { function countArgs() { return arguments.length; } assertEquals(3, countArgs(...arguments)); assertEquals(4, countArgs(1, ...arguments)); assertEquals(5, countArgs(1, 2, ...arguments)); } testArgumentsSloppy(1, 2, 3); testArgumentsSloppy(1, 2, 3); %OptimizeFunctionOnNextCall(testArgumentsSloppy); testArgumentsSloppy(1, 2, 3);