// Copyright 2017 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() { 'use strict'; function testBaselineAndOpt(func) { %PrepareFunctionForOptimization(func); func(-1, -2); func(-1, -2); %OptimizeFunctionOnNextCall(func); return func(-1, -2); } // Rest parameters function RestMax(...args) { return Math.max(...args); } var r = testBaselineAndOpt(function(x, y) { return RestMax(x, y); }); assertEquals(r, -1); function RestMaxWithZero(...args) { return Math.max(0, ...args); } var r = testBaselineAndOpt(function(x, y) { return RestMaxWithZero(x, y); }); assertEquals(r, 0); function RestMaxOneArg(x, ...args) { return Math.max(-10, ...args); } r = testBaselineAndOpt(function(x, y) { return RestMaxOneArg(x, y); }); assertEquals(r, -2); // Strict Arguments Object function ArgumentsMax() { return Math.max(...arguments); } var r = testBaselineAndOpt(function(x, y) { return ArgumentsMax(x, y); }); assertEquals(r, -1); function ArgumentsMaxWithZero() { return Math.max(0, ...arguments); } var r = testBaselineAndOpt(function(x, y) { return ArgumentsMaxWithZero(x, y); }); assertEquals(r, 0); function ArgumentsMaxOneArg(x) { return Math.max(-10, ...arguments); } var r = testBaselineAndOpt(function(x, y) { return ArgumentsMaxOneArg(x, y); }); assertEquals(r, -1); })(); (function() { function testBaselineAndOpt(func) { %PrepareFunctionForOptimization(func); func(-1, -2); func(-1, -2); %OptimizeFunctionOnNextCall(func); return func(-1, -2); } // Sloppy Arguments Object function ArgumentsMax() { return Math.max(...arguments); } var r = testBaselineAndOpt(function(x, y) { return ArgumentsMax(x, y); }); assertEquals(r, -1); function ArgumentsMaxWithZero() { return Math.max(0, ...arguments); } var r = testBaselineAndOpt(function(x, y) { return ArgumentsMaxWithZero(x, y); }); assertEquals(r, 0); function ArgumentsMaxOneArg(x) { return Math.max(-10, ...arguments); } var r = testBaselineAndOpt(function(x, y) { return ArgumentsMaxOneArg(x, y); }); assertEquals(r, -1); })();