aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYusuke Endoh <mame@ruby-lang.org>2019-11-29 16:51:13 +0900
committerYusuke Endoh <mame@ruby-lang.org>2019-11-29 16:51:13 +0900
commit3a87826d0c3dd4c42e327e0cd4fb0806d898497f (patch)
tree5c52f4909eea084529e8b2f7f1647b64f95be7f5
parent5ad32d5504499f1a915d5d30e59dfd98da6759c6 (diff)
downloadruby-3a87826d0c3dd4c42e327e0cd4fb0806d898497f.tar.gz
vm_method.c: add top-level ruby2_keywords
This is a top-level version of Module#ruby2_keywords. It can be used for functions (top-level methods) that delegates arguments. [Feature #16364]
-rw-r--r--test/ruby/test_keyword.rb12
-rw-r--r--vm_method.c15
2 files changed, 27 insertions, 0 deletions
diff --git a/test/ruby/test_keyword.rb b/test/ruby/test_keyword.rb
index 29335a4963..862b6733ea 100644
--- a/test/ruby/test_keyword.rb
+++ b/test/ruby/test_keyword.rb
@@ -2985,6 +2985,18 @@ class TestKeywordArguments < Test::Unit::TestCase
assert_raise(FrozenError) { c.send(:ruby2_keywords, :baz) }
end
+ def test_top_ruby2_keywords
+ assert_in_out_err([], <<-INPUT, ["[1, 2, 3]", "{:k=>1}"], [])
+ def bar(*a, **kw)
+ p a, kw
+ end
+ ruby2_keywords def foo(*a)
+ bar(*a)
+ end
+ foo(1, 2, 3, k:1)
+ INPUT
+ end
+
def test_dig_kwsplat
kw = {}
h = {:a=>1}
diff --git a/vm_method.c b/vm_method.c
index 9b34ce17ae..1a6b1cfeaf 100644
--- a/vm_method.c
+++ b/vm_method.c
@@ -1949,6 +1949,19 @@ top_private(int argc, VALUE *argv, VALUE _)
/*
* call-seq:
+ * ruby2_keywords(method_name, ...) -> self
+ *
+ * For the given method names, marks the method as passing keywords through
+ * a normal argument splat. See Module#ruby2_keywords in detail.
+ */
+static VALUE
+top_ruby2_keywords(int argc, VALUE *argv, VALUE module)
+{
+ return rb_mod_ruby2_keywords(argc, argv, rb_cObject);
+}
+
+/*
+ * call-seq:
* module_function(symbol, ...) -> self
* module_function(string, ...) -> self
*
@@ -2280,6 +2293,8 @@ Init_eval_method(void)
"public", top_public, -1);
rb_define_private_method(rb_singleton_class(rb_vm_top_self()),
"private", top_private, -1);
+ rb_define_private_method(rb_singleton_class(rb_vm_top_self()),
+ "ruby2_keywords", top_ruby2_keywords, -1);
{
#define REPLICATE_METHOD(klass, id) do { \