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

ruby-changes:37508

From: tenderlove <ko1@a...>
Date: Sat, 14 Feb 2015 00:54:03 +0900 (JST)
Subject: [ruby-changes:37508] tenderlove:r49589 (trunk): * ext/coverage/coverage.c: Add Coverage.peek_result. Allows you to

tenderlove	2015-02-14 00:53:47 +0900 (Sat, 14 Feb 2015)

  New Revision: 49589

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

  Log:
    * ext/coverage/coverage.c: Add Coverage.peek_result.  Allows you to
      capture coverage information without stopping the coverage tool.
      [ruby-core:67940] [Feature #10816]
    
    * test/coverage/test_coverage.rb: test for change.

  Modified files:
    trunk/ChangeLog
    trunk/NEWS
    trunk/ext/coverage/coverage.c
    trunk/test/coverage/test_coverage.rb
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 49588)
+++ ChangeLog	(revision 49589)
@@ -1,3 +1,11 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1
+Sat Feb 14 00:49:37 2015  Aaron Patterson <aaron@t...>
+
+	* ext/coverage/coverage.c: Add Coverage.peek_result.  Allows you to
+	  capture coverage information without stopping the coverage tool.
+	  [ruby-core:67940] [Feature #10816]
+
+	* test/coverage/test_coverage.rb: test for change.
+
 Fri Feb 13 21:52:05 2015  Yusuke Endoh  <mame@t...>
 
 	* string.c (str_discard): does not free for STR_NOFREE string.
Index: ext/coverage/coverage.c
===================================================================
--- ext/coverage/coverage.c	(revision 49588)
+++ ext/coverage/coverage.c	(revision 49589)
@@ -33,13 +33,20 @@ rb_coverage_start(VALUE klass) https://github.com/ruby/ruby/blob/trunk/ext/coverage/coverage.c#L33
 }
 
 static int
-coverage_result_i(st_data_t key, st_data_t val, st_data_t h)
+coverage_clear_result_i(st_data_t key, st_data_t val, st_data_t h)
+{
+    VALUE coverage = (VALUE)val;
+    rb_ary_clear((VALUE)val);
+    return ST_CONTINUE;
+}
+
+static int
+coverage_peek_result_i(st_data_t key, st_data_t val, st_data_t h)
 {
     VALUE path = (VALUE)key;
     VALUE coverage = (VALUE)val;
     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;
@@ -47,21 +54,36 @@ coverage_result_i(st_data_t key, st_data https://github.com/ruby/ruby/blob/trunk/ext/coverage/coverage.c#L54
 
 /*
  *  call-seq:
- *     Coverage.result  => hash
+ *     Coverage.peek_result  => hash
  *
- * Returns a hash that contains filename as key and coverage array as value
- * and disables coverage measurement.
+ * Returns a hash that contains filename as key and coverage array as value.
  */
 static VALUE
-rb_coverage_result(VALUE klass)
+rb_coverage_peek_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");
     }
-    st_foreach(RHASH_TBL(coverages), coverage_result_i, ncoverages);
+    st_foreach(RHASH_TBL(coverages), coverage_peek_result_i, ncoverages);
     rb_hash_freeze(ncoverages);
+    return ncoverages;
+}
+
+/*
+ *  call-seq:
+ *     Coverage.result  => hash
+ *
+ * Returns a hash that contains filename as key and coverage array as value
+ * and disables coverage measurement.
+ */
+static VALUE
+rb_coverage_result(VALUE klass)
+{
+    VALUE ncoverages = rb_coverage_peek_result(klass);
+    VALUE coverages = rb_get_coverages();
+    st_foreach(RHASH_TBL(coverages), coverage_clear_result_i, ncoverages);
     rb_reset_coverages();
     return ncoverages;
 }
@@ -105,5 +127,6 @@ Init_coverage(void) https://github.com/ruby/ruby/blob/trunk/ext/coverage/coverage.c#L127
     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_define_module_function(rb_mCoverage, "peek_result", rb_coverage_peek_result, 0);
     rb_gc_register_address(&rb_coverages);
 }
Index: NEWS
===================================================================
--- NEWS	(revision 49588)
+++ NEWS	(revision 49589)
@@ -44,6 +44,10 @@ with all sufficient information, see the https://github.com/ruby/ruby/blob/trunk/NEWS#L44
  * Base64.urlsafe_decode64: now it accepts not only correctly-padded
    input but also unpadded input.
 
+* ext/coverage/coverage.c
+  * Coverage.peek_result: new method to allow coverage to be captured without
+    stopping the coverage tool.
+
 === Built-in global variables compatibility issues
 
 === C API updates
Index: test/coverage/test_coverage.rb
===================================================================
--- test/coverage/test_coverage.rb	(revision 49588)
+++ test/coverage/test_coverage.rb	(revision 49589)
@@ -16,6 +16,32 @@ class TestCoverage < Test::Unit::TestCas https://github.com/ruby/ruby/blob/trunk/test/coverage/test_coverage.rb#L16
     end
   end
 
+  def test_coverage_snapshot
+    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'
+        cov = Coverage.peek_result[tmp + '/test.rb']
+        coverage_test_method
+        cov2 = Coverage.peek_result[tmp + '/test.rb']
+        assert_equal cov[1] + 1, cov2[1]
+        assert_equal cov2, Coverage.result[tmp + '/test.rb']
+      }
+    }
+  ensure
+    $".replace loaded_features
+  end
+
   def test_restarting_coverage
     loaded_features = $".dup
 

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

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