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


Debug = debug.Debug

var exception = null;
var log = [];

function listener(event, exec_state, event_data, data) {
  if (event != Debug.DebugEvent.Exception) return;
  try {
    var line = exec_state.frame(0).sourceLineText();
    var match = /Exception (\w)/.exec(line);
    assertNotNull(match);
    assertEquals(match[1], event_data.exception());
    log.push(match[1]);
  } catch (e) {
    exception = e;
  }
}


function* g() {
  try {
    throw "a";  // Ordinary throw. Exception a
  } catch (e) {}
  try {
    yield 1;  // Caught internally. Exception b
  } catch (e) {}
  yield 2;
  yield 3;    // Caught externally. Exception c
  yield 4;
}

Debug.setListener(listener);
Debug.setBreakOnException();
var g_obj = g();
assertEquals(1, g_obj.next().value);
assertEquals(2, g_obj.throw("b").value);
assertEquals(3, g_obj.next().value);
assertThrows(() => g_obj.throw("c"));
assertThrows(() => g_obj.throw("d"));  // Closed generator. Exception d
Debug.setListener(null);
Debug.clearBreakOnException();
assertEquals(["a", "b", "c", "d"], log);
assertNull(exception);
