Actions
Bug #21452
openARGS_SPLAT bytecode regression between 3.3 and 3.4
Status:
Open
Assignee:
-
Target version:
-
ruby -v:
ruby 3.4.3 (2025-04-14 revision d0b7e5b6a0) +PRISM [arm64-darwin24]
Description
On Ruby 3.3, f(1, 2, *[3, 4])
splats all arguments to the stack and uses ARGS_SIMPLE
:
plum% ruby --version
ruby 3.3.2 (2024-05-30 revision e5a195edf6) [arm64-darwin24]
plum% ruby --dump=insns -e 'f(1, 2, *[3, 4])'
== disasm: #<ISeq:<main>@-e:1 (1,0)-(1,16)>
0000 putself ( 1)[Li]
0001 putobject_INT2FIX_1_
0002 putobject 2
0004 putobject 3
0006 putobject 4
0008 opt_send_without_block <calldata!mid:f, argc:4, FCALL|ARGS_SIMPLE>
0010 leave
plum%
On Ruby 3.4, the same expression results in creating a new array and using ARGS_SPLAT
:
plum% ruby --version
ruby 3.4.3 (2025-04-14 revision d0b7e5b6a0) +PRISM [arm64-darwin24]
plum% ruby --dump=insns -e 'f(1, 2, *[3, 4])'
== disasm: #<ISeq:<main>@-e:1 (1,0)-(1,16)>
0000 putself ( 1)[Li]
0001 putobject_INT2FIX_1_
0002 putobject 2
0004 duparray [3, 4]
0006 opt_send_without_block <calldata!mid:f, argc:3, ARGS_SPLAT|FCALL>
0008 leave
plum%
I think we should keep the behavior of 3.3.
Actions
Like0
Like0