Commit f39050c8 authored by Keith Randall's avatar Keith Randall

cmd/cover: handle multiple samples from the same location

So we can merge cover profiles from multiple runs.

Change-Id: I1bf921e2b02063a2a62b35d21a6823062d10e5d0
Reviewed-on: https://go-review.googlesource.com/23831Reviewed-by: default avatarRuss Cox <rsc@golang.org>
Reviewed-by: default avatarRob Pike <r@golang.org>
parent b01f612a
...@@ -93,6 +93,29 @@ func ParseProfiles(fileName string) ([]*Profile, error) { ...@@ -93,6 +93,29 @@ func ParseProfiles(fileName string) ([]*Profile, error) {
} }
for _, p := range files { for _, p := range files {
sort.Sort(blocksByStart(p.Blocks)) sort.Sort(blocksByStart(p.Blocks))
// Merge samples from the same location.
j := 1
for i := 1; i < len(p.Blocks); i++ {
b := p.Blocks[i]
last := p.Blocks[j-1]
if b.StartLine == last.StartLine &&
b.StartCol == last.StartCol &&
b.EndLine == last.EndLine &&
b.EndCol == last.EndCol {
if b.NumStmt != last.NumStmt {
return nil, fmt.Errorf("inconsistent NumStmt: changed from %d to %d", last.NumStmt, b.NumStmt)
}
if mode == "set" {
p.Blocks[j-1].Count |= b.Count
} else {
p.Blocks[j-1].Count += b.Count
}
continue
}
p.Blocks[j] = b
j++
}
p.Blocks = p.Blocks[:j]
} }
// Generate a sorted slice. // Generate a sorted slice.
profiles := make([]*Profile, 0, len(files)) profiles := make([]*Profile, 0, len(files))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment