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:
parent
6f27fa4f7d
commit
299a13612e
Notes:
git
2019-11-28 03:04:04 +09:00
2 changed files with 10 additions and 2 deletions
|
@ -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))
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue