// Copyright 2018 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 --expose-gc --turbo-inline-array-builtins
// Flags: --opt --no-always-opt

// Unknown field access leads to eager-deopt unrelated to reduceright, should
// still lead to correct result.
(() => {
  const a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
  // For this particular eager deopt point to work, we need to dodge
  // TurboFan's soft-deopts through a non-inlined and non-optimized function
  // call to foo().
  function foo(o, deopt) {
    if (deopt) {
      o.abc = 3;
    }
  }
  %NeverOptimizeFunction(foo);
  function eagerDeoptInCalled(deopt) {
    return a.reduceRight((r, v, i, o) => {
      if (i === 7) {
        foo(a, deopt);
      }
      return r + "S";
    }, "H");
  };
  %PrepareFunctionForOptimization(eagerDeoptInCalled);
  eagerDeoptInCalled();
  eagerDeoptInCalled();
  %OptimizeFunctionOnNextCall(eagerDeoptInCalled);
  eagerDeoptInCalled();
  assertEquals("HSSSSSSSSSS", eagerDeoptInCalled(true));
})();

// Make sure we gracefully handle the case of an empty array in
// optimized code.
(function() {
var nothingThere = function(only_holes) {
  var a = [1, 2, , 3];  // holey smi array.
  if (only_holes) {
    a = [
      ,
      ,
      ,
    ];  // also a holey smi array.
  }
  return a.reduceRight((r, v, i, o) => r + v);
};
;
%PrepareFunctionForOptimization(nothingThere);
nothingThere();
nothingThere();
%OptimizeFunctionOnNextCall(nothingThere);
assertThrows(() => nothingThere(true));
})();

// An error generated inside the callback includes reduce in it's
// stack trace.
(function() {
var re = /Array\.reduceRight/;
var alwaysThrows = function() {
  var b = [
    ,
    ,
    ,
  ];
  var result = 0;
  var callback = function(r, v, i, o) {
    return r + v;
  };
  b.reduceRight(callback);
};
;
%PrepareFunctionForOptimization(alwaysThrows);
try {
  alwaysThrows();
} catch (e) {
  assertTrue(re.exec(e.stack) !== null);
}
try {
  alwaysThrows();
} catch (e) {
}
try {
  alwaysThrows();
} catch (e) {
}
%OptimizeFunctionOnNextCall(alwaysThrows);
try {
  alwaysThrows();
} catch (e) {
  assertTrue(re.exec(e.stack) !== null);
}
})();
