summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2021-07-15 21:25:43 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2021-08-03 10:56:50 +0900
commit4c3140d60f6f94504842a4d0c0d79752a87aec8d (patch)
treece3764fc7224b08da01186541550e98d1aaf7cdc
parent731315bf5520a9ca7c94338c13d10c15b00c78c7 (diff)
Add keyrest to ruby2_keywords parameters [Bug #18011]
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/4705
-rw-r--r--iseq.c13
-rw-r--r--proc.c7
-rw-r--r--test/ruby/test_method.rb4
-rw-r--r--test/ruby/test_syntax.rb3
4 files changed, 21 insertions, 6 deletions
diff --git a/iseq.c b/iseq.c
index 47bc108d3e..b08f1bb497 100644
--- a/iseq.c
+++ b/iseq.c
@@ -3116,9 +3116,18 @@ rb_iseq_parameters(const rb_iseq_t *iseq, int is_proc)
rb_ary_push(args, a);
}
}
- if (body->param.flags.has_kwrest) {
+ if (body->param.flags.has_kwrest || body->param.flags.ruby2_keywords) {
+ ID param;
CONST_ID(keyrest, "keyrest");
- rb_ary_push(args, PARAM(keyword->rest_start, keyrest));
+ PARAM_TYPE(keyrest);
+ if (body->param.flags.has_kwrest &&
+ rb_id2str(param = PARAM_ID(keyword->rest_start))) {
+ rb_ary_push(a, ID2SYM(param));
+ }
+ else if (body->param.flags.ruby2_keywords) {
+ rb_ary_push(a, ID2SYM(idPow));
+ }
+ rb_ary_push(args, a);
}
if (body->param.flags.has_block) {
CONST_ID(block, "block");
diff --git a/proc.c b/proc.c
index 823d806ffd..d4236d0061 100644
--- a/proc.c
+++ b/proc.c
@@ -3097,7 +3097,12 @@ method_inspect(VALUE method)
}
}
else if (kind == keyrest) {
- rb_str_catf(str, "**%"PRIsVALUE, name);
+ if (name != ID2SYM(idPow)) {
+ rb_str_catf(str, "**%"PRIsVALUE, name);
+ }
+ else if (i > 0) {
+ rb_str_set_len(str, RSTRING_LEN(str) - 2);
+ }
}
else if (kind == block) {
if (name == ID2SYM('&')) {
diff --git a/test/ruby/test_method.rb b/test/ruby/test_method.rb
index 0bd5dc63dd..daf0ec73ca 100644
--- a/test/ruby/test_method.rb
+++ b/test/ruby/test_method.rb
@@ -578,7 +578,7 @@ class TestMethod < Test::Unit::TestCase
assert_equal([[:req, :a], [:opt, :b], [:rest, :c], [:req, :d], [:keyreq, :e], [:key, :f], [:keyrest, :o]], method(:mk8).parameters)
assert_equal([[:nokey]], method(:mnk).parameters)
# pending
- assert_equal([[:rest, :*], [:block, :&]], method(:mf).parameters)
+ assert_equal([[:rest, :*], [:keyrest, :**], [:block, :&]], method(:mf).parameters)
end
def test_unbound_parameters
@@ -604,7 +604,7 @@ class TestMethod < Test::Unit::TestCase
assert_equal([[:req, :a], [:opt, :b], [:rest, :c], [:req, :d], [:keyreq, :e], [:key, :f], [:keyrest, :o]], self.class.instance_method(:mk8).parameters)
assert_equal([[:nokey]], self.class.instance_method(:mnk).parameters)
# pending
- assert_equal([[:rest, :*], [:block, :&]], self.class.instance_method(:mf).parameters)
+ assert_equal([[:rest, :*], [:keyrest, :**], [:block, :&]], self.class.instance_method(:mf).parameters)
end
def test_bmethod_bound_parameters
diff --git a/test/ruby/test_syntax.rb b/test/ruby/test_syntax.rb
index 31db1320fc..8aa169ac0c 100644
--- a/test/ruby/test_syntax.rb
+++ b/test/ruby/test_syntax.rb
@@ -1638,7 +1638,8 @@ eom
assert_equal(-1, obj.method(:foo).arity)
parameters = obj.method(:foo).parameters
assert_equal(:rest, parameters.dig(0, 0))
- assert_equal(:block, parameters.dig(1, 0))
+ assert_equal(:keyrest, parameters.dig(1, 0))
+ assert_equal(:block, parameters.dig(2, 0))
end
end