coverage: Don't create an intermediate vec for each BCB's initial spans
This commit is contained in:
parent
a17ff82aae
commit
e16494469e
1 changed files with 23 additions and 26 deletions
|
@ -1,3 +1,4 @@
|
||||||
|
use rustc_data_structures::captures::Captures;
|
||||||
use rustc_middle::mir::{
|
use rustc_middle::mir::{
|
||||||
self, FakeReadCause, Statement, StatementKind, Terminator, TerminatorKind,
|
self, FakeReadCause, Statement, StatementKind, Terminator, TerminatorKind,
|
||||||
};
|
};
|
||||||
|
@ -12,7 +13,7 @@ pub(super) fn mir_to_initial_sorted_coverage_spans(
|
||||||
body_span: Span,
|
body_span: Span,
|
||||||
basic_coverage_blocks: &CoverageGraph,
|
basic_coverage_blocks: &CoverageGraph,
|
||||||
) -> Vec<CoverageSpan> {
|
) -> Vec<CoverageSpan> {
|
||||||
let mut initial_spans = Vec::<CoverageSpan>::with_capacity(mir_body.basic_blocks.len() * 2);
|
let mut initial_spans = Vec::with_capacity(mir_body.basic_blocks.len() * 2);
|
||||||
for (bcb, bcb_data) in basic_coverage_blocks.iter_enumerated() {
|
for (bcb, bcb_data) in basic_coverage_blocks.iter_enumerated() {
|
||||||
initial_spans.extend(bcb_to_initial_coverage_spans(mir_body, body_span, bcb, bcb_data));
|
initial_spans.extend(bcb_to_initial_coverage_spans(mir_body, body_span, bcb, bcb_data));
|
||||||
}
|
}
|
||||||
|
@ -50,16 +51,13 @@ pub(super) fn mir_to_initial_sorted_coverage_spans(
|
||||||
// for each `Statement` and `Terminator`. (Note that subsequent stages of coverage analysis will
|
// for each `Statement` and `Terminator`. (Note that subsequent stages of coverage analysis will
|
||||||
// merge some `CoverageSpan`s, at which point a `CoverageSpan` may represent multiple
|
// merge some `CoverageSpan`s, at which point a `CoverageSpan` may represent multiple
|
||||||
// `Statement`s and/or `Terminator`s.)
|
// `Statement`s and/or `Terminator`s.)
|
||||||
fn bcb_to_initial_coverage_spans(
|
fn bcb_to_initial_coverage_spans<'a, 'tcx>(
|
||||||
mir_body: &mir::Body<'_>,
|
mir_body: &'a mir::Body<'tcx>,
|
||||||
body_span: Span,
|
body_span: Span,
|
||||||
bcb: BasicCoverageBlock,
|
bcb: BasicCoverageBlock,
|
||||||
bcb_data: &BasicCoverageBlockData,
|
bcb_data: &'a BasicCoverageBlockData,
|
||||||
) -> Vec<CoverageSpan> {
|
) -> impl Iterator<Item = CoverageSpan> + Captures<'a> + Captures<'tcx> {
|
||||||
bcb_data
|
bcb_data.basic_blocks.iter().flat_map(move |&bb| {
|
||||||
.basic_blocks
|
|
||||||
.iter()
|
|
||||||
.flat_map(|&bb| {
|
|
||||||
let data = &mir_body[bb];
|
let data = &mir_body[bb];
|
||||||
data.statements
|
data.statements
|
||||||
.iter()
|
.iter()
|
||||||
|
@ -77,7 +75,6 @@ fn bcb_to_initial_coverage_spans(
|
||||||
CoverageSpan::for_terminator(function_source_span(span, body_span), span, bcb)
|
CoverageSpan::for_terminator(function_source_span(span, body_span), span, bcb)
|
||||||
}))
|
}))
|
||||||
})
|
})
|
||||||
.collect()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// If the MIR `Statement` has a span contributive to computing coverage spans,
|
/// If the MIR `Statement` has a span contributive to computing coverage spans,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue