Skip to content

Commit

Permalink
cmd/cover: handle multiple samples from the same location
Browse files Browse the repository at this point in the history
So we can merge cover profiles from multiple runs.

Change-Id: I1bf921e2b02063a2a62b35d21a6823062d10e5d0
Reviewed-on: https://go-review.googlesource.com/23831
Reviewed-by: Russ Cox <rsc@golang.org>
Reviewed-by: Rob Pike <r@golang.org>
  • Loading branch information
randall77 committed Nov 18, 2016
1 parent b01f612 commit f39050c
Showing 1 changed file with 23 additions and 0 deletions.
23 changes: 23 additions & 0 deletions src/cmd/cover/profile.go
Expand Up @@ -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))
Expand Down

0 comments on commit f39050c

Please sign in to comment.