From: headius@... Date: 2017-08-29T18:25:05+00:00 Subject: [ruby-core:82515] [Ruby trunk Bug#13844] Toplevel returns should fire ensures Issue #13844 has been updated by headius (Charles Nutter). I do not assume it was intentional, but it was codified by tests added along with the toplevel return change. See test_syntax.rb in test_return_toplevel, where it tests that each of the following lines should exit silently: ```ruby return; raise begin return; rescue SystemExit; exit false; end begin return; ensure exit false; end begin ensure return; end begin raise; ensure; return; end begin raise; rescue; return; end return false; raise return 1; raise ``` The first ensure line there is in my opinion incorrect; it *should* exit with failure. The funny thing about this case is that the first ensure is *not* expected to fire, and the other two *are* expected to fire. I don't think the intent of toplevel return was to immediately exit the current script. I think the intent was to unroll the stack back to above the require or load that loaded this script, exactly like unrolling the stack to the method that called this one in a normal method ensure. ---------------------------------------- Bug #13844: Toplevel returns should fire ensures https://bugs.ruby-lang.org/issues/13844#change-66325 * Author: headius (Charles Nutter) * Status: Open * Priority: Normal * Assignee: * Target version: * ruby -v: ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-darwin16] * Backport: 2.2: UNKNOWN, 2.3: UNKNOWN, 2.4: UNKNOWN ---------------------------------------- In the following contexts, a return always fires the ensure that wraps it: ``` [] ~/projects/ruby $ ruby -e 'def foo; return; ensure; p :x; end; foo' :x [] ~/projects/ruby $ ruby -e 'def foo; 1.times { begin; return; ensure; p :x; end }; end; foo' :x ``` However the new 2.4 support for toplevel returns does *not* fire ensures: ``` $ ruby -e 'begin; return; ensure; p :x; end' ``` I believe this is inconsistent with how returns work everywhere else (both valid and invalid returns always fire ensure) and it should be changed to match. -- https://bugs.ruby-lang.org/ Unsubscribe: