diff --git a/ChangeLog b/ChangeLog index 76f10add50..b1fe148655 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +Mon Jul 4 20:42:31 2011 Yusuke Endoh + + * ext/coverage/coverage.c: revert r32071. The commit caused SEGV on + some minor nonfree OS. I have no means of debugging the bug. My + personal opinion is that such OS should be unsupported unless there + is an active maintainer. [ruby-core:37352] + + * test/coverage/test_coverage.rb: ditto. + Mon Jul 4 07:14:12 2011 NARUSE, Yui * thread_pthread.c (get_stack): the return address of get_stack diff --git a/ext/coverage/coverage.c b/ext/coverage/coverage.c index 3a26aaab11..29ac7090f3 100644 --- a/ext/coverage/coverage.c +++ b/ext/coverage/coverage.c @@ -11,8 +11,6 @@ #include "ruby.h" #include "vm_core.h" -static VALUE rb_coverages = Qundef; - /* * call-seq: * Coverage.start => nil @@ -23,25 +21,19 @@ static VALUE rb_coverage_start(VALUE klass) { if (!RTEST(rb_get_coverages())) { - if (rb_coverages == Qundef) { - rb_coverages = rb_hash_new(); - RBASIC(rb_coverages)->klass = 0; - } - rb_set_coverages(rb_coverages); + VALUE coverages = rb_hash_new(); + RBASIC(coverages)->klass = 0; + rb_set_coverages(coverages); } return Qnil; } static int -coverage_result_i(st_data_t key, st_data_t val, st_data_t h) +coverage_result_i(st_data_t key, st_data_t val, st_data_t dummy) { - VALUE path = (VALUE)key; VALUE coverage = (VALUE)val; - VALUE coverages = (VALUE)h; - coverage = rb_ary_dup(coverage); - rb_ary_clear((VALUE)val); + RBASIC(coverage)->klass = rb_cArray; rb_ary_freeze(coverage); - rb_hash_aset(coverages, path, coverage); return ST_CONTINUE; } @@ -56,14 +48,14 @@ static VALUE rb_coverage_result(VALUE klass) { VALUE coverages = rb_get_coverages(); - VALUE ncoverages = rb_hash_new(); if (!RTEST(coverages)) { rb_raise(rb_eRuntimeError, "coverage measurement is not enabled"); } - st_foreach(RHASH_TBL(coverages), coverage_result_i, ncoverages); - rb_hash_freeze(ncoverages); + RBASIC(coverages)->klass = rb_cHash; + st_foreach(RHASH_TBL(coverages), coverage_result_i, 0); + rb_hash_freeze(coverages); rb_reset_coverages(); - return ncoverages; + return coverages; } /* Coverage provides coverage measurement feature for Ruby. diff --git a/test/coverage/test_coverage.rb b/test/coverage/test_coverage.rb index 56966b1f0e..d5091f3d15 100644 --- a/test/coverage/test_coverage.rb +++ b/test/coverage/test_coverage.rb @@ -15,29 +15,4 @@ class TestCoverage < Test::Unit::TestCase assert_kind_of(Array, val) end end - - def test_restarting_coverage - loaded_features = $".dup - - Dir.mktmpdir {|tmp| - Dir.chdir(tmp) { - File.open("test.rb", "w") do |f| - f.puts <<-EOS - def coverage_test_method - :ok - end - EOS - end - - Coverage.start - require tmp + '/test.rb' - Coverage.result - Coverage.start - coverage_test_method - assert_equal 1, Coverage.result.size - } - } - ensure - $".replace loaded_features - end end