diff options
-rw-r--r-- | test/ruby/test_keyword.rb | 1 | ||||
-rw-r--r-- | vm_args.c | 9 |
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)) @@ -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; |