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

ruby-changes:5227

From: akr <ko1@a...>
Date: Sat, 31 May 2008 23:03:41 +0900 (JST)
Subject: [ruby-changes:5227] Ruby:r16724 (trunk): * gc.c (count_objects): clear given hash.

akr	2008-05-31 23:03:23 +0900 (Sat, 31 May 2008)

  New Revision: 16724

  Modified files:
    trunk/ChangeLog
    trunk/gc.c
    trunk/test/ruby/test_objectspace.rb

  Log:
    * gc.c (count_objects): clear given hash.


  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=16724&r2=16723&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/gc.c?r1=16724&r2=16723&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/test/ruby/test_objectspace.rb?r1=16724&r2=16723&diff_format=u

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 16723)
+++ ChangeLog	(revision 16724)
@@ -1,3 +1,7 @@
+Sat May 31 23:02:00 2008  Tanaka Akira  <akr@f...>
+
+	* gc.c (count_objects): clear given hash.
+
 Sat May 31 20:28:10 2008  Yusuke Endoh  <mame@t...>
 
 	* test/ruby/test_regexp.rb: add tests.
Index: gc.c
===================================================================
--- gc.c	(revision 16723)
+++ gc.c	(revision 16724)
@@ -2239,6 +2239,15 @@
     return (VALUE)((SIGNED_VALUE)obj|FIXNUM_FLAG);
 }
 
+static int
+set_zero(st_data_t key, st_data_t val, st_data_t arg)
+{
+    VALUE k = (VALUE)key;
+    VALUE hash = (VALUE)arg;
+    rb_hash_aset(hash, k, INT2FIX(0));
+    return ST_CONTINUE;
+}
+
 /*
  *  call-seq:
  *     ObjectSpace.count_objects([result_hash]) -> hash
@@ -2272,6 +2281,9 @@
     if (rb_scan_args(argc, argv, "01", &hash) == 1) {
         if (TYPE(hash) != T_HASH)
             rb_raise(rb_eTypeError, "non-hash given");
+        if (!RHASH_EMPTY_P(hash)) {
+            st_foreach(RHASH_TBL(hash), set_zero, hash);
+        }
     }
 
     for (i = 0; i <= T_MASK; i++) {
Index: test/ruby/test_objectspace.rb
===================================================================
--- test/ruby/test_objectspace.rb	(revision 16723)
+++ test/ruby/test_objectspace.rb	(revision 16724)
@@ -47,5 +47,11 @@
     assert(h.values.all? {|x| x.is_a?(Integer) })
 
     assert_raise(TypeError) { ObjectSpace.count_objects(1) }
+
+    h0 = {:T_FOO=>1000}
+    h = ObjectSpace.count_objects(h0)
+    p h0.equal?(h)
+    assert_same(h0, h)
+    assert_equal(0, h0[:T_FOO])
   end
 end

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

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