summaryrefslogtreecommitdiff
path: root/thread.c
diff options
context:
space:
mode:
authormame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-07-01 16:55:30 +0000
committermame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-07-01 16:55:30 +0000
commit5874de95e8df1d051001cf53614c1d245c1ac5ae (patch)
tree3bd25f3a413a1637a826552181c1568b3bbeb9c0 /thread.c
parent498324c5d3cd08c2c306a4f91e3a11b7fda22835 (diff)
* Add coverage measurement constant COVERAGE__. This constant is not
for casual use. Usage: (1) assign {} to COVERAGE__, (2) require or load Ruby source file, and (3) COVERAGE__["sourcefilepath"] will return an array whose elements represent number of executions per line of source code. * vm_core.h: add field of coverage array to iseq. * iseq.c (prepare_iseq_build): ditto. * insns.def (trace): update coverage array. * parse.y (coverage): create and initialize coverage array. * compile.h (ADD_TRACE): add trace instruction to update covearge array. * thread.c (clear_coverage): delete coverage array when forking. Otherwise, double count of coverage may occur. * lib/coverage.rb: sample coverage measurement tool. * error.c: distinguish explicitly between parse_in_eval and mild_compile_error. * load.c: ditto. * vm_eval.c: ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@17781 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'thread.c')
-rw-r--r--thread.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/thread.c b/thread.c
index 10c4e3ea73..bac4715ca2 100644
--- a/thread.c
+++ b/thread.c
@@ -2100,6 +2100,31 @@ rb_thread_start_timer_thread(void)
}
static int
+clear_coverage_i(st_data_t key, st_data_t val, st_data_t dummy)
+{
+ int i;
+ VALUE lines = (VALUE)val;
+
+ for (i = 0; i < RARRAY_LEN(lines); i++) {
+ if (RARRAY_PTR(lines)[i] != Qnil) {
+ RARRAY_PTR(lines)[i] = INT2FIX(0);
+ }
+ }
+ return ST_CONTINUE;
+}
+
+static void
+clear_coverage(void)
+{
+ if (rb_const_defined_at(rb_cObject, rb_intern("COVERAGE__"))) {
+ VALUE hash = rb_const_get_at(rb_cObject, rb_intern("COVERAGE__"));
+ if (TYPE(hash) == T_HASH) {
+ st_foreach(RHASH_TBL(hash), clear_coverage_i, 0);
+ }
+ }
+}
+
+static int
terminate_atfork_i(st_data_t key, st_data_t val, rb_thread_t *current_th)
{
VALUE thval = key;
@@ -2124,6 +2149,7 @@ rb_thread_atfork(void)
st_clear(vm->living_threads);
st_insert(vm->living_threads, thval, (st_data_t) th->thread_id);
vm->sleeper = 0;
+ clear_coverage();
rb_reset_random_seed();
}
@@ -2152,6 +2178,7 @@ rb_thread_atfork_before_exec(void)
st_clear(vm->living_threads);
st_insert(vm->living_threads, thval, (st_data_t) th->thread_id);
vm->sleeper = 0;
+ clear_coverage();
}
struct thgroup {