1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

Don't modify rest array when using ruby2_keywords

Previously, the rest array was modified, but it turns out that is
not necessary.  Not modifying the rest array fixes cases when the
rest array is used more than once.
This commit is contained in:
Jeremy Evans 2019-11-27 09:03:00 -08:00
parent 6f27fa4f7d
commit 299a13612e
Notes: git 2019-11-28 03:04:04 +09:00
2 changed files with 10 additions and 2 deletions

View file

@ -2649,6 +2649,11 @@ class TestKeywordArguments < Test::Unit::TestCase
baz(*args)
end
ruby2_keywords def foo_baz2(*args)
baz(*args)
baz(*args)
end
ruby2_keywords def foo_foo_bar(meth, *args)
foo_bar(meth, *args)
end
@ -2761,6 +2766,10 @@ class TestKeywordArguments < Test::Unit::TestCase
h1 = {a: 1}
o = c.new
assert_equal([1, h1], o.foo_baz2(1, :a=>1))
assert_equal([1], o.foo_baz2(1, **{}))
assert_equal([h1], o.foo_baz2(h1, **{}))
assert_equal([[1], h1], o.foo(:bar, 1, :a=>1))
assert_equal([1, h1], o.foo(:baz, 1, :a=>1))
assert_equal([[1], h1], o.bfoo(:bar, 1, :a=>1))

View file

@ -742,7 +742,6 @@ setup_parameters_complex(rb_execution_context_t * const ec, const rb_iseq_t * co
if (RB_TYPE_P(rest_last, T_HASH) &&
(((struct RHash *)rest_last)->basic.flags & RHASH_PASS_AS_KEYWORDS)) {
rest_last = rb_hash_dup(rest_last);
RARRAY_ASET(args->rest, len - 1, rest_last);
kw_flag |= VM_CALL_KW_SPLAT;
if (iseq->body->param.flags.ruby2_keywords) {
remove_empty_keyword_hash = 0;
@ -754,7 +753,7 @@ setup_parameters_complex(rb_execution_context_t * const ec, const rb_iseq_t * co
}
if (kw_flag & VM_CALL_KW_SPLAT) {
if (len > 0 && ignore_keyword_hash_p(RARRAY_AREF(args->rest, len - 1), iseq)) {
if (len > 0 && ignore_keyword_hash_p(rest_last, iseq)) {
if (given_argc != min_argc) {
if (remove_empty_keyword_hash) {
arg_rest_dup(args);