@@ -180,12 +180,12 @@ impl<'tcx> FunctionCoverage<'tcx> {
180180 self . source_hash
181181 }
182182
183- /// Generate an array of CounterExpressions, and an iterator over all `Counter`s and their
184- /// associated `Regions` ( from which the LLVM-specific `CoverageMapGenerator` will create
185- /// `CounterMappingRegion`s.
183+ /// Generate an array of CounterExpressions, and an array of all `Counter`s and their
184+ /// associated `Regions` sorted by `Region`, from which the LLVM-specific
185+ /// `CoverageMapGenerator` will create ` CounterMappingRegion`s.
186186 pub fn get_expressions_and_counter_regions (
187187 & self ,
188- ) -> ( Vec < CounterExpression > , impl Iterator < Item = ( Counter , & CodeRegion ) > ) {
188+ ) -> ( Vec < CounterExpression > , Vec < ( Counter , & CodeRegion ) > ) {
189189 assert ! (
190190 self . source_hash != 0 || !self . is_used,
191191 "No counters provided the source_hash for used function: {:?}" ,
@@ -198,21 +198,31 @@ impl<'tcx> FunctionCoverage<'tcx> {
198198 // the two vectors should correspond 1:1.
199199 assert_eq ! ( self . expressions. len( ) , counter_expressions. len( ) ) ;
200200
201- let counter_regions = self . counter_regions ( ) ;
202- let expression_regions = self . expression_regions ( ) ;
203- let unreachable_regions = self . unreachable_regions ( ) ;
204-
205- let counter_regions =
206- counter_regions. chain ( expression_regions. into_iter ( ) . chain ( unreachable_regions) ) ;
207- ( counter_expressions, counter_regions)
208- }
209-
210- fn counter_regions ( & self ) -> impl Iterator < Item = ( Counter , & CodeRegion ) > {
211- self . counters . iter_enumerated ( ) . filter_map ( |( index, entry) | {
201+ let counter_regions = self . counters . iter_enumerated ( ) . filter_map ( |( index, entry) | {
212202 // Option::map() will return None to filter out missing counters. This may happen
213203 // if, for example, a MIR-instrumented counter is removed during an optimization.
214204 entry. as_ref ( ) . map ( |region| ( Counter :: counter_value_reference ( index) , region) )
215- } )
205+ } ) ;
206+
207+ // Find all of the expression IDs that weren't optimized out AND have
208+ // an attached code region, and return the corresponding mapping as a
209+ // counter/region pair.
210+ let expression_regions =
211+ self . expressions . iter_enumerated ( ) . filter_map ( |( id, expression) | {
212+ let code_region = expression. as_ref ( ) ?. region . as_ref ( ) ?;
213+ Some ( ( Counter :: expression ( id) , code_region) )
214+ } ) ;
215+ let unreachable_regions =
216+ self . unreachable_regions . iter ( ) . map ( |region| ( Counter :: ZERO , region) ) ;
217+
218+ let mut all_regions: Vec < _ > = expression_regions. collect ( ) ;
219+ all_regions. extend ( counter_regions) ;
220+ all_regions. extend ( unreachable_regions) ;
221+
222+ // make sure all the regions are sorted
223+ all_regions. sort_unstable_by_key ( |( _counter, region) | * region) ;
224+
225+ ( counter_expressions, all_regions)
216226 }
217227
218228 /// Convert this function's coverage expression data into a form that can be
@@ -244,21 +254,4 @@ impl<'tcx> FunctionCoverage<'tcx> {
244254 } )
245255 . collect :: < Vec < _ > > ( )
246256 }
247-
248- fn expression_regions ( & self ) -> Vec < ( Counter , & CodeRegion ) > {
249- // Find all of the expression IDs that weren't optimized out AND have
250- // an attached code region, and return the corresponding mapping as a
251- // counter/region pair.
252- self . expressions
253- . iter_enumerated ( )
254- . filter_map ( |( id, expression) | {
255- let code_region = expression. as_ref ( ) ?. region . as_ref ( ) ?;
256- Some ( ( Counter :: expression ( id) , code_region) )
257- } )
258- . collect :: < Vec < _ > > ( )
259- }
260-
261- fn unreachable_regions ( & self ) -> impl Iterator < Item = ( Counter , & CodeRegion ) > {
262- self . unreachable_regions . iter ( ) . map ( |region| ( Counter :: ZERO , region) )
263- }
264257}
0 commit comments