text: // 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) {
      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) {
      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);
  })();
  