Bug #16695
closedStack consistency error when using the return value
Description
Some versions of ruby occur Stack consistency error
by following the reproduction code.
Reproduction code¶
x = false; y = (return until x unless x)
Per versions¶
- 2.3.8
unexpected return (LocalJumpError)
- 2.4.9
- no problem
- 2.5.7, 2.6.5, 2.7.0
Stack consistency error
Backtrace (2.7.0p0)¶
-e:1: [BUG] Stack consistency error (sp: 7, bp: 8) ruby 2.7.0p0 (2019-12-25 revision 647ee6f091) [x86_64-darwin18] -- Crash Report log information -------------------------------------------- See Crash Report log file under the one of following: * ~/Library/Logs/DiagnosticReports * /Library/Logs/DiagnosticReports for more details. Don't forget to include the above Crash Report log file in bug reports. -- Control frame information ----------------------------------------------- c:0002 p:0020 s:0007 E:0004c0 EVAL -e:1 [FINISH] c:0001 p:0000 s:0003 E:002260 (none) [FINISH] -- Ruby level backtrace information ---------------------------------------- -e:1:in `<main>' -- C level backtrace information ------------------------------------------- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/libruby.2.7.dylib(rb_vm_bugreport+0x96) [0x1058bc6d6] /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/libruby.2.7.dylib(rb_bug+0xd4) [0x1058c7fae] /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/libruby.2.7.dylib(vm_stack_consistency_error.cold.1+0x2a) [0x1058ca09a] /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/libruby.2.7.dylib(vm_stack_consistency_error+0x12) [0x1058b4cd2] /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/libruby.2.7.dylib(vm_exec_core+0x43cf) [0x105897a3f] /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/libruby.2.7.dylib(rb_vm_exec+0xa49) [0x1058aa529] /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/libruby.2.7.dylib(rb_ec_exec_node+0xb6) [0x105715d06] /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/libruby.2.7.dylib(ruby_run_node+0x55) [0x105715c05] /Users/takamasa-saichi/.rbenv/versions/2.7.0/bin/ruby(main+0x5d) [0x105673f0d] -- Other runtime information ----------------------------------------------- * Loaded script: -e * Loaded features: 0 enumerator.so 1 thread.rb 2 rational.so 3 complex.so 4 ruby2_keywords.rb 5 /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/encdb.bundle 6 /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 7 /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/rbconfig.rb 8 /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/rubygems/compatibility.rb 9 /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/rubygems/defaults.rb 10 /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/rubygems/deprecate.rb 11 /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/rubygems/errors.rb 12 /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/rubygems/version.rb 13 /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/rubygems/requirement.rb 14 /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/rubygems/platform.rb 15 /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/rubygems/basic_specification.rb 16 /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/rubygems/stub_specification.rb 17 /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/rubygems/util.rb 18 /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/rubygems/text.rb 19 /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/rubygems/user_interaction.rb 20 /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/rubygems/specification_policy.rb 21 /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/rubygems/util/list.rb 22 /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/rubygems/specification.rb 23 /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/rubygems/exceptions.rb 24 /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/rubygems/bundler_version_finder.rb 25 /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/rubygems/dependency.rb 26 /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/rubygems/core_ext/kernel_gem.rb 27 /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/monitor.bundle 28 /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/monitor.rb 29 /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb 30 /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/rubygems/core_ext/kernel_warn.rb 31 /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/rubygems.rb 32 /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/rubygems/path_support.rb 33 /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/did_you_mean/version.rb 34 /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/did_you_mean/core_ext/name_error.rb 35 /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/did_you_mean/levenshtein.rb 36 /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/did_you_mean/jaro_winkler.rb 37 /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/did_you_mean/spell_checker.rb 38 /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/did_you_mean/spell_checkers/name_error_checkers/class_name_checker.rb 39 /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/did_you_mean/spell_checkers/name_error_checkers/variable_name_checker.rb 40 /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/did_you_mean/spell_checkers/name_error_checkers.rb 41 /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/did_you_mean/spell_checkers/method_name_checker.rb 42 /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/did_you_mean/spell_checkers/key_error_checker.rb 43 /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/did_you_mean/spell_checkers/null_checker.rb 44 /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/did_you_mean/formatters/plain_formatter.rb 45 /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/did_you_mean/tree_spell_checker.rb 46 /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/did_you_mean.rb * Process memory map: 105673000-105674000 r-x /Users/takamasa-saichi/.rbenv/versions/2.7.0/bin/ruby 105674000-105675000 rw- /Users/takamasa-saichi/.rbenv/versions/2.7.0/bin/ruby 105675000-105676000 r-- /Users/takamasa-saichi/.rbenv/versions/2.7.0/bin/ruby 105676000-105678000 rw- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/libruby.2.7.dylib 105678000-105679000 r-- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/libruby.2.7.dylib 105679000-10596b000 r-x /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/libruby.2.7.dylib 10596b000-105972000 rw- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/libruby.2.7.dylib 105972000-10598a000 rw- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/libruby.2.7.dylib 10598a000-105a73000 r-- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/libruby.2.7.dylib 105a73000-105a74000 r-- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/encdb.bundle 105a74000-105a75000 rw- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/encdb.bundle 105a75000-105a76000 --- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/encdb.bundle 105a76000-105a7c000 rw- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/encdb.bundle 105a7c000-105a7d000 --- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/encdb.bundle 105a7d000-105a7e000 --- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/encdb.bundle 105a7e000-105a84000 rw- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/encdb.bundle 105a84000-105a85000 --- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/encdb.bundle 105a85000-105a86000 r-- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/encdb.bundle 105a86000-105ac6000 rw- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/encdb.bundle 105ac6000-105ae1000 rw- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/encdb.bundle 105ae1000-105be1000 rw- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/encdb.bundle 105be1000-105be3000 r-x /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/encdb.bundle 105be3000-105be4000 rw- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/encdb.bundle 105be4000-105be5000 r-- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/encdb.bundle 105be5000-105be6000 r-x /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/monitor.bundle 105be6000-105be7000 rw- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/monitor.bundle 105be7000-105be8000 r-- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/monitor.bundle 105be8000-107be8000 rw- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 107be8000-107bfc000 rw- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 107bfc000-107c14000 rw- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 107c14000-107c15000 --- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 107c15000-107cb6000 rw- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 107cb6000-107cb7000 --- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 107cb7000-107d58000 rw- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 107d58000-107d59000 --- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 107d59000-107dfa000 rw- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 107dfa000-107dfb000 --- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 107dfb000-107e9c000 rw- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 107e9c000-107e9d000 --- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 107e9d000-107f3e000 rw- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 107f3e000-107f3f000 --- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 107f3f000-107fe0000 rw- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 107fe0000-107fe1000 --- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 107fe1000-108082000 rw- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 108082000-108083000 --- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 108083000-108124000 rw- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 108124000-108125000 --- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 108125000-1081c6000 rw- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 1081c6000-1081c7000 --- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 1081c7000-108268000 rw- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 108268000-108269000 --- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 108269000-10830a000 rw- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 10830a000-10830b000 --- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 10830b000-1083ac000 rw- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 1083ac000-1083ad000 --- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 1083ad000-10844e000 rw- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 10844e000-10844f000 --- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 10844f000-1084f0000 rw- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 1084f0000-1084f1000 --- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 1084f1000-108592000 rw- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 108592000-108593000 --- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 108593000-108634000 rw- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 108634000-108635000 --- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 108635000-1086d6000 rw- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 1086d6000-1086d7000 --- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 1086d7000-108778000 rw- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 108778000-108779000 --- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 108779000-10881a000 rw- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 10881a000-10881b000 --- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 10881b000-1088bc000 rw- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 1088bc000-1088bd000 --- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 1088bd000-10895e000 rw- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 10895e000-10895f000 --- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 10895f000-108a00000 rw- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 108a00000-108a01000 --- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 108a01000-108aa2000 rw- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 108aa2000-108aa3000 --- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 108aa3000-108b44000 rw- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 108b44000-108b45000 --- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 108b45000-108be6000 rw- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 108be6000-108be7000 --- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 108be7000-108c88000 rw- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 108c88000-108c89000 --- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 108c89000-108d2a000 rw- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 108d2a000-108d2b000 --- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 108d2b000-108dcc000 rw- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 108dcc000-108dcd000 --- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 108dcd000-108e6e000 rw- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 108e6e000-108e6f000 --- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 108e6f000-108f10000 rw- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 108f10000-108f11000 --- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 108f11000-108fb2000 rw- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 108fb2000-108fb3000 --- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 108fb3000-109054000 rw- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 109054000-10906c000 rw- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 10906c000-10906e000 r-x /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 10906e000-10906f000 rw- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 10906f000-109070000 r-- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/ruby/2.7.0/x86_64-darwin18/enc/trans/transdb.bundle 109070000-10907f000 rw- /Users/takamasa-saichi/.rbenv/versions/2.7.0/bin/ruby 10907f000-109097000 rw- /Users/takamasa-saichi/.rbenv/versions/2.7.0/bin/ruby 109097000-1090b4000 rw- /Users/takamasa-saichi/.rbenv/versions/2.7.0/bin/ruby 1090b4000-1090ed000 rw- /Users/takamasa-saichi/.rbenv/versions/2.7.0/bin/ruby 1090ed000-1090f0000 r-- /Users/takamasa-saichi/.rbenv/versions/2.7.0/bin/ruby 1090f0000-1094d2000 r-- /Users/takamasa-saichi/.rbenv/versions/2.7.0/lib/libruby.2.7.dylib 11382c000-113897000 r-x /usr/lib/dyld 113897000-11389c000 rw- /usr/lib/dyld 11389c000-1138d0000 rw- /usr/lib/dyld 1138d0000-1138f7000 r-- /usr/lib/dyld 7000025f1000-7000025f2000 --- /usr/lib/dyld 7000025f2000-700002674000 rw- /usr/lib/dyld 7fce95400000-7fce95500000 rw- /usr/lib/dyld 7fce95500000-7fce95600000 rw- /usr/lib/dyld 7fce95600000-7fce95700000 rw- /usr/lib/dyld 7fce95700000-7fce95800000 rw- /usr/lib/dyld 7fce95800000-7fce96000000 rw- /usr/lib/dyld 7fce96000000-7fce96800000 rw- /usr/lib/dyld 7fce96800000-7fce96900000 rw- /usr/lib/dyld 7fce96900000-7fce96a00000 rw- /usr/lib/dyld 7fce96a00000-7fce96b00000 rw- /usr/lib/dyld 7fce96b00000-7fce96c00000 rw- /usr/lib/dyld 7fce96c00000-7fce96d00000 rw- /usr/lib/dyld 7fce97000000-7fce97800000 rw- /usr/lib/dyld 7fce97800000-7fce98000000 rw- /usr/lib/dyld 7fce98000000-7fce98800000 rw- /usr/lib/dyld 7fce98800000-7fce99000000 rw- /usr/lib/dyld 7fce99000000-7fce99800000 rw- /usr/lib/dyld 7ffee658d000-7ffee9d8d000 --- /usr/lib/dyld 7ffee9d8d000-7ffeea58d000 rw- /usr/lib/dyld 7fff00000000-7fff80000000 r-- /usr/lib/dyld 7fff80000000-7fff95f59000 r-- /usr/lib/dyld 7fff95f59000-7fff96000000 rw- /usr/lib/dyld 7fff96000000-7fff9c000000 r-- /usr/lib/dyld 7fff9c000000-7fff9c200000 rw- /usr/lib/dyld 7fff9c200000-7fff9c800000 r-- /usr/lib/dyld 7fff9c800000-7fff9ca00000 rw- /usr/lib/dyld 7fff9ca00000-7fff9cc00000 rw- /usr/lib/dyld 7fff9cc00000-7fff9ce00000 rw- /usr/lib/dyld 7fff9ce00000-7fff9d000000 rw- /usr/lib/dyld 7fff9d000000-7fff9d200000 rw- /usr/lib/dyld 7fff9d200000-7fff9d400000 rw- /usr/lib/dyld 7fff9d400000-7fff9e400000 r-- /usr/lib/dyld 7fff9e400000-7fff9e600000 rw- /usr/lib/dyld 7fff9e600000-7fffa0200000 r-- /usr/lib/dyld 7fffa0200000-7fffa0400000 rw- /usr/lib/dyld 7fffa0400000-7fffa1200000 r-- /usr/lib/dyld 7fffa1200000-7fffa1400000 rw- /usr/lib/dyld 7fffa1400000-7fffa3600000 r-- /usr/lib/dyld 7fffa3600000-7fffa3800000 rw- /usr/lib/dyld 7fffa3800000-7fffa3a00000 rw- /usr/lib/dyld 7fffa3a00000-7fffa3c00000 rw- /usr/lib/dyld 7fffa3c00000-7fffa3e00000 rw- /usr/lib/dyld 7fffa3e00000-7fffa4000000 rw- /usr/lib/dyld 7fffa4000000-7fffa402e000 rw- /usr/lib/dyld 7fffa402e000-7fffc0000000 r-- /usr/lib/dyld 7fffc0000000-7fffffe00000 r-- /usr/lib/dyld 7fffffe00000-7fffffe01000 r-- /usr/lib/dyld 7ffffff03000-7ffffff04000 r-x /usr/lib/dyld [IMPORTANT] Don't forget to include the Crash Report log file under DiagnosticReports directory in bug reports.
Files
Related issues
Updated by nobu (Nobuyoshi Nakada) about 1 year ago
- Backport changed from 2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: UNKNOWN to 2.5: REQUIRED, 2.6: REQUIRED, 2.7: REQUIRED
Thank you for the interesting report.
I confirmed that this has existed since 1.9.1 at least, by wrapping in a method.
$ ruby1.9 -e 'def f;x = false; y = (return until x unless x);end;f' -e:1: [BUG] Stack consistency error (sp: 10, bp: 11) ruby 1.9.3p551 (2014-11-13 revision 48407) [x86_64-darwin19.0.0]
Updated by jeremyevans0 (Jeremy Evans) 11 months ago
This is due to a bug in the optimizer. Adding return COMPILE_OK;
to the top of iseq_peephole_optimize
fixes the problem.
Instructions before (optimization/broken):
== disasm: #<ISeq:<main>@-e:1 (1,0)-(1,52)> (catch: FALSE) 0000 definemethod :f, f ( 1)[Li] 0003 putself 0004 opt_send_without_block <calldata!mid:f, argc:0, FCALL|VCALL|ARGS_SIMPLE> 0006 leave == disasm: #<ISeq:f@-e:1 (1,0)-(1,50)> (catch: FALSE) == catch table | catch type: break st: 0017 ed: 0025 sp: 0001 cont: 0025 | catch type: next st: 0017 ed: 0025 sp: 0001 cont: 0014 | catch type: redo st: 0017 ed: 0025 sp: 0001 cont: 0017 |------------------------------------------------------------------------ local table (size: 2, argc: 0 [opts: 0, rest: -1, post: 0, block: -1, kw: -1@-1, kwrest: -1]) [ 2] x@0 [ 1] y@1 0000 putobject false ( 1)[LiCa] 0002 setlocal_WC_0 x@0 0004 getlocal_WC_0 x@0 0006 branchunless 20 0008 putnil 0009 jump 26 0011 jump 20 0013 putnil 0014 pop 0015 jump 20 0017 pop 0018 putnil 0019 leave [Re] 0020 getlocal_WC_0 x@0 0022 branchunless 17 0024 putnil 0025 nop 0026 dup ( 1) 0027 setlocal_WC_0 y@1 0029 leave [Re]
Instructions after (no optimization/working):
== disasm: #<ISeq:<main>@t/t29.rb:1 (1,0)-(5,1)> (catch: FALSE) 0000 definemethod :f, f ( 1)[Li] 0003 putself ( 5)[Li] 0004 opt_send_without_block <calldata!mid:f, argc:0, FCALL|VCALL|ARGS_SIMPLE> 0006 leave == disasm: #<ISeq:f@t/t29.rb:1 (1,0)-(4,3)> (catch: FALSE) == catch table | catch type: break st: 0019 ed: 0028 sp: 0000 cont: 0028 | catch type: next st: 0019 ed: 0028 sp: 0000 cont: 0016 | catch type: redo st: 0019 ed: 0028 sp: 0000 cont: 0019 |------------------------------------------------------------------------ local table (size: 2, argc: 0 [opts: 0, rest: -1, post: 0, block: -1, kw: -1@-1, kwrest: -1]) [ 2] x@0 [ 1] y@1 0000 putobject false ( 2)[LiCa] 0002 setlocal_WC_0 x@0 0004 getlocal_WC_0 x@0 ( 3)[Li] 0006 branchunless 13 0008 jump 10 0010 putnil 0011 jump 29 0013 jump 21 0015 putnil 0016 pop 0017 jump 21 0019 putnil 0020 leave [Re] 0021 getlocal_WC_0 x@0 0023 branchunless 19 0025 jump 27 0027 putnil 0028 nop 0029 dup ( 3) 0030 setlocal_WC_0 y@1 0032 leave ( 4)[Re]
One thing that jumps out at me is the optimized version uses pop
between jump
and putnil
(instruction 0017). That could be why sp
is lower than bp
. However, I don't have that much experience reading iseq instructions, so that's more of a guess than anything.
Updated by jeremyevans0 (Jeremy Evans) 11 months ago
Through trial and error, I've determined this is caused by the branchif/branchnil/branchunless optimization, self described as a super nasty hack. I've submitted a pull request to disable this optimization (https://github.com/ruby/ruby/pull/3150), and think it should be committed until someone can debug the optimization and fix it (assuming it passes CI).
Updated by wanabe (_ wanabe) 8 months ago
How about adjust sp in dead code that is after jump
?
diff --git a/compile.c b/compile.c
index dfa3802579..85cbd42893 100644
--- a/compile.c
+++ b/compile.c
@@ -5386,6 +5386,9 @@ compile_if(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node, int
branches);
end_label = NEW_LABEL(line);
ADD_INSNL(then_seq, line, jump, end_label);
+ if (!popped) {
+ ADD_INSN(then_seq, line, pop);
+ }
}
ADD_SEQ(ret, then_seq);
}
Updated by wanabe (_ wanabe) 8 months ago
Oops, my patch is duplicated at 43c1eb440a7 == r61618 partially so I must revert it at first.
diff --git a/compile.c b/compile.c
index dfa3802579..2766e985c3 100644
--- a/compile.c
+++ b/compile.c
@@ -2836,7 +2836,6 @@ iseq_peephole_optimize(rb_iseq_t *iseq, LINK_ELEMENT *list, const int do_tailcal
goto again;
}
else if (IS_INSN_ID(diobj, leave)) {
- INSN *pop;
/*
* jump LABEL
* ...
@@ -2844,7 +2843,6 @@ iseq_peephole_optimize(rb_iseq_t *iseq, LINK_ELEMENT *list, const int do_tailcal
* leave
* =>
* leave
- * pop
* ...
* LABEL:
* leave
@@ -2854,9 +2852,6 @@ iseq_peephole_optimize(rb_iseq_t *iseq, LINK_ELEMENT *list, const int do_tailcal
iobj->insn_id = BIN(leave);
iobj->operand_size = 0;
iobj->insn_info = diobj->insn_info;
- /* adjust stack depth */
- pop = new_insn_body(iseq, diobj->insn_info.line_no, BIN(pop), 0);
- ELEM_INSERT_NEXT(&iobj->link, &pop->link);
goto again;
}
else if (IS_INSN(iobj->link.prev) &&
@@ -5386,6 +5381,9 @@ compile_if(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node, int
branches);
end_label = NEW_LABEL(line);
ADD_INSNL(then_seq, line, jump, end_label);
+ if (!popped) {
+ ADD_INSN(then_seq, line, pop);
+ }
}
ADD_SEQ(ret, then_seq);
}
Updated by wanabe (_ wanabe) 8 months ago
- Related to Bug #14273: Stack Consistency Error from return in loop added
Updated by wanabe (_ wanabe) 8 months ago
Maybe there are some potential issues.
$ ruby -v -e 'RubyVM::InstructionSequence.compile("def f; return 1 unless true or any; end", peephole_optimization: false).eval' ruby 2.8.0dev (2020-08-02T03:05:19Z wanabe/master ac69849e49) [x86_64-linux] -- raw disasm-------- trace: 8 trace: 1 0000 jump <L000> ( 1) * 0002 branchunless <L001> ( 1) 0004 jump <L000> ( 1) <L000> [sp: 0] 0006 putnil ( 1) 0007 jump <L003> ( 1) <L001> [sp: -1] 0009 putobject_INT2FIX_1_ ( 1) <L003> [sp: -1] trace: 10 0010 leave ( 1) --------------------- <compiled>: <compiled>:1: argument stack underflow (-1) (SyntaxError)
$ ruby -v -e 'def f; return 1 if false and any; nil; end' ruby 2.8.0dev (2020-08-02T03:05:19Z wanabe/master ac69849e49) [x86_64-linux] -- raw disasm-------- trace: 8 trace: 1 0000 jump <L001> ( 1) * 0002 branchunless <L001> ( 1) <L003> [sp: -1] adjust: [label: -1] 0004 putobject_INT2FIX_1_ ( 1) trace: 10 0005 leave ( 1) adjust: [label: 3] <L001> [sp: 0] 0006 putnil ( 1) trace: 10 0007 leave ( 1) --------------------- -e: -e:1: argument stack underflow (-1) (SyntaxError)
I sent Pull Request to fix some issues I found.
https://github.com/ruby/ruby/pull/3402
Updated by wanabe (_ wanabe) 7 months ago
I rewrited the patch https://github.com/ruby/ruby/pull/3445 on 2020-08-22.
I would appreciate it if someone could review this.
Updated by wanabe (_ wanabe) 6 months ago
- Status changed from Open to Closed
Applied in changeset git|ce7a053475cbebfb2f3e5ed6614e0ba631541917.
Adjust sp for x = false; y = (return until x unless x)
[Bug #16695]
Updated by nagachika (Tomoyuki Chikanaga) about 2 months ago
- Backport changed from 2.5: REQUIRED, 2.6: REQUIRED, 2.7: REQUIRED to 2.5: REQUIRED, 2.6: REQUIRED, 2.7: DONE
ruby_2_7 c271c7a225c6175f56f00b785e3034cb4a2b7658 merged revision(s) ce7a053475cbebfb2f3e5ed6614e0ba631541917,1cbb1f1720127b0b34b38c77e27b51b182008699.
Updated by usa (Usaku NAKAMURA) 6 days ago
- Backport changed from 2.5: REQUIRED, 2.6: REQUIRED, 2.7: DONE to 2.5: REQUIRED, 2.6: DONE, 2.7: DONE
backported into ruby_2_6 at r67925