diff options
author | Jeremy Evans <[email protected]> | 2023-11-23 10:47:24 -0800 |
---|---|---|
committer | Jeremy Evans <[email protected]> | 2024-01-24 18:25:55 -0800 |
commit | 22e488464a412afa58f201c49e54773aa8011320 (patch) | |
tree | 77f5adf2d7761cbcf1eb87e375663195e40fda44 /vm_callinfo.h | |
parent | ef276858d9295208add48e27208c69184dc50472 (diff) |
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
d2c41b1bff1f3102544bb0d03d4e82356d034d33 (via VM_CALL_KW_SPLAT_MUT).
Diffstat (limited to 'vm_callinfo.h')
-rw-r--r-- | vm_callinfo.h | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/vm_callinfo.h b/vm_callinfo.h index 8437f2176c..2165582a2f 100644 --- a/vm_callinfo.h +++ b/vm_callinfo.h @@ -25,6 +25,7 @@ enum vm_call_flag_bits { VM_CALL_ZSUPER_bit, // zsuper VM_CALL_OPT_SEND_bit, // internal flag VM_CALL_KW_SPLAT_MUT_bit, // kw splat hash can be modified (to avoid allocating a new one) + VM_CALL_ARGS_SPLAT_MUT_bit, // args splat can be modified (to avoid allocating a new one) VM_CALL__END }; @@ -40,6 +41,7 @@ enum vm_call_flag_bits { #define VM_CALL_ZSUPER (0x01 << VM_CALL_ZSUPER_bit) #define VM_CALL_OPT_SEND (0x01 << VM_CALL_OPT_SEND_bit) #define VM_CALL_KW_SPLAT_MUT (0x01 << VM_CALL_KW_SPLAT_MUT_bit) +#define VM_CALL_ARGS_SPLAT_MUT (0x01 << VM_CALL_ARGS_SPLAT_MUT_bit) struct rb_callinfo_kwarg { int keyword_len; |