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

function f() {
  throw new Error();
}

function g() {
  try {
    f();
  } catch (e) {
    return 1;  // Break
  }
}

function h() {
  return g();
}

h();
h();

var Debug = debug.Debug;
var step_count = 0;
var exception = null;

function listener(event, exec_state, event_data, data) {
  if (event == Debug.DebugEvent.Exception) {
    step_count++;
    exec_state.prepareStep(Debug.StepAction.StepNext);
  } else if (event == Debug.DebugEvent.Break) {
    step_count++;
    try {
      assertTrue(exec_state.frame().sourceLineText().includes('Break'));
    } catch (e) {
      exception = e;
      print(e);
    }
  }
}

Debug.setListener(listener);
Debug.setBreakOnException();
%OptimizeFunctionOnNextCall(h);
h();
Debug.setListener(null);
assertNull(exception);
