@@ -180,12 +180,12 @@ impl<'tcx> FunctionCoverage<'tcx> {
180
180
self . source_hash
181
181
}
182
182
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.
186
186
pub fn get_expressions_and_counter_regions (
187
187
& self ,
188
- ) -> ( Vec < CounterExpression > , impl Iterator < Item = ( Counter , & CodeRegion ) > ) {
188
+ ) -> ( Vec < CounterExpression > , Vec < ( Counter , & CodeRegion ) > ) {
189
189
assert ! (
190
190
self . source_hash != 0 || !self . is_used,
191
191
"No counters provided the source_hash for used function: {:?}" ,
@@ -198,21 +198,31 @@ impl<'tcx> FunctionCoverage<'tcx> {
198
198
// the two vectors should correspond 1:1.
199
199
assert_eq ! ( self . expressions. len( ) , counter_expressions. len( ) ) ;
200
200
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) | {
212
202
// Option::map() will return None to filter out missing counters. This may happen
213
203
// if, for example, a MIR-instrumented counter is removed during an optimization.
214
204
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)
216
226
}
217
227
218
228
/// Convert this function's coverage expression data into a form that can be
@@ -244,21 +254,4 @@ impl<'tcx> FunctionCoverage<'tcx> {
244
254
} )
245
255
. collect :: < Vec < _ > > ( )
246
256
}
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
- }
264
257
}
0 commit comments