diff options
author | mame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-09-07 12:36:01 +0000 |
---|---|---|
committer | mame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-09-07 12:36:01 +0000 |
commit | 1a643bac88c7f40a5dd8093fcb35d08236b327c5 (patch) | |
tree | 04a6ddbdb327cb110831976f6cdfae982b642ec2 /compile.c | |
parent | af32570535b1a3f3bad3c69aacde44f61164b79a (diff) | |
download | ruby-1a643bac88c7f40a5dd8093fcb35d08236b327c5.tar.gz |
Remove unneeded trace instruction for coverage
When no instruction is emitted in `iseq_compile_each0`
(i.e., when the line has no significant code), trace
instruction for `RUBY_EVENT_LINE` has been optimized out.
But trace for `RUBY_EVENT_COVERAGE` has not been removed.
Now, it is also removed.
`TestISeq#test_to_a_lines` has failed a long time under
coverage measurement (`make test-all COVERAGE=true`).
This change makes it pass.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@59769 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'compile.c')
-rw-r--r-- | compile.c | 5 |
1 files changed, 5 insertions, 0 deletions
@@ -6593,6 +6593,11 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, NODE *node, int popp ret->last == saved_last_element && ((INSN *)saved_last_element)->insn_id == BIN(trace)) { POP_ELEMENT(ret); + /* remove trace(coverage) */ + if (((INSN *)ret->last)->insn_id == BIN(trace)) { + POP_ELEMENT(ret); + RARRAY_ASET(ISEQ_LINE_COVERAGE(iseq), line - 1, Qnil); + } } debug_node_end(); |