| // 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(3, countArgs(...Object.freeze([{valueOf: () => 0}, 1.1, '2']))); // Frozen Object |
| assertEquals(3, countArgs(...Object.seal([{valueOf: () => 0}, 1.1, '2']))); // Sealed Object |
| assertEquals(3, countArgs(...Object.preventExtensions([{valueOf: () => 0}, 1.1, '2']))); // Non-extensible 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)); |
| } |
| |
| %PrepareFunctionForOptimization(tests); |
| 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)); |
| } |
| %PrepareFunctionForOptimization(testRest); |
| 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)); |
| } |
| %PrepareFunctionForOptimization(testRestAndArgs); |
| 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)); |
| } |
| %PrepareFunctionForOptimization(testArgumentsStrict); |
| 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)); |
| } |
| %PrepareFunctionForOptimization(testArgumentsSloppy); |
| testArgumentsSloppy(1, 2, 3); |
| testArgumentsSloppy(1, 2, 3); |
| %OptimizeFunctionOnNextCall(testArgumentsSloppy); |
| testArgumentsSloppy(1, 2, 3); |