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

ruby-changes:20356

From: nagachika <ko1@a...>
Date: Tue, 5 Jul 2011 00:55:23 +0900 (JST)
Subject: [ruby-changes:20356] nagachika:r32404 (trunk): * ext/coverage/coverage.c: resurrect r32071 + add GC guard for

nagachika	2011-07-05 00:55:06 +0900 (Tue, 05 Jul 2011)

  New Revision: 32404

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

  Log:
    * ext/coverage/coverage.c: resurrect r32071 + add GC guard for
      rb_coverages. [ruby-core:37352] [Bug #4927]
      [ruby-core:36539] [Feature #4796]
    
    * test/coverage/test_coverage.rb resurrect r32071.

  Modified files:
    trunk/ChangeLog
    trunk/ext/coverage/coverage.c
    trunk/test/coverage/test_coverage.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 32403)
+++ ChangeLog	(revision 32404)
@@ -1,3 +1,11 @@
+Tue Jul  5 00:49:05 2011  CHIKANAGA Tomoyuki  <nagachika00@g...>
+
+	* ext/coverage/coverage.c: resurrect r32071 + add GC guard for
+	  rb_coverages. [ruby-core:37352] [Bug #4927]
+	  [ruby-core:36539] [Feature #4796]
+
+	* test/coverage/test_coverage.rb resurrect r32071.
+
 Mon Jul  4 22:24:46 2011  KOSAKI Motohiro  <kosaki.motohiro@g...>
 
 	* thread_pthread.c (get_stack): For NetBSD/FreeBSD, use
Index: ext/coverage/coverage.c
===================================================================
--- ext/coverage/coverage.c	(revision 32403)
+++ ext/coverage/coverage.c	(revision 32404)
@@ -11,6 +11,8 @@
 #include "ruby.h"
 #include "vm_core.h"
 
+static VALUE rb_coverages = Qundef;
+
 /*
  * call-seq:
  *    Coverage.start  => nil
@@ -21,19 +23,25 @@
 rb_coverage_start(VALUE klass)
 {
     if (!RTEST(rb_get_coverages())) {
-	VALUE coverages = rb_hash_new();
-	RBASIC(coverages)->klass = 0;
-	rb_set_coverages(coverages);
+	if (rb_coverages == Qundef) {
+	    rb_coverages = rb_hash_new();
+	    RBASIC(rb_coverages)->klass = 0;
+	}
+	rb_set_coverages(rb_coverages);
     }
     return Qnil;
 }
 
 static int
-coverage_result_i(st_data_t key, st_data_t val, st_data_t dummy)
+coverage_result_i(st_data_t key, st_data_t val, st_data_t h)
 {
+    VALUE path = (VALUE)key;
     VALUE coverage = (VALUE)val;
-    RBASIC(coverage)->klass = rb_cArray;
+    VALUE coverages = (VALUE)h;
+    coverage = rb_ary_dup(coverage);
+    rb_ary_clear((VALUE)val);
     rb_ary_freeze(coverage);
+    rb_hash_aset(coverages, path, coverage);
     return ST_CONTINUE;
 }
 
@@ -48,14 +56,14 @@
 rb_coverage_result(VALUE klass)
 {
     VALUE coverages = rb_get_coverages();
+    VALUE ncoverages = rb_hash_new();
     if (!RTEST(coverages)) {
 	rb_raise(rb_eRuntimeError, "coverage measurement is not enabled");
     }
-    RBASIC(coverages)->klass = rb_cHash;
-    st_foreach(RHASH_TBL(coverages), coverage_result_i, 0);
-    rb_hash_freeze(coverages);
+    st_foreach(RHASH_TBL(coverages), coverage_result_i, ncoverages);
+    rb_hash_freeze(ncoverages);
     rb_reset_coverages();
-    return coverages;
+    return ncoverages;
 }
 
 /* Coverage provides coverage measurement feature for Ruby.
@@ -95,4 +103,5 @@
     VALUE rb_mCoverage = rb_define_module("Coverage");
     rb_define_module_function(rb_mCoverage, "start", rb_coverage_start, 0);
     rb_define_module_function(rb_mCoverage, "result", rb_coverage_result, 0);
+    rb_gc_register_address(&rb_coverages);
 }
Index: test/coverage/test_coverage.rb
===================================================================
--- test/coverage/test_coverage.rb	(revision 32403)
+++ test/coverage/test_coverage.rb	(revision 32404)
@@ -15,4 +15,29 @@
       assert_kind_of(Array, val)
     end
   end
+
+  def test_restarting_coverage
+    loaded_features = $".dup
+
+    Dir.mktmpdir {|tmp|
+      Dir.chdir(tmp) {
+        File.open("test.rb", "w") do |f|
+          f.puts <<-EOS
+            def coverage_test_method
+              :ok
+            end
+          EOS
+        end
+
+        Coverage.start
+        require tmp + '/test.rb'
+        Coverage.result
+        Coverage.start
+        coverage_test_method
+        assert_equal 1, Coverage.result.size
+      }
+    }
+  ensure
+    $".replace loaded_features
+  end
 end

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

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