Issue #15980 has been updated by mame (Yusuke Endoh).
Oops, I overlooked this issue. Sorry.
This is a tough problem. The compiler produces the following code:
```
0006 branchunless 13
...
0013 jump 17 (Line 2)
...
0017 putnil (Line 3)
```
The peephole optimizer changes it to:
```
0006 branchunless 17
...
0013 jump 17 (Line 2)
...
0017 putnil (Line 3)
```
Now "jump 17" instruction is unreachable, so Line 2 event is never fired. But coverage measurement doesn't know it, so it initializes zero entry for Line 2 in coverage.
I think of some options to fix:
1. Stop the peephole optimization (in some cases); it reduces performance even when coverage is not used, so I don't want to do this.
2. Remove unreachable instructions; it requires revamp of the compiler.
3. Analyze unreachable instructions and suppress coverage entry; it is relatively easy, but still requires unreachable code analysis.
@ko1 Do you have any idea?
----------------------------------------
Bug #15980: Coverage shows while/until after raise if/unless as uncovered line
https://bugs.ruby-lang.org/issues/15980#change-82946
* Author: jeremyevans0 (Jeremy Evans)
* Status: Assigned
* Priority: Normal
* Assignee: mame (Yusuke Endoh)
* Target version:
* ruby -v: ruby 2.7.0dev (2019-07-03) [x86_64-openbsd6.5]
* Backport: 2.4: UNKNOWN, 2.5: UNKNOWN, 2.6: REQUIRED
----------------------------------------
The following code shows line 2 (`while true`) as uncovered:
```ruby
raise if 1 == 2
while true
break
end
```
Coverage reports the following for this file: `[1, 0, 1, nil]`. Note that `true` isn't important, any `while` condition will work. However, if you change line 1 to `raise if false`, line 1 shows `nil` coverage, and line 2 shows as covered (`[nil, 1, 1, nil]`). That leads me to believe this issue is related to the optimizer.
I bisected this to commit:100bf2757468439106775a7d95a791a8c10b874a, which certainly appears related.
This is not a theoretical case, it affected three lines in Sequel. While not a major problem, I do think a fix should be backported to 2.6.
Note that this only affects line coverage. Branch coverage shows:
```ruby
{"file.rb"=>
{:branches=>
{[:if, 0, 1, 0, 1, 15]=>
{[:then, 1, 1, 0, 1, 5]=>0, [:else, 2, 1, 0, 1, 15]=>1},
[:while, 3, 2, 0, 4, 3]=>{[:body, 4, 3, 2, 3, 7]=>1}}}}
```
If you run with both branch and line coverage, line coverage shows correctly.
This affects `while`/`until` after a line with `raise ... if ...` or `raise ... unless ...`. If you switch to `if ...; raise ...; end`, then line coverage shows correctly.
--
https://bugs.ruby-lang.org/
Unsubscribe: <mailto:[email protected]?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>
lmpx.com only provides a reader for public news (NNTP) servers. It is not
affiliated with the servers or forums shown here and is not responsible for
the content of articles, which is written by their respective authors.