var BUGNUMBER = 1202134; var summary = "Return value should not be overwritten by finally block with normal execution."; print(BUGNUMBER + ": " + summary); // ==== single ==== var f, g, v; f = function*() { // F.[[type]] is normal // B.[[type]] is return try { return 42; } finally { } }; g = f(); v = g.next(); assertEq(v.value, 42); assertEq(v.done, true); f = function*() { // F.[[type]] is return try { return 42; } finally { return 43; } }; g = f(); v = g.next(); assertEq(v.value, 43); assertEq(v.done, true); f = function*() { // F.[[type]] is throw try { return 42; } finally { throw 43; } }; var caught = false; g = f(); try { v = g.next(); } catch (e) { assertEq(e, 43); caught = true; } assertEq(caught, true); f = function*() { // F.[[type]] is break do try { return 42; } finally { break; } while (false); return 43; }; g = f(); v = g.next(); assertEq(v.value, 43); assertEq(v.done, true); f = function*() { // F.[[type]] is break L: try { return 42; } finally { break L; } return 43; }; g = f(); v = g.next(); assertEq(v.value, 43); assertEq(v.done, true); f = function*() { // F.[[type]] is continue do try { return 42; } finally { continue; } while (false); return 43; }; g = f(); v = g.next(); assertEq(v.value, 43); assertEq(v.done, true); // ==== nested ==== f = function*() { // F.[[type]] is normal // B.[[type]] is return try { return 42; } finally { // F.[[type]] is break do try { return 43; } finally { break; } while (0); } }; g = f(); v = g.next(); assertEq(v.value, 42); assertEq(v.done, true); f = function*() { // F.[[type]] is normal // B.[[type]] is return try { return 42; } finally { // F.[[type]] is break L: try { return 43; } finally { break L; } } } g = f(); v = g.next(); assertEq(v.value, 42); assertEq(v.done, true); f = function*() { // F.[[type]] is normal // B.[[type]] is return try { return 42; } finally { // F.[[type]] is continue do try { return 43; } finally { continue; } while (0); } }; g = f(); v = g.next(); assertEq(v.value, 42); assertEq(v.done, true); f = function*() { // F.[[type]] is normal // B.[[type]] is return try { return 42; } finally { // F.[[type]] is normal // B.[[type]] is normal try { // F.[[type]] is throw try { return 43; } finally { throw 9; } } catch (e) { } } }; g = f(); v = g.next(); assertEq(v.value, 42); assertEq(v.done, true); f = function*() { // F.[[type]] is return try { return 41; } finally { // F.[[type]] is normal // B.[[type]] is return try { return 42; } finally { // F.[[type]] is break do try { return 43; } finally { break; } while (0); } } }; g = f(); v = g.next(); assertEq(v.value, 42); assertEq(v.done, true); // ==== with yield ==== f = function*() { // F.[[type]] is normal // B.[[type]] is return try { return 42; } finally { yield 43; } }; g = f(); v = g.next(); assertEq(v.value, 43); assertEq(v.done, false); v = g.next(); assertEq(v.value, 42); assertEq(v.done, true); // ==== throw() ==== f = function*() { // F.[[type]] is throw try { return 42; } finally { yield 43; } }; caught = false; g = f(); v = g.next(); assertEq(v.value, 43); assertEq(v.done, false); try { v = g.throw(44); } catch (e) { assertEq(e, 44); caught = true; } assertEq(caught, true); f = function*() { // F.[[type]] is normal try { return 42; } finally { // F.[[type]] is normal // B.[[type]] is throw try { yield 43; } catch (e) { } } }; caught = false; g = f(); v = g.next(); assertEq(v.value, 43); assertEq(v.done, false); v = g.throw(44); assertEq(v.value, 42); assertEq(v.done, true); // ==== return() ==== f = function*() { // F.[[type]] is return try { return 42; } finally { yield 43; } }; caught = false; g = f(); v = g.next(); assertEq(v.value, 43); assertEq(v.done, false); v = g.return(44); assertEq(v.value, 44); assertEq(v.done, true); f = function*() { // F.[[type]] is normal // B.[[type]] is return try { yield 42; } finally { // F.[[type]] is continue do try { return 43; } finally { continue; } while (0); } }; caught = false; g = f(); v = g.next(); assertEq(v.value, 42); assertEq(v.done, false); v = g.return(44); assertEq(v.value, 44); assertEq(v.done, true); if (typeof reportCompare === "function") reportCompare(true, true);