| // 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 | |
| let error = false; | |
| let uncaught; | |
| function listener(event, exec_state, event_data, data) { | |
| if (event != Debug.DebugEvent.Exception) return; | |
| try { | |
| uncaught = event_data.uncaught(); | |
| } catch (e) { | |
| error = true; | |
| } | |
| } | |
| Debug.setBreakOnException(); | |
| Debug.setListener(listener); | |
| function assertCaught(f) { | |
| try {f()} finally { | |
| assertFalse(uncaught); | |
| return; | |
| } | |
| } | |
| function assertUncaught(f) { | |
| try {f()} finally { | |
| assertTrue(uncaught); | |
| return; | |
| } | |
| } | |
| assertUncaught(() => { | |
| for (var a of [1, 2, 3]) { | |
| throw a | |
| } | |
| }); | |
| assertUncaught(() => { | |
| for (var a of [1, 2, 3]) { | |
| try {throw a} finally {} | |
| } | |
| }); | |
| assertCaught(() => { | |
| for (var a of [1, 2, 3]) { | |
| try { | |
| try {throw a} finally {} | |
| } catch(_) {} | |
| } | |
| }); | |
| assertCaught(() => { | |
| try { | |
| for (var a of [1, 2, 3]) { | |
| try {throw a} finally {} | |
| } | |
| } catch(_) {} | |
| }); | |
| // Check that an internal exception in our yield* desugaring is not observable. | |
| { | |
| uncaught = null; | |
| let iter = { | |
| next() {return {value:42, done:false}}, | |
| throw() {return {done:true}} | |
| }; | |
| let iterable = {[Symbol.iterator]() {return iter}}; | |
| function* f() { yield* iterable } | |
| let g = f(); | |
| g.next(); | |
| assertEquals({value: undefined, done: true}, g.throw()); | |
| assertNull(uncaught); // No exception event was generated. | |
| } | |
| assertFalse(error); |