@@ -89,10 +89,10 @@ impl CoverageSpan {
89
89
}
90
90
}
91
91
92
- pub fn merge_from ( & mut self , mut other : CoverageSpan ) {
93
- debug_assert ! ( self . is_mergeable( & other) ) ;
92
+ pub fn merge_from ( & mut self , other : & Self ) {
93
+ debug_assert ! ( self . is_mergeable( other) ) ;
94
94
self . span = self . span . to ( other. span ) ;
95
- self . merged_spans . append ( & mut other. merged_spans ) ;
95
+ self . merged_spans . extend_from_slice ( & other. merged_spans ) ;
96
96
}
97
97
98
98
pub fn cutoff_statements_at ( & mut self , cutoff_pos : BytePos ) {
@@ -267,7 +267,7 @@ impl<'a> CoverageSpansGenerator<'a> {
267
267
if curr. is_mergeable ( prev) {
268
268
debug ! ( " same bcb (and neither is a closure), merge with prev={prev:?}" ) ;
269
269
let prev = self . take_prev ( ) ;
270
- self . curr_mut ( ) . merge_from ( prev) ;
270
+ self . curr_mut ( ) . merge_from ( & prev) ;
271
271
self . maybe_push_macro_name_span ( ) ;
272
272
// Note that curr.span may now differ from curr_original_span
273
273
} else if prev. span . hi ( ) <= curr. span . lo ( ) {
@@ -346,6 +346,17 @@ impl<'a> CoverageSpansGenerator<'a> {
346
346
self . push_refined_span ( prev) ;
347
347
}
348
348
349
+ // Do one last merge pass, to simplify the output.
350
+ self . refined_spans . dedup_by ( |b, a| {
351
+ if a. is_mergeable ( b) {
352
+ debug ! ( ?a, ?b, "merging list-adjacent refined spans" ) ;
353
+ a. merge_from ( b) ;
354
+ true
355
+ } else {
356
+ false
357
+ }
358
+ } ) ;
359
+
349
360
// Remove `CoverageSpan`s derived from closures, originally added to ensure the coverage
350
361
// regions for the current function leave room for the closure's own coverage regions
351
362
// (injected separately, from the closure's own MIR).
@@ -354,15 +365,7 @@ impl<'a> CoverageSpansGenerator<'a> {
354
365
}
355
366
356
367
fn push_refined_span ( & mut self , covspan : CoverageSpan ) {
357
- if let Some ( last) = self . refined_spans . last_mut ( )
358
- && last. is_mergeable ( & covspan)
359
- {
360
- // Instead of pushing the new span, merge it with the last refined span.
361
- debug ! ( ?last, ?covspan, "merging new refined span with last refined span" ) ;
362
- last. merge_from ( covspan) ;
363
- } else {
364
- self . refined_spans . push ( covspan) ;
365
- }
368
+ self . refined_spans . push ( covspan) ;
366
369
}
367
370
368
371
/// If `curr` is part of a new macro expansion, carve out and push a separate
0 commit comments