// Copyright 2016 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 TryBlockCatch() {
  var global = 0;
  function f(a) {
    var x = a + 23
    try {
      let y = a + 42;
      function capture() { return x + y }
      throw "boom!";
    } catch(e) {
      global = x;
    }
    return x;
  }
  %PrepareFunctionForOptimization(f);
  assertEquals(23, f(0));
  assertEquals(24, f(1));
  %OptimizeFunctionOnNextCall(f);
  assertEquals(25, f(2));
  assertEquals(25, global);
})();

(function TryBlockFinally() {
  var global = 0;
  function f(a) {
    var x = a + 23
    try {
      let y = a + 42;
      function capture() { return x + y }
      throw "boom!";
    } finally {
      global = x;
    }
    return x;
  }
  %PrepareFunctionForOptimization(f);
  assertThrows(function() { f(0) });
  assertThrows(function() { f(1) });
  %OptimizeFunctionOnNextCall(f);
  assertThrows(function() { f(2) });
  assertEquals(25, global);
})();

(function TryCatchCatch() {
  var global = 0;
  function f(a) {
    var x = a + 23
    try {
      try {
        throw "boom!";
      } catch(e2) {
        function capture() { return x + y }
        throw "boom!";
      }
    } catch(e) {
      global = x;
    }
    return x;
  }
  %PrepareFunctionForOptimization(f);
  assertEquals(23, f(0));
  assertEquals(24, f(1));
  %OptimizeFunctionOnNextCall(f);
  assertEquals(25, f(2));
  assertEquals(25, global);
})();

(function TryWithCatch() {
  var global = 0;
  function f(a) {
    var x = a + 23
    try {
      with ({ y : a + 42 }) {
        function capture() { return x + y }
        throw "boom!";
      }
    } catch(e) {
      global = x;
    }
    return x;
  }
  %PrepareFunctionForOptimization(f);
  assertEquals(23, f(0));
  assertEquals(24, f(1));
  %OptimizeFunctionOnNextCall(f);
  assertEquals(25, f(2));
  assertEquals(25, global);
})();
