external/swiftshader
Revision | ba0c95eb406fb2c36cb2d1515765f4de82cbed9b (tree) |
---|---|
Time | 2020-04-08 06:06:47 |
Author | Ben Clayton <bclayton@goog...> |
Commiter | Ben Clayton |
Regres: Fix uncovered calculations after optimizations
The uncovered span calculations were ignoring span groups and inverted spans.
This is now correctly handled by Tree.allSpans().
Bug: b/152192800
Change-Id: I2bd8afa3c956b03b598a3d5297cb775fd19da35d
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/43573
Kokoro-Result: kokoro <noreply+kokoro@google.com>
Reviewed-by: Antonio Maiorano <amaiorano@google.com>
Tested-by: Ben Clayton <bclayton@google.com>
@@ -148,16 +148,8 @@ func (t *Tree) writeFilesJSON(spansByID map[SpanID]Span, sb *strings.Builder) { | ||
148 | 148 | file := t.files[path] |
149 | 149 | |
150 | 150 | uncovered := append(SpanList{}, file.allSpans...) |
151 | - file.tcm.traverse(func(tc *TestCoverage) { | |
152 | - for id := range tc.Spans { | |
153 | - uncovered.Remove(spansByID[id]) | |
154 | - } | |
155 | - }) | |
156 | - | |
157 | - percentage := 0.0 | |
158 | - if totalLines := file.allSpans.NumLines(); totalLines > 0 { | |
159 | - uncoveredLines := uncovered.NumLines() | |
160 | - percentage = 1.0 - (float64(uncoveredLines) / float64(totalLines)) | |
151 | + for id := range t.allSpans(file, file.tcm) { | |
152 | + uncovered.Remove(spansByID[id]) | |
161 | 153 | } |
162 | 154 | |
163 | 155 | if i > 0 { |
@@ -167,9 +159,14 @@ func (t *Tree) writeFilesJSON(spansByID map[SpanID]Span, sb *strings.Builder) { | ||
167 | 159 | sb.WriteString(path) |
168 | 160 | sb.WriteString(`":`) |
169 | 161 | sb.WriteString(`{`) |
170 | - sb.WriteString(`"p":`) | |
171 | - sb.WriteString(fmt.Sprintf("%v", percentage)) | |
172 | - sb.WriteString(`,"g":`) | |
162 | + if totalLines := file.allSpans.NumLines(); totalLines > 0 { | |
163 | + uncoveredLines := uncovered.NumLines() | |
164 | + percentage := 1.0 - (float64(uncoveredLines) / float64(totalLines)) | |
165 | + sb.WriteString(`"p":`) | |
166 | + sb.WriteString(fmt.Sprintf("%v", percentage)) | |
167 | + sb.WriteString(`,`) | |
168 | + } | |
169 | + sb.WriteString(`"g":`) | |
173 | 170 | t.writeSpanGroupsJSON(file.spangroups, sb) |
174 | 171 | sb.WriteString(`,"u":`) |
175 | 172 | t.writeUncoveredJSON(file, uncovered, sb) |
@@ -324,20 +321,11 @@ func (p *parser) populateAllSpans(tree *Tree) { | ||
324 | 321 | for span, id := range tree.spans { |
325 | 322 | spansByID[id] = span |
326 | 323 | } |
327 | - for _, tf := range tree.files { | |
328 | - tf.tcm.traverse(func(tc *TestCoverage) { | |
329 | - for spanID := range tc.Spans { | |
330 | - span := spansByID[spanID] | |
331 | - tf.allSpans.Add(span) | |
332 | - } | |
333 | - if groupID := tc.Group; groupID != nil { | |
334 | - group := tf.spangroups[*groupID] | |
335 | - for spanID := range group.Spans { | |
336 | - span := spansByID[spanID] | |
337 | - tf.allSpans.Add(span) | |
338 | - } | |
339 | - } | |
340 | - }) | |
324 | + for _, file := range tree.files { | |
325 | + for spanID := range tree.allSpans(file, file.tcm) { | |
326 | + span := spansByID[spanID] | |
327 | + file.allSpans.Add(span) | |
328 | + } | |
341 | 329 | } |
342 | 330 | } |
343 | 331 |
@@ -170,6 +170,21 @@ nextFile: | ||
170 | 170 | } |
171 | 171 | } |
172 | 172 | |
173 | +// allSpans returns all the spans in use by the TestCoverageMap and its children. | |
174 | +func (t *Tree) allSpans(tf *treeFile, tcm TestCoverageMap) SpanSet { | |
175 | + spans := SpanSet{} | |
176 | + for _, tc := range tcm { | |
177 | + for id := tc.Group; id != nil; id = tf.spangroups[*id].Extend { | |
178 | + group := tf.spangroups[*id] | |
179 | + spans = spans.addAll(group.Spans) | |
180 | + } | |
181 | + spans = spans.addAll(tc.Spans) | |
182 | + | |
183 | + spans = spans.addAll(spans.invertAll(t.allSpans(tf, tc.Children))) | |
184 | + } | |
185 | + return spans | |
186 | +} | |
187 | + | |
173 | 188 | // StringID is an identifier of a string |
174 | 189 | type StringID int |
175 | 190 |
@@ -437,6 +452,21 @@ func (s SpanSet) invert(rhs SpanID) SpanSet { | ||
437 | 452 | return s.add(rhs) |
438 | 453 | } |
439 | 454 | |
455 | +func (s SpanSet) invertAll(rhs SpanSet) SpanSet { | |
456 | + out := make(SpanSet, len(s)+len(rhs)) | |
457 | + for span := range s { | |
458 | + if !rhs.contains(span) { | |
459 | + out[span] = struct{}{} | |
460 | + } | |
461 | + } | |
462 | + for span := range rhs { | |
463 | + if !s.contains(span) { | |
464 | + out[span] = struct{}{} | |
465 | + } | |
466 | + } | |
467 | + return out | |
468 | +} | |
469 | + | |
440 | 470 | // SpanGroupID is an identifier of a SpanGroup. |
441 | 471 | type SpanGroupID int |
442 | 472 |