From 98c88786c7a77a6c18c8e1be40a83c1452e15bff Mon Sep 17 00:00:00 2001
From: nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Fri, 26 Jan 2018 10:55:45 +0000
Subject: [PATCH] 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
---
 error.c | 24 ++++++++----------------
 1 file changed, 8 insertions(+), 16 deletions(-)

diff --git a/error.c b/error.c
index 7870e58035..0704d2e057 100644
--- a/error.c
+++ b/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]);
+	    }
 	}
     }