diff options
author | Yusuke Endoh <mame@ruby-lang.org> | 2019-11-29 16:51:13 +0900 |
---|---|---|
committer | Yusuke Endoh <mame@ruby-lang.org> | 2019-11-29 16:51:13 +0900 |
commit | 3a87826d0c3dd4c42e327e0cd4fb0806d898497f (patch) | |
tree | 5c52f4909eea084529e8b2f7f1647b64f95be7f5 | |
parent | 5ad32d5504499f1a915d5d30e59dfd98da6759c6 (diff) | |
download | ruby-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.rb | 12 | ||||
-rw-r--r-- | vm_method.c | 15 |
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 { \ |