// 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.
(() => {

// Make sure we inline the callback, pick up all possible TurboFan
// optimizations.
function RunOptFastReduce(multiple) {
  // Use of multiple variables in the callback function forces
  // context creation without escape analysis.
  //
  // Also, the arrow function requires inlining based on
  // SharedFunctionInfo.
  result = array.reduce((p, v, i, a) => p + multiple);
}

// Don't optimize because I want to optimize RunOptFastMap with a parameter
// to be used in the callback.
%NeverOptimizeFunction(OptFastReduce);
function OptFastReduce() { RunOptFastReduce(3); }

function side_effect(a) { return a; }
%NeverOptimizeFunction(side_effect);
function OptUnreliableReduce() {
  result = array.reduce(func, side_effect(array));
}

DefineHigherOrderTests([
  // name, test function, setup function, user callback
  ['DoubleReduce', newClosure('reduce'), DoubleSetup, (p, v, i, o) => p + v],
  ['SmiReduce', newClosure('reduce'), SmiSetup, (p, v, i, a) => p + 1],
  ['FastReduce', newClosure('reduce'), FastSetup, (p, v, i, a) => p + v],
  ['OptFastReduce', OptFastReduce, FastSetup, undefined],
  [
    'OptUnreliableReduce', OptUnreliableReduce, FastSetup, (p, v, i, a) => p = v
  ]
]);

})();
