summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-09-10 16:19:40 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-09-10 16:19:40 +0000
commitd446f15c975923dd55757b44a059716d5299c92d (patch)
treecbab2696a97fc80c1ca8a544473c9f20e4f75bff
parent93272b35f1192d12c5acec75ba95101b33e170e2 (diff)
compile.c: pop coverage trace
* compile.c (iseq_compile_each0): pop trace for coverage only and clear its corresponding line. [ruby-core:82726] [Bug #13886] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@59828 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--compile.c3
-rw-r--r--test/coverage/test_coverage.rb10
2 files changed, 12 insertions, 1 deletions
diff --git a/compile.c b/compile.c
index 9f49db4..35dc921 100644
--- a/compile.c
+++ b/compile.c
@@ -6594,7 +6594,8 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, NODE *node, int popp
((INSN *)saved_last_element)->insn_id == BIN(trace)) {
POP_ELEMENT(ret);
/* remove trace(coverage) */
- if (((INSN *)ret->last)->insn_id == BIN(trace)) {
+ if (IS_INSN_ID(ret->last, trace) &&
+ (FIX2LONG(OPERAND_AT(ret->last, 0)) & RUBY_EVENT_COVERAGE)) {
POP_ELEMENT(ret);
RARRAY_ASET(ISEQ_LINE_COVERAGE(iseq), line - 1, Qnil);
}
diff --git a/test/coverage/test_coverage.rb b/test/coverage/test_coverage.rb
index 23672fc..2858260 100644
--- a/test/coverage/test_coverage.rb
+++ b/test/coverage/test_coverage.rb
@@ -165,4 +165,14 @@ class TestCoverage < Test::Unit::TestCase
}
}
end
+
+ def test_nocoverage_optimized_line
+ assert_ruby_status(%w[], "#{<<-"begin;"}\n#{<<-'end;'}")
+ begin;
+ def foo(x)
+ x # optimized away
+ nil
+ end
+ end;
+ end
end