@@ -89,10 +89,10 @@ impl CoverageSpan {
8989 }
9090 }
9191
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) ) ;
9494 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 ) ;
9696 }
9797
9898 pub fn cutoff_statements_at ( & mut self , cutoff_pos : BytePos ) {
@@ -267,7 +267,7 @@ impl<'a> CoverageSpansGenerator<'a> {
267267 if curr. is_mergeable ( prev) {
268268 debug ! ( " same bcb (and neither is a closure), merge with prev={prev:?}" ) ;
269269 let prev = self . take_prev ( ) ;
270- self . curr_mut ( ) . merge_from ( prev) ;
270+ self . curr_mut ( ) . merge_from ( & prev) ;
271271 self . maybe_push_macro_name_span ( ) ;
272272 // Note that curr.span may now differ from curr_original_span
273273 } else if prev. span . hi ( ) <= curr. span . lo ( ) {
@@ -346,6 +346,17 @@ impl<'a> CoverageSpansGenerator<'a> {
346346 self . push_refined_span ( prev) ;
347347 }
348348
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+
349360 // Remove `CoverageSpan`s derived from closures, originally added to ensure the coverage
350361 // regions for the current function leave room for the closure's own coverage regions
351362 // (injected separately, from the closure's own MIR).
@@ -354,15 +365,7 @@ impl<'a> CoverageSpansGenerator<'a> {
354365 }
355366
356367 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) ;
366369 }
367370
368371 /// If `curr` is part of a new macro expansion, carve out and push a separate
0 commit comments