Avoid hash allocation for f(*r2k_ary) when def f(kw: 1)
When calling a method that accepts keywords but not a keyword splat with a splatted array with a ruby2_keywords flagged hash, there is no need to duplicate the ruby2_keywords flagged hash, since it will be accessed to get the keyword values, but it will not be modified.
This commit is contained in:
parent
4a49b060ae
commit
1cc5a64dd8
Notes:
git
2024-07-19 05:17:39 +00:00
@ -265,7 +265,7 @@ class TestAllocation < Test::Unit::TestCase
|
||||
check_allocations(1, 0, "keyword(*empty_array, *empty_array, **empty_hash#{block})")
|
||||
|
||||
check_allocations(0, 0, "keyword(*r2k_empty_array#{block})")
|
||||
check_allocations(1, 1, "keyword(*r2k_array#{block})")
|
||||
check_allocations(1, 0, "keyword(*r2k_array#{block})")
|
||||
|
||||
check_allocations(0, 1, "keyword(*empty_array, a: 2, **empty_hash#{block})")
|
||||
check_allocations(0, 1, "keyword(*empty_array, **hash1, **empty_hash#{block})")
|
||||
@ -359,7 +359,7 @@ class TestAllocation < Test::Unit::TestCase
|
||||
check_allocations(1, 1, "required_and_keyword(*array1, *empty_array, **hash1, **empty_hash#{block})")
|
||||
|
||||
check_allocations(0, 0, "required_and_keyword(*r2k_empty_array1#{block})")
|
||||
check_allocations(1, 1, "required_and_keyword(*r2k_array1#{block})")
|
||||
check_allocations(1, 0, "required_and_keyword(*r2k_array1#{block})")
|
||||
|
||||
check_allocations(0, 1, "required_and_keyword(1, *empty_array, a: 2, **empty_hash#{block})")
|
||||
check_allocations(0, 1, "required_and_keyword(1, *empty_array, **hash1, **empty_hash#{block})")
|
||||
@ -408,9 +408,9 @@ class TestAllocation < Test::Unit::TestCase
|
||||
check_allocations(1, 0, "splat_and_keyword(*array1, **nil#{block})")
|
||||
|
||||
check_allocations(1, 0, "splat_and_keyword(*r2k_empty_array#{block})")
|
||||
check_allocations(1, 1, "splat_and_keyword(*r2k_array#{block})")
|
||||
check_allocations(1, 0, "splat_and_keyword(*r2k_array#{block})")
|
||||
check_allocations(1, 0, "splat_and_keyword(*r2k_empty_array1#{block})")
|
||||
check_allocations(1, 1, "splat_and_keyword(*r2k_array1#{block})")
|
||||
check_allocations(1, 0, "splat_and_keyword(*r2k_array1#{block})")
|
||||
RUBY
|
||||
end
|
||||
|
||||
|
@ -718,7 +718,7 @@ setup_parameters_complex(rb_execution_context_t * const ec, const rb_iseq_t * co
|
||||
if (RB_TYPE_P(rest_last, T_HASH) && FL_TEST_RAW(rest_last, RHASH_PASS_AS_KEYWORDS)) {
|
||||
// def f(**kw); a = [..., kw]; g(*a)
|
||||
splat_flagged_keyword_hash = rest_last;
|
||||
if (!RHASH_EMPTY_P(rest_last) || (ISEQ_BODY(iseq)->param.flags.has_kwrest)) {
|
||||
if (!(RHASH_EMPTY_P(rest_last) || ISEQ_BODY(iseq)->param.flags.has_kw) || (ISEQ_BODY(iseq)->param.flags.has_kwrest)) {
|
||||
rest_last = rb_hash_dup(rest_last);
|
||||
}
|
||||
kw_flag |= VM_CALL_KW_SPLAT | VM_CALL_KW_SPLAT_MUT;
|
||||
|
Loading…
x
Reference in New Issue
Block a user