diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-07-04 05:42:04 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-07-04 05:42:04 +0000 |
commit | 1c34f0b837aaaa265a0771146c2059b60922c6ff (patch) | |
tree | 0204642c83abd4a10bd02fb5965f47f213c005a9 /vm_args.c | |
parent | 202fbe3046a6c37c6b9c7ce183d4e11aa34bb025 (diff) |
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
Diffstat (limited to 'vm_args.c')
-rw-r--r-- | vm_args.c | 21 |
1 files changed, 20 insertions, 1 deletions
@@ -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 |