From f39050c8ebf894ccedc0b99de96f7412be97af89 Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Mon, 6 Jun 2016 16:58:27 -0700 Subject: [PATCH] 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/23831 Reviewed-by: Russ Cox Reviewed-by: Rob Pike --- src/cmd/cover/profile.go | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/cmd/cover/profile.go b/src/cmd/cover/profile.go index a03b5d532a4d7..5628b91f51990 100644 --- a/src/cmd/cover/profile.go +++ b/src/cmd/cover/profile.go @@ -93,6 +93,29 @@ func ParseProfiles(fileName string) ([]*Profile, error) { } for _, p := range files { 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. profiles := make([]*Profile, 0, len(files))