// Copyright 2019 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.

(function() {

function Simple() {
  new Error("Simple Error");
}

class CustomError extends Error {};
function Custom() {
  new CustomError("Custom Error");
}

function Inline() {
  function Inner() {
    new Error("Error from inlined function!");
  }
  function Middle() { Inner(); }
  function Outer() { Middle(); }

  %PrepareFunctionForOptimization(Outer);
  Outer();
  Outer();
  %OptimizeFunctionOnNextCall(Outer);
  Outer();
}

const kInitialRecursionValue = 10;
function Recursive() {
  function StepOne(val) {
    if (val <= 0) return new Error("Error in StepOne!");
    StepTwo(val - 3);
    StepTwo(val - 4);
  }
  function StepTwo(val) {
    if (val <= 0) return new Error("Error in StepTwo!");
    StepOne(val - 1);
    StepOne(val - 2);
  }

  StepOne(kInitialRecursionValue);
}

createSuite('Simple-Capture-Error', 1000, Simple, () => {});
createSuite('Custom-Capture-Error', 1000, Custom, () => {});

createSuite('Inline-Capture-Error', 1000, Inline, () => {});
createSuite('Recursive-Capture-Error', 1000, Recursive, () => {});

})();