error.c: copy keyword arguments

* error.c (rb_key_err_new): pass arguments all arguments to the
  super method, except for keyword arguments copied to instance
  variables.  [Feature #14313]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62054 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2018-01-26 10:55:45 +00:00
Родитель ba4aba0d6c
Коммит 98c88786c7
1 изменённых файлов: 8 добавлений и 16 удалений

24
error.c
Просмотреть файл

@ -1690,29 +1690,21 @@ rb_key_err_new(VALUE mesg, VALUE recv, VALUE key)
static VALUE
key_err_initialize(int argc, VALUE *argv, VALUE self)
{
VALUE message;
VALUE options;
rb_scan_args(argc, argv, "01:", &message, &options);
if (NIL_P(message)) {
rb_call_super(0, NULL);
}
else {
rb_call_super(1, &message);
}
rb_call_super(rb_scan_args(argc, argv, "01:", NULL, &options), argv);
if (!NIL_P(options)) {
ID keywords[2];
VALUE values[2];
VALUE values[numberof(keywords)];
int i;
keywords[0] = id_receiver;
keywords[1] = id_key;
rb_get_kwargs(options, keywords, 0, 2, values);
if (values[0] != Qundef) {
rb_ivar_set(self, id_receiver, values[0]);
}
if (values[1] != Qundef) {
rb_ivar_set(self, id_key, values[1]);
rb_get_kwargs(options, keywords, 0, numberof(values), values);
for (i = 0; i < numberof(values); ++i) {
if (values[i] != Qundef) {
rb_ivar_set(self, keywords[i], values[i]);
}
}
}