[前][次][番号順一覧][スレッド一覧]

ruby-changes:47506

From: nobu <ko1@a...>
Date: Sat, 19 Aug 2017 10:04:19 +0900 (JST)
Subject: [ruby-changes:47506] nobu:r59622 (trunk): class.c: check kw hash

nobu	2017-08-19 10:04:15 +0900 (Sat, 19 Aug 2017)

  New Revision: 59622

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=59622

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

  Modified files:
    trunk/class.c
Index: class.c
===================================================================
--- class.c	(revision 59621)
+++ class.c	(revision 59622)
@@ -1776,18 +1776,20 @@ rb_define_attr(VALUE klass, const char * https://github.com/ruby/ruby/blob/trunk/class.c#L1776
 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);
 }

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]