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

ruby-changes:11940

From: nobu <ko1@a...>
Date: Fri, 29 May 2009 10:04:49 +0900 (JST)
Subject: [ruby-changes:11940] Ruby:r23604 (trunk): * hash.c (rb_hash_inspect): rescurses with defined ID to get rid

nobu	2009-05-29 10:04:34 +0900 (Fri, 29 May 2009)

  New Revision: 23604

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=23604

  Log:
    * hash.c (rb_hash_inspect): rescurses with defined ID to get rid
      of extra call.  [ruby-core:23601]

  Modified files:
    trunk/ChangeLog
    trunk/hash.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 23603)
+++ ChangeLog	(revision 23604)
@@ -1,3 +1,8 @@
+Fri May 29 10:04:32 2009  Nobuyoshi Nakada  <nobu@r...>
+
+	* hash.c (rb_hash_inspect): rescurses with defined ID to get rid
+	  of extra call.  [ruby-core:23601]
+
 Fri May 29 09:30:00 2009  Nobuyoshi Nakada  <nobu@r...>
 
 	* enum.c (collect_all): checks interrupts.  [ruby-core:23594]
Index: hash.c
===================================================================
--- hash.c	(revision 23603)
+++ hash.c	(revision 23604)
@@ -1231,19 +1231,21 @@
 }
 
 static int
-inspect_i(VALUE key, VALUE value, VALUE str)
+inspect_i(VALUE key, VALUE value, VALUE args)
 {
-    VALUE str2;
+    VALUE *arg = (VALUE *)args;
+    VALUE str = arg[0], str2;
+    ID funcid = (ID)arg[1];
 
     if (key == Qundef) return ST_CONTINUE;
     if (RSTRING_LEN(str) > 1) {
 	rb_str_cat2(str, ", ");
     }
-    str2 = rb_inspect(key);
+    str2 = rb_obj_as_string(rb_funcall(key, funcid, 0, 0));
     rb_str_buf_append(str, str2);
     OBJ_INFECT(str, str2);
     rb_str_buf_cat2(str, "=>");
-    str2 = rb_inspect(value);
+    str2 = rb_obj_as_string(rb_funcall(value, funcid, 0, 0));
     rb_str_buf_append(str, str2);
     OBJ_INFECT(str, str2);
 
@@ -1251,13 +1253,15 @@
 }
 
 static VALUE
-inspect_hash(VALUE hash, VALUE dummy, int recur)
+inspect_hash(VALUE hash, VALUE funcname, int recur)
 {
-    VALUE str;
+    VALUE str, args[2];
 
     if (recur) return rb_usascii_str_new2("{...}");
     str = rb_str_buf_new2("{");
-    rb_hash_foreach(hash, inspect_i, str);
+    args[0] = str;
+    args[1] = funcname;
+    rb_hash_foreach(hash, inspect_i, (VALUE)args);
     rb_str_buf_cat2(str, "}");
     OBJ_INFECT(str, hash);
 
@@ -1280,7 +1284,7 @@
 {
     if (RHASH_EMPTY_P(hash))
 	return rb_usascii_str_new2("{}");
-    return rb_exec_recursive(inspect_hash, hash, 0);
+    return rb_exec_recursive(inspect_hash, hash, (VALUE)rb_frame_this_func());
 }
 
 /*

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

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