Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.

Commit e164944

Browse files
committed
coverage: Don't create an intermediate vec for each BCB's initial spans
1 parent a17ff82 commit e164944

File tree

1 file changed

+23
-26
lines changed
  • compiler/rustc_mir_transform/src/coverage/spans

1 file changed

+23
-26
lines changed

compiler/rustc_mir_transform/src/coverage/spans/from_mir.rs

Lines changed: 23 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use rustc_data_structures::captures::Captures;
12
use rustc_middle::mir::{
23
self, FakeReadCause, Statement, StatementKind, Terminator, TerminatorKind,
34
};
@@ -12,7 +13,7 @@ pub(super) fn mir_to_initial_sorted_coverage_spans(
1213
body_span: Span,
1314
basic_coverage_blocks: &CoverageGraph,
1415
) -> Vec<CoverageSpan> {
15-
let mut initial_spans = Vec::<CoverageSpan>::with_capacity(mir_body.basic_blocks.len() * 2);
16+
let mut initial_spans = Vec::with_capacity(mir_body.basic_blocks.len() * 2);
1617
for (bcb, bcb_data) in basic_coverage_blocks.iter_enumerated() {
1718
initial_spans.extend(bcb_to_initial_coverage_spans(mir_body, body_span, bcb, bcb_data));
1819
}
@@ -50,34 +51,30 @@ pub(super) fn mir_to_initial_sorted_coverage_spans(
5051
// for each `Statement` and `Terminator`. (Note that subsequent stages of coverage analysis will
5152
// merge some `CoverageSpan`s, at which point a `CoverageSpan` may represent multiple
5253
// `Statement`s and/or `Terminator`s.)
53-
fn bcb_to_initial_coverage_spans(
54-
mir_body: &mir::Body<'_>,
54+
fn bcb_to_initial_coverage_spans<'a, 'tcx>(
55+
mir_body: &'a mir::Body<'tcx>,
5556
body_span: Span,
5657
bcb: BasicCoverageBlock,
57-
bcb_data: &BasicCoverageBlockData,
58-
) -> Vec<CoverageSpan> {
59-
bcb_data
60-
.basic_blocks
61-
.iter()
62-
.flat_map(|&bb| {
63-
let data = &mir_body[bb];
64-
data.statements
65-
.iter()
66-
.filter_map(move |statement| {
67-
filtered_statement_span(statement).map(|span| {
68-
CoverageSpan::for_statement(
69-
statement,
70-
function_source_span(span, body_span),
71-
span,
72-
bcb,
73-
)
74-
})
58+
bcb_data: &'a BasicCoverageBlockData,
59+
) -> impl Iterator<Item = CoverageSpan> + Captures<'a> + Captures<'tcx> {
60+
bcb_data.basic_blocks.iter().flat_map(move |&bb| {
61+
let data = &mir_body[bb];
62+
data.statements
63+
.iter()
64+
.filter_map(move |statement| {
65+
filtered_statement_span(statement).map(|span| {
66+
CoverageSpan::for_statement(
67+
statement,
68+
function_source_span(span, body_span),
69+
span,
70+
bcb,
71+
)
7572
})
76-
.chain(filtered_terminator_span(data.terminator()).map(|span| {
77-
CoverageSpan::for_terminator(function_source_span(span, body_span), span, bcb)
78-
}))
79-
})
80-
.collect()
73+
})
74+
.chain(filtered_terminator_span(data.terminator()).map(|span| {
75+
CoverageSpan::for_terminator(function_source_span(span, body_span), span, bcb)
76+
}))
77+
})
8178
}
8279

8380
/// If the MIR `Statement` has a span contributive to computing coverage spans,

0 commit comments

Comments
 (0)