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)) {
|
if ((flag & VM_CALL_ARGS_BLOCKARG) && !(flag & VM_CALL_KW_SPLAT)) {
|
||||||
OPERAND_AT(iobj, 0) = Qfalse;
|
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