summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Evans <code@jeremyevans.net>2019-09-05 20:03:09 (GMT)
committerJeremy Evans <code@jeremyevans.net>2019-09-06 00:47:12 (GMT)
commite220b467ef3faf24140cba572b2d67973391aaa5 (patch)
tree3f210a81a03ffdcbf9da8b8a8c12606ea5971fd5
parente2878a96f77978b224f8461244cd3e1efc248d83 (diff)
Convert empty keyword hash to required positional argument and warn for sym procs
This is the same as the bmethod and send cases, where we don't remove the keyword splat, so later code can move it to to a a required positional parameter and warn.
-rw-r--r--test/ruby/test_keyword.rb16
-rw-r--r--vm_insnhelper.c2
2 files changed, 13 insertions, 5 deletions
diff --git a/test/ruby/test_keyword.rb b/test/ruby/test_keyword.rb
index c5b9c15..2a99feb 100644
--- a/test/ruby/test_keyword.rb
+++ b/test/ruby/test_keyword.rb
@@ -633,8 +633,12 @@ class TestKeywordArguments < Test::Unit::TestCase
def c.m(args)
args
end
- assert_raise(ArgumentError) { :m.to_proc.call(c, **{}) }
- assert_raise(ArgumentError) { :m.to_proc.call(c, **kw) }
+ assert_warn(/The keyword argument is passed as the last hash parameter.* for `m'/m) do
+ assert_equal(kw, :m.to_proc.call(c, **{}))
+ end
+ assert_warn(/The keyword argument is passed as the last hash parameter.* for `m'/m) do
+ assert_equal(kw, :m.to_proc.call(c, **kw))
+ end
assert_equal(h, :m.to_proc.call(c, **h))
assert_equal(h, :m.to_proc.call(c, a: 1))
assert_equal(h2, :m.to_proc.call(c, **h2))
@@ -657,8 +661,12 @@ class TestKeywordArguments < Test::Unit::TestCase
def c.m(arg, **args)
[arg, args]
end
- assert_raise(ArgumentError) { :m.to_proc.call(c, **{}) }
- assert_raise(ArgumentError) { :m.to_proc.call(c, **kw) }
+ assert_warn(/The keyword argument is passed as the last hash parameter.* for `m'/m) do
+ assert_equal([kw, kw], :m.to_proc.call(c, **{}))
+ end
+ assert_warn(/The keyword argument is passed as the last hash parameter.* for `m'/m) do
+ assert_equal([kw, kw], :m.to_proc.call(c, **kw))
+ end
assert_warn(/The keyword argument is passed as the last hash parameter.* for `m'/m) do
assert_equal([h, kw], :m.to_proc.call(c, **h))
end
diff --git a/vm_insnhelper.c b/vm_insnhelper.c
index b1ea71a..1bbe397 100644
--- a/vm_insnhelper.c
+++ b/vm_insnhelper.c
@@ -3039,7 +3039,7 @@ vm_invoke_symbol_block(rb_execution_context_t *ec, rb_control_frame_t *reg_cfp,
{
VALUE val;
int argc;
- CALLER_SETUP_ARG(ec->cfp, calling, ci);
+ CALLER_SETUP_ARG_WITHOUT_KW_SPLAT(ec->cfp, calling, ci);
argc = calling->argc;
val = vm_yield_with_symbol(ec, symbol, argc, STACK_ADDR_FROM_TOP(argc), calling->kw_splat, calling->block_handler);
POPN(argc);