* class.c (rb_keyword_error_new): get rid of an intermediate
  string and check if keys are symbols.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@59622 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2017-08-19 01:04:15 +00:00
Родитель 4179fada20
Коммит 1292d2d24c
1 изменённых файлов: 12 добавлений и 10 удалений

22
class.c
Просмотреть файл

@ -1776,18 +1776,20 @@ rb_define_attr(VALUE klass, const char *name, int read, int write)
VALUE
rb_keyword_error_new(const char *error, VALUE keys)
{
const char *msg = "";
VALUE error_message;
const VALUE *ptr = RARRAY_CONST_PTR(keys);
long i = 0, len = RARRAY_LEN(keys);
VALUE error_message = rb_sprintf("%s keyword%.*s", error, len > 1, "s");
if (RARRAY_LEN(keys) == 1) {
keys = RARRAY_AREF(keys, 0);
if (len > 0) {
rb_str_cat_cstr(error_message, ": ");
while (1) {
const VALUE k = ptr[i];
Check_Type(k, T_SYMBOL); /* wrong hash is given to rb_get_kwargs */
rb_str_append(error_message, rb_sym2str(k));
if (++i >= len) break;
rb_str_cat_cstr(error_message, ", ");
}
}
else {
keys = rb_ary_join(keys, rb_usascii_str_new2(", "));
msg = "s";
}
error_message = rb_sprintf("%s keyword%s: %"PRIsVALUE, error, msg, keys);
return rb_exc_new_str(rb_eArgError, error_message);
}