throw-during-nested-break.js (748B)
1 var progress = ""; 2 3 function* wrapNoThrow() { 4 let iter = { 5 [Symbol.iterator]() { return this; }, 6 next() { return { value: 10, iter: false }; }, 7 return() { progress += " throw"; throw "nonsense"; } 8 }; 9 for (const i of iter) 10 yield i; 11 } 12 13 function foo() { 14 try { 15 var badIter = wrapNoThrow(); 16 loop: for (var i of badIter) { 17 progress += "outerloop"; 18 try { 19 for (i of [1,2,3]) { 20 progress += " innerloop"; 21 break loop; 22 } 23 } catch (e) { progress += " BAD CATCH"; } 24 } 25 } catch (e) { progress += " goodcatch"; } 26 } 27 28 foo(); 29 assertEq(progress, "outerloop innerloop throw goodcatch");