compile.c (iseq_compile_each0): remove irrelevant tracecoverage

This change removes tracecoverage instructions on a line that has any
NODE but is non-significant, such as, just one literal.

This fixes the following failure that occurs only when coverage is
enabled:

  1) Failure:
TestISeq#test_to_a_lines [.../ruby/test/ruby/test_iseq.rb:56]:
<[3, 4, 7, 9]> expected but was
<[3, 4, 5, 6, 7, 8, 9]>.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@61711 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
mame 2018-01-09 06:17:21 +00:00
parent 3cfa84d562
commit cdd77289af

View File

@ -7169,6 +7169,18 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
return COMPILE_NG; return COMPILE_NG;
} }
/* remove tracecoverage instruction if there is no relevant instruction */
if (IS_TRACE(ret->last) && ((TRACE*) ret->last)->event == RUBY_EVENT_LINE) {
LINK_ELEMENT *insn = ret->last->prev;
if (IS_INSN(insn) &&
IS_INSN_ID(insn, tracecoverage) &&
FIX2LONG(OPERAND_AT(insn, 0)) == RUBY_EVENT_COVERAGE_LINE
) {
ELEM_REMOVE(insn); /* remove tracecovearge */
RARRAY_ASET(ISEQ_LINE_COVERAGE(iseq), line - 1, Qnil);
}
}
debug_node_end(); debug_node_end();
return COMPILE_OK; return COMPILE_OK;
} }