mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
vm_args.c: improve keyword argument errors
* vm_args.c (argument_arity_error): improve required keyword argument errors when non-keyword arguments given. [ruby-core:79439] [Bug #13196] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@59259 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
202fbe3046
commit
1c34f0b837
2 changed files with 33 additions and 1 deletions
|
@ -641,4 +641,17 @@ class TestKeywordArguments < Test::Unit::TestCase
|
|||
assert_equal(x, result)
|
||||
assert_kind_of(klass, result, bug12884)
|
||||
end
|
||||
|
||||
def test_arity_error_message
|
||||
obj = Object.new
|
||||
def obj.t(x:) end
|
||||
assert_raise_with_message(ArgumentError, /required keyword: x\)/) do
|
||||
obj.t(42)
|
||||
end
|
||||
obj = Object.new
|
||||
def obj.t(x:, y:, z: nil) end
|
||||
assert_raise_with_message(ArgumentError, /required keywords: x, y\)/) do
|
||||
obj.t(42)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
21
vm_args.c
21
vm_args.c
|
@ -719,7 +719,26 @@ raise_argument_error(rb_thread_t *th, const rb_iseq_t *iseq, const VALUE exc)
|
|||
static void
|
||||
argument_arity_error(rb_thread_t *th, const rb_iseq_t *iseq, const int miss_argc, const int min_argc, const int max_argc)
|
||||
{
|
||||
raise_argument_error(th, iseq, rb_arity_error_new(miss_argc, min_argc, max_argc));
|
||||
VALUE exc = rb_arity_error_new(miss_argc, min_argc, max_argc);
|
||||
if (iseq->body->param.flags.has_kw) {
|
||||
const struct rb_iseq_param_keyword *const kw = iseq->body->param.keyword;
|
||||
const ID *keywords = kw->table;
|
||||
int req_key_num = kw->required_num;
|
||||
if (req_key_num > 0) {
|
||||
static const char required[] = "; required keywords";
|
||||
VALUE mesg = rb_attr_get(exc, idMesg);
|
||||
rb_str_resize(mesg, RSTRING_LEN(mesg)-1);
|
||||
rb_str_cat(mesg, required, sizeof(required) - 1 - (req_key_num == 1));
|
||||
rb_str_cat_cstr(mesg, ":");
|
||||
do {
|
||||
rb_str_cat_cstr(mesg, " ");
|
||||
rb_str_append(mesg, rb_id2str(*keywords++));
|
||||
rb_str_cat_cstr(mesg, ",");
|
||||
} while (--req_key_num);
|
||||
RSTRING_PTR(mesg)[RSTRING_LEN(mesg)-1] = ')';
|
||||
}
|
||||
}
|
||||
raise_argument_error(th, iseq, exc);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
Loading…
Reference in a new issue