81 lines
2.5 KiB
JavaScript
81 lines
2.5 KiB
JavaScript
|
// 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);
|