Eliminate array allocation for f(*a, **lvar) and f(*a, **@iv)
The compiler already eliminates the array allocation for f(*a, &lvar) and f(*a, &@iv), and eliminating the array allocation for keyword splat is as safe as eliminating it for block passes.
This commit is contained in:
parent
c70c1d2a95
commit
1731dd05a7
15
compile.c
15
compile.c
@ -3876,6 +3876,21 @@ iseq_peephole_optimize(rb_iseq_t *iseq, LINK_ELEMENT *list, const int do_tailcal
|
||||
if ((flag & VM_CALL_ARGS_BLOCKARG) && !(flag & VM_CALL_KW_SPLAT)) {
|
||||
OPERAND_AT(iobj, 0) = Qfalse;
|
||||
}
|
||||
|
||||
/*
|
||||
* Eliminate array allocation for f(*a, **lvar) and f(*a, **@iv)
|
||||
*
|
||||
* splatarray true
|
||||
* getlocal / getinstancevariable
|
||||
* send ARGS_SPLAT|KW_SPLAT and not ARGS_BLOCKARG
|
||||
* =>
|
||||
* splatarray false
|
||||
* getlocal / getinstancevariable
|
||||
* send
|
||||
*/
|
||||
else if (!(flag & VM_CALL_ARGS_BLOCKARG) && (flag & VM_CALL_KW_SPLAT)) {
|
||||
OPERAND_AT(iobj, 0) = Qfalse;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user