Prevent modification of splat array inside setup_parameters_complex

For the following:

```
def f(*a); a end
p f(*a, kw: 3)
```

`setup_parameters_complex` pushes `{kw: 3}` onto `a`.  This worked fine
back when `concatarray true` was used and `a` was already a copy. It
does not work correctly with the optimization to switch to
`concatarray false`.  This duplicates the array on the callee side
in such a case.

This affects cases when passing a regular splat and a keyword splat
(or literal keywords) in a method call, where the method does not
accept keywords.

This allocation could probably be avoided, but doing so would
make `setup_parameters_complex` more complicated.
This commit is contained in:
Jeremy Evans 2023-11-21 09:02:31 -08:00
parent aa808204bb
commit 13cd963500
2 changed files with 8 additions and 0 deletions

View file

@ -100,6 +100,12 @@ class TestCall < Test::Unit::TestCase
}
end
def test_frozen_splat_and_keywords
a = [1, 2].freeze
def self.f(*a); a end
assert_equal([1, 2, {kw: 3}], f(*a, kw: 3))
end
def test_call_bmethod_proc
pr = proc{|sym| sym}
define_singleton_method(:a, &pr)