aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--test/ruby/test_keyword.rb1
-rw-r--r--vm_args.c9
2 files changed, 3 insertions, 7 deletions
diff --git a/test/ruby/test_keyword.rb b/test/ruby/test_keyword.rb
index 5864ec9588..5ddcfd892a 100644
--- a/test/ruby/test_keyword.rb
+++ b/test/ruby/test_keyword.rb
@@ -215,6 +215,7 @@ class TestKeywordArguments < Test::Unit::TestCase
assert_warn(/The keyword argument is passed as the last hash parameter.* for `m'/m) do
assert_equal(kw, c.m(**kw))
end
+ assert_equal(kw, c.m(kw, **kw))
assert_equal(h, c.m(**h))
assert_equal(h, c.m(a: 1))
assert_equal(h2, c.m(**h2))
diff --git a/vm_args.c b/vm_args.c
index 7ffc756fad..e471095acd 100644
--- a/vm_args.c
+++ b/vm_args.c
@@ -654,7 +654,6 @@ setup_parameters_complex(rb_execution_context_t * const ec, const rb_iseq_t * co
VALUE keyword_hash = Qnil;
VALUE * const orig_sp = ec->cfp->sp;
unsigned int i;
- int remove_empty_keyword_hash = 1;
vm_check_canary(ec, orig_sp);
/*
@@ -704,10 +703,6 @@ setup_parameters_complex(rb_execution_context_t * const ec, const rb_iseq_t * co
args->kw_argv = NULL;
}
- if (given_argc == min_argc) {
- remove_empty_keyword_hash = 0;
- }
-
if (ci->flag & VM_CALL_ARGS_SPLAT) {
args->rest = locals[--args->argc];
args->rest_index = 0;
@@ -715,7 +710,7 @@ setup_parameters_complex(rb_execution_context_t * const ec, const rb_iseq_t * co
if (kw_flag & VM_CALL_KW_SPLAT) {
int len = RARRAY_LENINT(args->rest);
if (len > 0 && ignore_keyword_hash_p(RARRAY_AREF(args->rest, len - 1), iseq)) {
- if (remove_empty_keyword_hash) {
+ if (given_argc != min_argc) {
arg_rest_dup(args);
rb_ary_pop(args->rest);
given_argc--;
@@ -730,7 +725,7 @@ setup_parameters_complex(rb_execution_context_t * const ec, const rb_iseq_t * co
else {
if (kw_flag & VM_CALL_KW_SPLAT) {
if (ignore_keyword_hash_p(args->argv[args->argc-1], iseq)) {
- if (remove_empty_keyword_hash) {
+ if (given_argc != min_argc) {
args->argc--;
given_argc--;
kw_flag &= ~VM_CALL_KW_SPLAT;