Actions
Bug #21132
closed
Changed postposition `rescue` and `if` behavior since Ruby 3.4
Description
When I use postposition rescue
and if
at same line, the behavior is changed since Ruby 3.4.
Reproduction¶
def foo
return "hogehoge" rescue nil if false
return "fugafuga"
end
foo
Result with Ruby 3.3¶
irb(main):001> RUBY_VERSION
=> "3.3.6"
irb(main):002* def foo
irb(main):003* return "hogehoge" rescue nil if false
irb(main):004* return "fugafuga"
irb(main):005> end
=> :foo
irb(main):006> foo
=> "fugafuga"
YARV bytecode
ruby 3.3.6 (2024-11-05 revision 75015d4c1f) [x86_64-linux]
== disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(6,3)>
0000 definemethod :foo, foo ( 1)[Li]
0003 putself ( 6)[Li]
0004 opt_send_without_block <calldata!mid:foo, argc:0, FCALL|VCALL|ARGS_SIMPLE>
0006 leave
== disasm: #<ISeq:foo@<compiled>:1 (1,0)-(4,3)>
0000 putstring "fugafuga" ( 3)[LiCa]
0002 leave ( 4)[Re]
Result with Ruby 3.4¶
irb(main):001> RUBY_VERSION
=> "3.4.1"
irb(main):002* def foo
irb(main):003* return "hogehoge" rescue nil if false
irb(main):004* return "fugafuga"
irb(main):005> end
=> :foo
irb(main):006> foo
=> "hogehoge"
YARV bytecode
ruby 3.4.1 (2024-12-25 revision 48d4efcb85) +PRISM [x86_64-linux]
== disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,54)>
0000 putself ( 1)[Li]
0001 opt_getconstant_path <ic:0 RubyVM::InstructionSequence>
0003 opt_getconstant_path <ic:1 DATA>
0005 opt_send_without_block <calldata!mid:new, argc:1, ARGS_SIMPLE>
0007 opt_send_without_block <calldata!mid:disassemble, argc:0, ARGS_SIMPLE>
0009 opt_send_without_block <calldata!mid:puts, argc:1, FCALL|ARGS_SIMPLE>
Updated by watson1978 (Shizuo Fujita) about 1 month ago
- Description updated (diff)
Updated by watson1978 (Shizuo Fujita) about 1 month ago
- Subject changed from Changed postposition `resque` and `if` behavior since Ruby 3.4 to Changed postposition `rescue` and `if` behavior since Ruby 3.4
Updated by watson1978 (Shizuo Fujita) about 1 month ago
When I switched parser to parse.y, it has same result with Ruby 3.3.
[~/tmp]$ ruby -v --parser=parse.y t.rb
ruby 3.4.1 (2024-12-25 revision 48d4efcb85) [x86_64-linux]
"fugafuga"
[~/tmp]$ ruby -v --parser=prism t.rb
ruby 3.4.1 (2024-12-25 revision 48d4efcb85) +PRISM [x86_64-linux]
"hogehoge"
Updated by nobu (Nobuyoshi Nakada) about 1 month ago
- Related to Bug #21097: `x = a rescue b in c` and `def f = a rescue b in c` parsed differently between parse.y and prism added
Updated by nobu (Nobuyoshi Nakada) about 1 month ago
- Assignee set to prism
Updated by hsbt (Hiroshi SHIBATA) about 1 month ago
- Is duplicate of Bug #21048: [Prism] rescue in modifier form with condition behaves differently added
Updated by watson1978 (Shizuo Fujita) about 1 month ago
My problem will be solved by https://github.com/ruby/ruby/commit/c2908613368b2ae404d094a15df61d830fc46dc9
Thanks
Updated by watson1978 (Shizuo Fujita) about 1 month ago
- Status changed from Open to Closed
Actions
Like1
Like0Like0Like0Like0Like0Like0Like0Like0