[#98621] Re: Function getlogin_r()'s protoype] — Bertram Scharpf <lists@...>
FYI,
3 messages
2020/06/02
[#98947] [Ruby master Feature#16986] Anonymous Struct literal — ko1@...
Issue #16986 has been reported by ko1 (Koichi Sasada).
66 messages
2020/06/26
[#98962] [Ruby master Bug#16988] Kernel.load loads file from current directory without '.' in path — misharinn@...
Issue #16988 has been reported by TheSmartnik (Nikita Misharin).
5 messages
2020/06/26
[#98969] [Ruby master Feature#16994] Sets: shorthand for frozen sets of symbols / strings — marcandre-ruby-core@...
Issue #16994 has been reported by marcandre (Marc-Andre Lafortune).
7 messages
2020/06/26
[#100117] [Ruby master Feature#16994] Sets: shorthand for frozen sets of symbols / strings
— matz@...
2020/09/25
Issue #16994 has been updated by matz (Yukihiro Matsumoto).
[ruby-core:98845] [Ruby master Bug#16967] Branch coverage duplicates branches inside ensure
From:
mame@...
Date:
2020-06-18 00:55:25 UTC
List:
ruby-core #98845
Issue #16967 has been updated by mame (Yusuke Endoh).
This occurs because one "ensure" clause is duplicated in bytecode: one is for normal exit, the other is for exceptional exit. Consider the following code:
```ruby
begin
maincode
ensure
hellohello
end
```
It is compiled as follows:
```
$ ruby --dump=i t.rb
== disasm: #<ISeq:<main>@t.rb:1 (1,0)-(5,3)> (catch: TRUE)
== catch table
| catch type: ensure st: 0000 ed: 0003 sp: 0001 cont: 0007
| == disasm: #<ISeq:ensure in <main>@t.rb:4 (4,2)-(4,12)> (catch: TRUE)
| local table (size: 1, argc: 0 [opts: 0, rest: -1, post: 0, block: -1, kw: -1@-1, kwrest: -1])
| [ 1] $!@0
| 0000 putself ( 4)[Li]
| 0001 opt_send_without_block <calldata!mid:hellohello, argc:0, FCALL|VCALL|ARGS_SIMPLE>
| 0003 pop
| 0004 getlocal_WC_0 $!@0
| 0006 throw 0
|------------------------------------------------------------------------
0000 putself ( 2)[Li]
0001 opt_send_without_block <calldata!mid:maincode, argc:0, FCALL|VCALL|ARGS_SIMPLE>
0003 putself ( 4)[Li]
0004 opt_send_without_block <calldata!mid:hellohello, argc:0, FCALL|VCALL|ARGS_SIMPLE>
0006 pop
0007 leave
```
You can see two calls to `hellohello`. The call in "catch table" is for exception handling case, and the other after the call to "maincode" is for normal exit case.
We need to keep track of the copies, and merge the coverage result. @ko1 what do you think?
----------------------------------------
Bug #16967: Branch coverage duplicates branches inside ensure
https://bugs.ruby-lang.org/issues/16967#change-86208
* Author: jeremyevans0 (Jeremy Evans)
* Status: Open
* Priority: Normal
* ruby -v: ruby 2.8.0dev (2020-06-05T21:26:28Z master ca15b7b8ee) [x86_64-openbsd6.7]
* Backport: 2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: UNKNOWN
----------------------------------------
The following file, which should have perfect coverage, is reported as only have 50% of the branches covered:
```ruby
def a
yield
ensure
p 1
p 2 if $!
end
a{}
a{raise} rescue nil
```
The branches reported by branch coverage are:
```ruby
{[:if, 0, 5, 2, 5, 11]=>
{[:then, 1, 5, 2, 5, 5]=>1, [:else, 2, 5, 2, 5, 11]=>0},
[:if, 3, 5, 2, 5, 11]=>
{[:then, 4, 5, 2, 5, 5]=>0, [:else, 5, 5, 2, 5, 11]=>1}}
```
Instead of reporting 2 branches for the `if`, 4 branches are reported:
1. exception raised, if condition true
2. exception raised, if condition false
3. exception not raised, if condition true
4. exception not raised, if condition false
In this example, it is impossible to cover branches 2 and 3, because the if condition is only true if an exception is raised.
Note that ensure blocks by themselves are not considered branches. This code results in no branches reported by branch coverage:
```ruby
def a
yield
ensure
p $!
end
a{}
a{raise} rescue nil
```
Nested ensure usage duplicates all branches. This code with 3 nested ensures generates 16 branches:
```ruby
def a
yield
ensure
begin
ensure
begin
ensure
p 1
p 2 if $!
end
end
end
a{}
a{raise} rescue nil
```
I think this is a bug in the coverage library, and that it should not duplicate branches inside ensure. This issue is not theoretical, it affects branch coverage testing in my libraries.
--
https://bugs.ruby-lang.org/
Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>