summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog18
-rw-r--r--ext/coverage/coverage.c42
-rw-r--r--include/ruby/intern.h2
-rw-r--r--iseq.c3
-rw-r--r--parse.y3
-rw-r--r--thread.c19
-rw-r--r--vm.c6
7 files changed, 76 insertions, 17 deletions
diff --git a/ChangeLog b/ChangeLog
index c1835d4b93..e3d639b631 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,21 @@
+Thu Jul 3 23:26:36 2008 Yusuke Endoh <mame@tsg.ne.jp>
+
+ * include/ruby/intern.h: remove prototypes about coverage.
+
+ * iseq.c (prepare_iseq_build): add prototype.
+
+ * parse.y (coverage): ditto.
+
+ * thread.c (clear_coverage): ditto.
+
+ * thread.c (update_coverage): use rb_sourceline.
+
+ * thread.c (rb_get_coverages): rename and move to vm.c.
+
+ * vm.c (rb_vm_get_coverages): ditto.
+
+ * ext/coverage/coverage.c: add rdoc.
+
Thu Jul 3 21:51:21 2008 Yusuke Endoh <mame@tsg.ne.jp>
* ext/coverage/coverage.c, ext/coverage/extconf.rb: eliminate
diff --git a/ext/coverage/coverage.c b/ext/coverage/coverage.c
index a56a408665..b40b28bc21 100644
--- a/ext/coverage/coverage.c
+++ b/ext/coverage/coverage.c
@@ -1,11 +1,47 @@
+/************************************************
+
+ coverage.c -
+
+ $Author: $
+
+ Copyright (c) 2008 Yusuke Endoh
+
+************************************************/
+
#include "ruby.h"
-VALUE rb_mCoverage;
+extern void rb_enable_coverages(void);
+/* Coverage provides coverage measurement feature for Ruby.
+ *
+ * = 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
+ * coverage array as value.
+ *
+ * = Example
+ *
+ * [foo.rb]
+ * s = 0
+ * 10.times do |x|
+ * s += x
+ * end
+ *
+ * if s == 45
+ * p :ok
+ * else
+ * p :ng
+ * end
+ * [EOF]
+ *
+ * require "coverage.so"
+ * require "foo.rb"
+ * p COVERAGE__ #=> {"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, "result", rb_get_coverages, 0);
}
diff --git a/include/ruby/intern.h b/include/ruby/intern.h
index c80382b97b..f1d47f654e 100644
--- a/include/ruby/intern.h
+++ b/include/ruby/intern.h
@@ -626,8 +626,6 @@ VALUE rb_mutex_synchronize(VALUE self);
VALUE rb_barrier_new(void);
VALUE rb_barrier_wait(VALUE self);
VALUE rb_barrier_release(VALUE self);
-VALUE rb_get_coverages(void);
-void rb_enable_coverages(void);
/* time.c */
VALUE rb_time_new(time_t, long);
VALUE rb_time_nano_new(time_t, long);
diff --git a/iseq.c b/iseq.c
index eb8a4009fd..d97206eac8 100644
--- a/iseq.c
+++ b/iseq.c
@@ -194,7 +194,8 @@ prepare_iseq_build(rb_iseq_t *iseq,
iseq->coverage = Qfalse;
if (!GET_THREAD()->parse_in_eval) {
- VALUE coverages = rb_get_coverages();
+ extern VALUE rb_vm_get_coverages(void);
+ VALUE coverages = rb_vm_get_coverages();
if (RTEST(coverages)) {
iseq->coverage = rb_hash_aref(coverages, filename);
if (NIL_P(iseq->coverage)) iseq->coverage = Qfalse;
diff --git a/parse.y b/parse.y
index 4d181af861..0791284141 100644
--- a/parse.y
+++ b/parse.y
@@ -4672,7 +4672,8 @@ debug_lines(const char *f)
static VALUE
coverage(const char *f, int n)
{
- VALUE coverages = rb_get_coverages();
+ extern VALUE rb_vm_get_coverages(void);
+ VALUE coverages = rb_vm_get_coverages();
if (RTEST(coverages)) {
VALUE fname = rb_str_new2(f);
VALUE lines = rb_ary_new2(n);
diff --git a/thread.c b/thread.c
index 36af5af49d..3076f0414e 100644
--- a/thread.c
+++ b/thread.c
@@ -2116,7 +2116,8 @@ clear_coverage_i(st_data_t key, st_data_t val, st_data_t dummy)
static void
clear_coverage(void)
{
- VALUE coverages = rb_get_coverages();
+ extern VALUE rb_vm_get_coverages(void);
+ VALUE coverages = rb_vm_get_coverages();
if (RTEST(coverages)) {
st_foreach(RHASH_TBL(coverages), clear_coverage_i, 0);
}
@@ -3529,19 +3530,12 @@ rb_check_deadlock(rb_vm_t *vm)
}
}
-VALUE
-rb_get_coverages(void)
-{
- return GET_VM()->coverages;
-}
-
static void
update_coverage(rb_event_flag_t event, VALUE proc, VALUE self, ID id, VALUE klass)
{
- rb_control_frame_t *cfp = GET_THREAD()->cfp;
- VALUE coverage = cfp->iseq->coverage;
+ VALUE coverage = GET_THREAD()->cfp->iseq->coverage;
if (coverage) {
- long line = vm_get_sourceline(cfp) - 1;
+ long line = rb_sourceline() - 1;
long count;
if (RARRAY_PTR(coverage)[line] == Qnil) {
rb_bug("bug");
@@ -3556,8 +3550,13 @@ update_coverage(rb_event_flag_t event, VALUE proc, VALUE self, ID id, VALUE klas
void
rb_enable_coverages(void)
{
+ VALUE rb_mCoverage;
+
if (!RTEST(GET_VM()->coverages)) {
+ extern VALUE rb_vm_get_coverages(void);
GET_VM()->coverages = rb_hash_new();
rb_add_event_hook(update_coverage, RUBY_EVENT_COVERAGE, Qnil);
+ rb_mCoverage = rb_define_module("Coverage");
+ rb_define_module_function(rb_mCoverage, "result", rb_vm_get_coverages, 0);
}
}
diff --git a/vm.c b/vm.c
index 519c4aba6e..4ffc8c8817 100644
--- a/vm.c
+++ b/vm.c
@@ -1909,3 +1909,9 @@ rb_ruby_debug_ptr(void)
{
return ruby_vm_debug_ptr(GET_VM());
}
+
+VALUE
+rb_vm_get_coverages(void)
+{
+ return GET_VM()->coverages;
+}