diff options
-rw-r--r-- | compile.c | 3 | ||||
-rw-r--r-- | test/coverage/test_coverage.rb | 12 |
2 files changed, 14 insertions, 1 deletions
@@ -2336,7 +2336,8 @@ iseq_set_sequence(rb_iseq_t *iseq, LINK_ANCHOR *const anchor) !(rb_get_coverage_mode() & COVERAGE_TARGET_ONESHOT_LINES)) { int line = iobj->insn_info.line_no - 1; if (line >= 0 && line < RARRAY_LEN(ISEQ_LINE_COVERAGE(iseq))) { - RARRAY_ASET(ISEQ_LINE_COVERAGE(iseq), line, INT2FIX(0)); + if (RARRAY_AREF(ISEQ_LINE_COVERAGE(iseq), line) == Qnil) + RARRAY_ASET(ISEQ_LINE_COVERAGE(iseq), line, INT2FIX(0)); } } if (ISEQ_BRANCH_COVERAGE(iseq) && (events & RUBY_EVENT_COVERAGE_BRANCH)) { diff --git a/test/coverage/test_coverage.rb b/test/coverage/test_coverage.rb index 6afef8ce1b..e4655119b7 100644 --- a/test/coverage/test_coverage.rb +++ b/test/coverage/test_coverage.rb @@ -181,6 +181,18 @@ class TestCoverage < Test::Unit::TestCase end; end + def test_eval_coverage_repeated + assert_in_out_err(%w[-rcoverage], <<-"end;", ["[3]"], []) + Coverage.start(eval: true, lines: true) + + 3.times do + eval("Object.new", nil, "test.rb") + end + + p Coverage.result["test.rb"][:lines] + end; + end + def test_coverage_supported assert Coverage.supported?(:lines) assert Coverage.supported?(:oneshot_lines) |