"use strict"; function truth() { return true; } noInline(truth); function assert(cond) { if (!cond) throw new Error("broke assertion"); } noInline(assert); // Tests const NUM_LOOPS = 100; ;(function () { function foo() { const x = 20; const y = "y"; try { assert(x === 20); assert(y === "y"); throw "error"; } catch(e) { assert(x === 20); } finally { assert(x === 20); assert(y === "y"); } for (let i = 0; i < 1; i++) { let numFinally = 0; try { let a = 40; let capA = function() { return a; } assert(capA() === 40); try { const b = 41; const capB = function() { return b; } assert(capB() === 41); assert(capA() === 40); try { return 20; } catch(e){ } finally { const c = 42; const capC = function() { return c; } assert(capC() === 42); assert(capB() === 41); assert(capA() === 40); if (i === 0) { numFinally++; } return 22; } } catch(e) { } finally { if (i === 0) { numFinally++; } return 23; } } catch(e) { } finally { if (i === 0) { numFinally++; } assert(numFinally === 3); return 24; } } } for (var i = 0; i < NUM_LOOPS; i++) { assert(foo() === 24); } })(); ;(function () { function foo() { for (let i = 0; i < 1; i++) { let numFinally = 0; let numErrors = 0; try { let a = 40; let capA = function() { return a; } assert(capA() === 40); try { const b = 41; const capB = function() { return b; } assert(capB() === 41); assert(capA() === 40); try { throw "e"; } catch(e) { assert(i === 0); assert(capB() === 41); assert(capA() === 40); numErrors++; throw e; } finally { const c = 42; const capC = function() { return c; } const local = "local"; assert(local === "local"); assert(capC() === 42); assert(capB() === 41); assert(capA() === 40); if (i === 0) { numFinally++; } } } catch(e) { assert(i === 0); assert(capA() === 40); numErrors++; const local = "local"; assert(local === "local"); } finally { assert(capA() === 40); if (i === 0) { numFinally++; } const local = "local"; assert(local === "local"); return 23; } } catch(e) { //assert(i === 0); } finally { if (i === 0) { numFinally++; } assert(numFinally === 3); assert(numErrors === 2); return 24; } } } for (var i = 0; i < NUM_LOOPS; i++) { assert(foo() === 24); } })(); var d = 100; ;(function (){ function foo() { assert(d === 100); for (let i = 0; i < 1; i++) { let numFinally = 0; let numErrors = 0; const c = 44; assert(d === 100); try { const d = 45; if (truth()) { const a = 20; const capA = function() { return a; } assert(capA() === 20); if (truth()) { const b = 21; const e = 48; const capB = function() { return b; } assert(capB() === 21); assert(d === 45); try { throw "e"; } catch(e) { assert(capA() === 20); assert(a === 20); numErrors++; } finally { assert(capA() === 20); assert(e === 48); numFinally++; return 30; } } } } finally { assert(c === 44); assert(d === 100); numFinally++; assert(numFinally === 2); assert(numErrors === 1); return 40; } } } for (var i = 0; i < NUM_LOOPS; i++) { assert(foo() === 40); } })();