var BUGNUMBER = 1202134; var summary = "Return value should not be overwritten by finally block with normal execution."; print(BUGNUMBER + ": " + summary); // ==== single ==== var f; f = function() { // F.[[type]] is normal // B.[[type]] is return try { return 42; } finally { } }; assertEq(f(), 42); f = function() { // F.[[type]] is return try { return 42; } finally { return 43; } }; assertEq(f(), 43); f = function() { // F.[[type]] is throw try { return 42; } finally { throw 43; } }; var caught = false; try { f(); } 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; }; assertEq(f(), 43); f = function() { // F.[[type]] is break L: try { return 42; } finally { break L; } return 43; }; assertEq(f(), 43); f = function() { // F.[[type]] is continue do try { return 42; } finally { continue; } while (false); return 43; }; assertEq(f(), 43); // ==== 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); } }; assertEq(f(), 42); 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; } } } assertEq(f(), 42); 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); } }; assertEq(f(), 42); 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) { } } }; assertEq(f(), 42); 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); } } }; assertEq(f(), 42); if (typeof reportCompare === "function") reportCompare(true, true);