vm_args.c: warn splat to var
* vm_args.c (setup_parameters_complex): [EXPERIMENTAL] warn when splat keyword arguments is passed as a single ordinary argument, not as a keyword rest argument. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62914 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
0de07300f0
commit
a23eca2672
@ -507,6 +507,7 @@ class TestKeywordArguments < Test::Unit::TestCase
|
|||||||
m = Object.new
|
m = Object.new
|
||||||
def m.f() :ok; end
|
def m.f() :ok; end
|
||||||
def m.f2(a = nil) a; end
|
def m.f2(a = nil) a; end
|
||||||
|
def m.f3(**a) a; end
|
||||||
o = {a: 1}
|
o = {a: 1}
|
||||||
assert_raise_with_message(ArgumentError, /unknown keyword: a/) {
|
assert_raise_with_message(ArgumentError, /unknown keyword: a/) {
|
||||||
m.f(**o)
|
m.f(**o)
|
||||||
@ -517,9 +518,16 @@ class TestKeywordArguments < Test::Unit::TestCase
|
|||||||
assert_equal(:ok, m.f(*a, **o), '[ruby-core:83638] [Bug #10856]')
|
assert_equal(:ok, m.f(*a, **o), '[ruby-core:83638] [Bug #10856]')
|
||||||
|
|
||||||
o = {a: 42}
|
o = {a: 42}
|
||||||
assert_equal({a: 42}, m.f2(**o), '[ruby-core:82280] [Bug #13791]')
|
assert_warning(/splat keyword/) do
|
||||||
|
assert_equal({a: 42}, m.f2(**o), '[ruby-core:82280] [Bug #13791]')
|
||||||
|
end
|
||||||
|
assert_warning('') do
|
||||||
|
assert_equal({a: 42}, m.f3(**o), 'splat to kwrest')
|
||||||
|
end
|
||||||
|
|
||||||
assert_equal({a: 42}, m.f2("a".to_sym => 42), '[ruby-core:82291] [Bug #13793]')
|
assert_warning('') do
|
||||||
|
assert_equal({a: 42}, m.f2("a".to_sym => 42), '[ruby-core:82291] [Bug #13793]')
|
||||||
|
end
|
||||||
|
|
||||||
o = {}
|
o = {}
|
||||||
a = [:ok]
|
a = [:ok]
|
||||||
|
11
vm_args.c
11
vm_args.c
@ -509,6 +509,7 @@ setup_parameters_complex(rb_execution_context_t * const ec, const rb_iseq_t * co
|
|||||||
const int max_argc = (iseq->body->param.flags.has_rest == FALSE) ? min_argc + iseq->body->param.opt_num : UNLIMITED_ARGUMENTS;
|
const int max_argc = (iseq->body->param.flags.has_rest == FALSE) ? min_argc + iseq->body->param.opt_num : UNLIMITED_ARGUMENTS;
|
||||||
int opt_pc = 0;
|
int opt_pc = 0;
|
||||||
int given_argc;
|
int given_argc;
|
||||||
|
int kw_splat = FALSE;
|
||||||
struct args_info args_body, *args;
|
struct args_info args_body, *args;
|
||||||
VALUE keyword_hash = Qnil;
|
VALUE keyword_hash = Qnil;
|
||||||
VALUE * const orig_sp = ec->cfp->sp;
|
VALUE * const orig_sp = ec->cfp->sp;
|
||||||
@ -600,10 +601,12 @@ setup_parameters_complex(rb_execution_context_t * const ec, const rb_iseq_t * co
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ci->flag & VM_CALL_KW_SPLAT) {
|
||||||
|
kw_splat = !iseq->body->param.flags.has_rest;
|
||||||
|
}
|
||||||
if (given_argc > min_argc &&
|
if (given_argc > min_argc &&
|
||||||
(iseq->body->param.flags.has_kw || iseq->body->param.flags.has_kwrest ||
|
(iseq->body->param.flags.has_kw || iseq->body->param.flags.has_kwrest ||
|
||||||
(!iseq->body->param.flags.has_rest && given_argc > max_argc &&
|
(kw_splat && given_argc > max_argc)) &&
|
||||||
(ci->flag & VM_CALL_KW_SPLAT))) &&
|
|
||||||
args->kw_argv == NULL) {
|
args->kw_argv == NULL) {
|
||||||
if (args_pop_keyword_hash(args, &keyword_hash)) {
|
if (args_pop_keyword_hash(args, &keyword_hash)) {
|
||||||
given_argc--;
|
given_argc--;
|
||||||
@ -667,6 +670,10 @@ setup_parameters_complex(rb_execution_context_t * const ec, const rb_iseq_t * co
|
|||||||
else if (!NIL_P(keyword_hash) && RHASH_SIZE(keyword_hash) > 0) {
|
else if (!NIL_P(keyword_hash) && RHASH_SIZE(keyword_hash) > 0) {
|
||||||
argument_kw_error(ec, iseq, "unknown", rb_hash_keys(keyword_hash));
|
argument_kw_error(ec, iseq, "unknown", rb_hash_keys(keyword_hash));
|
||||||
}
|
}
|
||||||
|
else if (kw_splat && NIL_P(keyword_hash)) {
|
||||||
|
rb_warning("passing splat keyword arguments as a single Hash"
|
||||||
|
" to `% "PRIsVALUE"'", rb_id2str(ci->mid));
|
||||||
|
}
|
||||||
|
|
||||||
if (iseq->body->param.flags.has_block) {
|
if (iseq->body->param.flags.has_block) {
|
||||||
if (iseq->body->local_iseq == iseq) {
|
if (iseq->body->local_iseq == iseq) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user