]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/cover: fix sorting of profile segment boundaries
authorDavid Symonds <dsymonds@golang.org>
Mon, 28 May 2018 03:03:08 +0000 (13:03 +1000)
committerDavid Symonds <dsymonds@golang.org>
Mon, 28 May 2018 03:35:36 +0000 (03:35 +0000)
If a span of coverable code is empty (e.g. an empty select clause)
then there will be two Boundary values with the same offset. In that
case, the starting Boundary needs to come first so that the generated
HTML output will open the <span> tag before it tries to close it.

Change-Id: Ib44a8b7c36ae57757c18b6cceb7a88ffa4e95394
Reviewed-on: https://go-review.googlesource.com/114855
Reviewed-by: Rob Pike <r@golang.org>
Run-TryBot: Rob Pike <r@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/cmd/cover/profile.go

index 5628b91f51990398eca4291c490d8ffb096f4a83..0da42ebfd357067b63861186f5b5022555206f4b 100644 (file)
@@ -174,7 +174,7 @@ func (p *Profile) Boundaries(src []byte) (boundaries []Boundary) {
                        return b
                }
                if max <= 1 {
-                       b.Norm = 0.8 // Profile is in"set" mode; we want a heat map. Use cov8 in the CSS.
+                       b.Norm = 0.8 // Profile is in "set" mode; we want a heat map. Use cov8 in the CSS.
                } else if count > 0 {
                        b.Norm = math.Log(float64(count)) / divisor
                }
@@ -209,7 +209,10 @@ func (b boundariesByPos) Len() int      { return len(b) }
 func (b boundariesByPos) Swap(i, j int) { b[i], b[j] = b[j], b[i] }
 func (b boundariesByPos) Less(i, j int) bool {
        if b[i].Offset == b[j].Offset {
-               return !b[i].Start && b[j].Start
+               // Boundaries at the same offset should be ordered Start < !Start.
+               // They represent empty sections of code (e.g. a switch/select clause
+               // without a body).
+               return b[i].Start && !b[j].Start
        }
        return b[i].Offset < b[j].Offset
 }