mirror of
https://github.com/ruby/ruby.git
synced 2025-09-15 16:44:01 +02:00
Add VM_CALL_ARGS_SPLAT_MUT callinfo flag
This flag is set when the caller has already created a new array to
handle a splat, such as for `f(*a, b)` and `f(*a, *b)`. Previously,
if `f` was defined as `def f(*a)`, these calls would create an extra
array on the callee side, instead of using the new array created
by the caller.
This modifies `setup_args_core` to set the flag whenver it would add
a `splatarray true` instruction. However, when `splatarray true` is
changed to `splatarray false` in the peephole optimizer, to avoid
unnecessary allocations on the caller side, the flag must be removed.
Add `optimize_args_splat_no_copy` and have the peephole optimizer call
that. This significantly simplifies the related peephole optimizer
code.
On the callee side, in `setup_parameters_complex`, set
`args->rest_dupped` to true if the flag is set.
This takes a similar approach for optimizing regular splats that was
previiously used for keyword splats in
d2c41b1bff
(via VM_CALL_KW_SPLAT_MUT).
This commit is contained in:
parent
ef276858d9
commit
22e488464a
5 changed files with 95 additions and 106 deletions
|
@ -510,7 +510,7 @@ setup_parameters_complex(rb_execution_context_t * const ec, const rb_iseq_t * co
|
|||
args = &args_body;
|
||||
given_argc = args->argc = calling->argc;
|
||||
args->argv = locals;
|
||||
args->rest_dupped = FALSE;
|
||||
args->rest_dupped = vm_ci_flag(ci) & VM_CALL_ARGS_SPLAT_MUT;
|
||||
|
||||
if (kw_flag & VM_CALL_KWARG) {
|
||||
args->kw_arg = vm_ci_kwarg(ci);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue