summaryrefslogtreecommitdiff
path: root/thread.c
diff options
context:
space:
mode:
authormame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-07-08 13:57:06 +0000
committermame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-07-08 13:57:06 +0000
commitcaf3933babe1be5bba95b271b567caec92855cdb (patch)
tree001d1e98fd86421447657d3fd4b2c461b8ffa4c4 /thread.c
parent7e16f9e7777781a4969537b5d9f659b1356b2786 (diff)
* thread.c (rb_enable_coverages): hide coverage array by setting 0 to
klass during measurement. * parse.y (coverage, yycompile0): ditto. * iseq.c (prepare_iseq_build): use rb_hash_lookup instead of rb_hash_aref. * thread.c (rb_coverage_result): restore klass of coverage array and return it. * theaad.c (update_coverage): chcek whether its klass is 0. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@17959 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'thread.c')
-rw-r--r--thread.c29
1 files changed, 25 insertions, 4 deletions
diff --git a/thread.c b/thread.c
index 6c54fe728a..789d2b20e0 100644
--- a/thread.c
+++ b/thread.c
@@ -3535,7 +3535,7 @@ static void
update_coverage(rb_event_flag_t event, VALUE proc, VALUE self, ID id, VALUE klass)
{
VALUE coverage = GET_THREAD()->cfp->iseq->coverage;
- if (coverage) {
+ if (coverage && RBASIC(coverage)->klass == 0) {
long line = rb_sourceline() - 1;
long count;
if (RARRAY_PTR(coverage)[line] == Qnil) {
@@ -3548,16 +3548,37 @@ update_coverage(rb_event_flag_t event, VALUE proc, VALUE self, ID id, VALUE klas
}
}
+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;
+}
+
+static VALUE
+rb_coverage_result(VALUE klass)
+{
+ 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;
+}
+
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();
+ 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_vm_get_coverages, 0);
+ rb_define_module_function(rb_mCoverage, "result", rb_coverage_result, 0);
}
}