blob: 12234edaf31b599f8ae99b92868dba258cfda9f4 [file] [log] [blame]
// 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);