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

ruby-changes:6446

From: mame <ko1@a...>
Date: Wed, 9 Jul 2008 00:13:43 +0900 (JST)
Subject: [ruby-changes:6446] Ruby:r17961 (trunk): * thread.c (rb_set_coverages, rb_reset_coverages): enable and disable

mame	2008-07-09 00:13:22 +0900 (Wed, 09 Jul 2008)

  New Revision: 17961

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

  Log:
    * thread.c (rb_set_coverages, rb_reset_coverages): enable and disable
      coverage measurement.
    
    * thread.c (rb_get_coverages): rename and move from vm.c.
    
    * vm.c (rb_vm_get_coverages): ditto.
    
    * iseq.c (prepare_iseq_build): ditto.
    
    * thread.c (clear_coverage): ditto.
    
    * parse.y (coverage): ditto.
    
    * ext/coverage/coverage.c: use above functions, add new method
      Coverage.start and fix rdoc .

  Modified files:
    trunk/ChangeLog
    trunk/ext/coverage/coverage.c
    trunk/iseq.c
    trunk/parse.y
    trunk/thread.c
    trunk/vm.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 17960)
+++ ChangeLog	(revision 17961)
@@ -1,3 +1,21 @@
+Wed Jul  9 00:12:31 2008  Yusuke Endoh  <mame@t...>
+
+	* thread.c (rb_set_coverages, rb_reset_coverages): enable and disable
+	  coverage measurement.
+
+	* thread.c (rb_get_coverages): rename and move from vm.c.
+
+	* vm.c (rb_vm_get_coverages): ditto.
+
+	* iseq.c (prepare_iseq_build): ditto.
+
+	* thread.c (clear_coverage): ditto.
+
+	* parse.y (coverage): ditto.
+
+	* ext/coverage/coverage.c: use above functions, add new method
+	  Coverage.start and fix rdoc .
+
 Tue Jul  8 23:02:35 2008  Masaki Suketa  <masaki.suketa@n...>
 
 	* ext/win32ole/win32ole.c (find_default_source): bug fix when
Index: iseq.c
===================================================================
--- iseq.c	(revision 17960)
+++ iseq.c	(revision 17961)
@@ -194,8 +194,8 @@
 
     iseq->coverage = Qfalse;
     if (!GET_THREAD()->parse_in_eval) {
-	extern VALUE rb_vm_get_coverages(void);
-	VALUE coverages = rb_vm_get_coverages();
+	extern VALUE rb_get_coverages(void);
+	VALUE coverages = rb_get_coverages();
 	if (RTEST(coverages)) {
 	    iseq->coverage = rb_hash_lookup(coverages, filename);
 	    if (NIL_P(iseq->coverage)) iseq->coverage = Qfalse;
Index: thread.c
===================================================================
--- thread.c	(revision 17960)
+++ thread.c	(revision 17961)
@@ -2117,8 +2117,8 @@
 static void
 clear_coverage(void)
 {
-    extern VALUE rb_vm_get_coverages(void);
-    VALUE coverages = rb_vm_get_coverages();
+    extern VALUE rb_get_coverages(void);
+    VALUE coverages = rb_get_coverages();
     if (RTEST(coverages)) {
 	st_foreach(RHASH_TBL(coverages), clear_coverage_i, 0);
     }
@@ -3548,37 +3548,22 @@
     }
 }
 
-static int
-coverage_result_i(st_data_t key, st_data_t val, st_data_t dummy)
+VALUE
+rb_get_coverages(void)
 {
-    VALUE coverage = (VALUE)val;
-    RBASIC(coverage)->klass = rb_cArray;
-    rb_ary_freeze(coverage);
-    return ST_CONTINUE;
+    return GET_VM()->coverages;
 }
 
-static VALUE
-rb_coverage_result(VALUE klass)
+void
+rb_set_coverages(VALUE coverages)
 {
-    extern VALUE rb_vm_get_coverages(void);
-    VALUE coverages = rb_vm_get_coverages();
-    st_foreach(RHASH_TBL(coverages), coverage_result_i, 0);
-    RBASIC(coverages)->klass = rb_cHash;
-    rb_hash_freeze(coverages);
-    return coverages;
+    GET_VM()->coverages = coverages;
+    rb_add_event_hook(update_coverage, RUBY_EVENT_COVERAGE, Qnil);
 }
 
 void
-rb_enable_coverages(void)
+rb_reset_coverages(void)
 {
-    VALUE rb_mCoverage;
-
-    if (!RTEST(GET_VM()->coverages)) {
-	VALUE coverages = rb_hash_new();
-	RBASIC(coverages)->klass = 0;
-	GET_VM()->coverages = coverages;
-	rb_add_event_hook(update_coverage, RUBY_EVENT_COVERAGE, Qnil);
-	rb_mCoverage = rb_define_module("Coverage");
-	rb_define_module_function(rb_mCoverage, "result", rb_coverage_result, 0);
-    }
+    GET_VM()->coverages = Qfalse;
+    rb_remove_event_hook(update_coverage);
 }
Index: parse.y
===================================================================
--- parse.y	(revision 17960)
+++ parse.y	(revision 17961)
@@ -4672,8 +4672,8 @@
 static VALUE
 coverage(const char *f, int n)
 {
-    extern VALUE rb_vm_get_coverages(void);
-    VALUE coverages = rb_vm_get_coverages();
+    extern VALUE rb_get_coverages(void);
+    VALUE coverages = rb_get_coverages();
     if (RTEST(coverages) && RBASIC(coverages)->klass == 0) {
 	VALUE fname = rb_str_new2(f);
 	VALUE lines = rb_ary_new2(n);
Index: ext/coverage/coverage.c
===================================================================
--- ext/coverage/coverage.c	(revision 17960)
+++ ext/coverage/coverage.c	(revision 17961)
@@ -10,15 +10,67 @@
 
 #include "ruby.h"
 
-extern void rb_enable_coverages(void);
+static VALUE rb_mCoverage;
 
+extern VALUE rb_get_coverages(void);
+extern void rb_set_coverages(VALUE);
+extern void rb_reset_coverages(void);
+
+/*
+ * call-seq:
+ *    Coverage.start  => nil
+ *
+ * Enables coverage measurement.
+ */
+static VALUE
+rb_coverage_start(VALUE klass)
+{
+    if (!RTEST(rb_get_coverages())) {
+	VALUE coverages = rb_hash_new();
+	RBASIC(coverages)->klass = 0;
+	rb_set_coverages(coverages);
+    }
+}
+
+static int
+coverage_result_i(st_data_t key, st_data_t val, st_data_t dummy)
+{
+    VALUE coverage = (VALUE)val;
+    RBASIC(coverage)->klass = rb_cArray;
+    rb_ary_freeze(coverage);
+    return ST_CONTINUE;
+}
+
+/*
+ *  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 coverages = rb_get_coverages();
+    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);
+    rb_reset_coverages();
+    return coverages;
+}
+
 /* Coverage provides coverage measurement feature for Ruby.
+ * This feature is experimental, so these APIs may be changed in future.
  *
  * = Usage
  *
  * (1) require "coverage.so"
- * (2) require or load Ruby source file
- * (3) Coverage.result will return a hash that contains filename as key and
+ * (2) do Coverage.start
+ * (3) require or load Ruby source file
+ * (4) Coverage.result will return a hash that contains filename as key and
  *     coverage array as value.
  *
  * = Example
@@ -37,11 +89,14 @@
  *   [EOF]
  *
  *   require "coverage.so"
+ *   Coverage.start
  *   require "foo.rb"
- *   p COVERAGE__  #=> {"foo.rb"=>[1, 1, 10, nil, nil, 1, 1, nil, 0, nil]}
+ *   p Coverage.result  #=> {"foo.rb"=>[1, 1, 10, nil, nil, 1, 1, nil, 0, nil]}
  */
 void
 Init_coverage(void)
 {
-    rb_enable_coverages();
+    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);
 }
Index: vm.c
===================================================================
--- vm.c	(revision 17960)
+++ vm.c	(revision 17961)
@@ -1909,9 +1909,3 @@
 {
     return ruby_vm_debug_ptr(GET_VM());
 }
-
-VALUE
-rb_vm_get_coverages(void)
-{
-    return GET_VM()->coverages;
-}

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

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