summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog15
-rw-r--r--iseq.c2
-rw-r--r--parse.y6
-rw-r--r--thread.c29
4 files changed, 43 insertions, 9 deletions
diff --git a/ChangeLog b/ChangeLog
index 62ff9d9f11..cd82535d53 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,18 @@
+Tue Jul 8 22:56:23 2008 Yusuke Endoh <mame@tsg.ne.jp>
+
+ * 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.
+
Tue Jul 8 22:28:25 2008 Koichi Sasada <ko1@atdot.net>
* lib/debug.rb, lib/profile.rb: fix to use RubyVM.
diff --git a/iseq.c b/iseq.c
index d97206eac8..a239830422 100644
--- a/iseq.c
+++ b/iseq.c
@@ -197,7 +197,7 @@ prepare_iseq_build(rb_iseq_t *iseq,
extern VALUE rb_vm_get_coverages(void);
VALUE coverages = rb_vm_get_coverages();
if (RTEST(coverages)) {
- iseq->coverage = rb_hash_aref(coverages, filename);
+ iseq->coverage = rb_hash_lookup(coverages, filename);
if (NIL_P(iseq->coverage)) iseq->coverage = Qfalse;
}
}
diff --git a/parse.y b/parse.y
index 0791284141..fd1e33a62c 100644
--- a/parse.y
+++ b/parse.y
@@ -4674,10 +4674,11 @@ coverage(const char *f, int n)
{
extern VALUE rb_vm_get_coverages(void);
VALUE coverages = rb_vm_get_coverages();
- if (RTEST(coverages)) {
+ if (RTEST(coverages) && RBASIC(coverages)->klass == 0) {
VALUE fname = rb_str_new2(f);
VALUE lines = rb_ary_new2(n);
int i;
+ RBASIC(lines)->klass = 0;
for (i = 0; i < n; i++) RARRAY_PTR(lines)[i] = Qnil;
RARRAY(lines)->len = n;
rb_hash_aset(coverages, fname, lines);
@@ -4718,9 +4719,6 @@ yycompile0(VALUE arg, int tracing)
parser_prepare(parser);
n = yyparse((void*)parser);
- if (ruby_coverage) {
- rb_ary_freeze(ruby_coverage);
- }
ruby_debug_lines = 0;
ruby_coverage = 0;
compile_for_eval = 0;
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);
}
}