"use strict";
function assert(condition, message) {
if (!condition) {
throw new Error(message || "Assertion failed");
}
}
var unreachable = 0;
function g() {
var state = 0;
var pendingThrow = null;
var closed = false;
return {
next: function () {
if (pendingThrow !== null) {
var e = pendingThrow;
pendingThrow = null;
closed = true;
throw e;
}
if (closed) {
return { value: undefined, done: true };
}
if (state === 0) {
state = 1;
return { value: 1, done: false };
}
if (state === 1) {
state = 2;
return { value: 2, done: false };
}
if (state === 3) {
unreachable += 1;
state = 4;
return { value: 4, done: false };
}
closed = true;
return { value: undefined, done: true };
},
throw: function (err) {
if (closed) {
throw err;
}
if (state === 2) {
pendingThrow = err;
state = 99;
return { value: 3, done: false };
}
throw err;
},
};
}
var iter = g();
var r1 = iter.next();
console.log("r1:", JSON.stringify(r1));
assert(r1.value === 1, 'First result `value`');
assert(r1.done === false, 'First result `done` flag');
var r2 = iter.next();
console.log("r2:", JSON.stringify(r2));
assert(r2.value === 2, 'Second result `value`');
assert(r2.done === false, 'Second result `done` flag');
try {
var r3 = iter.throw(new Error("injected"));
console.log("r3:", JSON.stringify(r3));
assert(r3.value === 3, 'Third result `value`');
assert(r3.done === false, 'Third result `done` flag');
} catch(e) {
console.log("r3 ERROR:", e.message);
assert(false, 'Error should not have propagated out of iter.throw');
}
try {
var r4 = iter.next();
console.log("r4:", JSON.stringify(r4));
assert(false, 'Error should have re-thrown after finally');
} catch(e) {
console.log("r4 caught:", e.message);
assert(e.message === "injected", 'Caught error should have message "injected"');
}
var r5 = iter.next();
console.log("r5:", JSON.stringify(r5));
assert(r5.value === undefined, 'Fifth result `value`');
assert(r5.done === true, 'Fifth result `done` flag');
console.log("unreachable:", unreachable);
assert(unreachable === 0, 'statement following pause point not executed after throw');