// Copyright 2014 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() {
  var a = 1;
  var b = 2;
  return a + b;
}

var exception = null;
var break_count = 0;
var throw_count = 0;

function listener(event, exec_state, event_data, data) {
  try {
    if (event == Debug.DebugEvent.Break) {
      break_count++;
      // Disable all breakpoints from within the debug event callback.
      Debug.debuggerFlags().breakPointsActive.setValue(false);
    } else if (event = Debug.DebugEvent.Exception) {
      throw_count++;
      // Enable all breakpoints from within the debug event callback.
      Debug.debuggerFlags().breakPointsActive.setValue(true);
    }
  } catch (e) {
    exception = e;
  }
}

Debug = debug.Debug;

Debug.setListener(listener);
Debug.setBreakOnException();
Debug.setBreakPoint(f, 2);

f();
f();

assertEquals(1, break_count);
assertEquals(0, throw_count);

// Trigger exception event.
try { throw 1; } catch (e) {}

f();
f();

Debug.setListener(null);
Debug.clearBreakOnException();
Debug.debuggerFlags().breakPointsActive.setValue(true);

assertEquals(2, break_count);
assertEquals(1, throw_count);
assertNull(exception);
