summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--compile.c3
-rw-r--r--test/coverage/test_coverage.rb12
2 files changed, 14 insertions, 1 deletions
diff --git a/compile.c b/compile.c
index 4d344fff9c..ba78040048 100644
--- a/compile.c
+++ b/compile.c
@@ -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)