Remove more PlaceBuilder clones
This commit is contained in:
parent
105abe39c0
commit
9cf6ce070d
6 changed files with 26 additions and 21 deletions
|
@ -315,6 +315,14 @@ impl<'tcx> PlaceBuilder<'tcx> {
|
||||||
self.projection.push(elem);
|
self.projection.push(elem);
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Same as `.clone().project(..)` but more efficient
|
||||||
|
pub(crate) fn clone_project(&self, elem: PlaceElem<'tcx>) -> Self {
|
||||||
|
Self {
|
||||||
|
base: self.base,
|
||||||
|
projection: Vec::from_iter(self.projection.iter().copied().chain([elem])),
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> From<Local> for PlaceBuilder<'tcx> {
|
impl<'tcx> From<Local> for PlaceBuilder<'tcx> {
|
||||||
|
|
|
@ -363,10 +363,8 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
||||||
.map(|(n, ty)| match fields_map.get(&n) {
|
.map(|(n, ty)| match fields_map.get(&n) {
|
||||||
Some(v) => v.clone(),
|
Some(v) => v.clone(),
|
||||||
None => {
|
None => {
|
||||||
let place_builder = place_builder.clone();
|
let place = place_builder.clone_project(PlaceElem::Field(n, *ty));
|
||||||
this.consume_by_copy_or_move(
|
this.consume_by_copy_or_move(place.to_place(this))
|
||||||
place_builder.field(n, *ty).to_place(this),
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.collect()
|
.collect()
|
||||||
|
|
|
@ -168,7 +168,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
||||||
let scrutinee_place =
|
let scrutinee_place =
|
||||||
unpack!(block = self.lower_scrutinee(block, scrutinee, scrutinee_span,));
|
unpack!(block = self.lower_scrutinee(block, scrutinee, scrutinee_span,));
|
||||||
|
|
||||||
let mut arm_candidates = self.create_match_candidates(scrutinee_place.clone(), &arms);
|
let mut arm_candidates = self.create_match_candidates(&scrutinee_place, &arms);
|
||||||
|
|
||||||
let match_has_guard = arm_candidates.iter().any(|(_, candidate)| candidate.has_guard);
|
let match_has_guard = arm_candidates.iter().any(|(_, candidate)| candidate.has_guard);
|
||||||
let mut candidates =
|
let mut candidates =
|
||||||
|
@ -230,7 +230,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
||||||
/// Create the initial `Candidate`s for a `match` expression.
|
/// Create the initial `Candidate`s for a `match` expression.
|
||||||
fn create_match_candidates<'pat>(
|
fn create_match_candidates<'pat>(
|
||||||
&mut self,
|
&mut self,
|
||||||
scrutinee: PlaceBuilder<'tcx>,
|
scrutinee: &PlaceBuilder<'tcx>,
|
||||||
arms: &'pat [ArmId],
|
arms: &'pat [ArmId],
|
||||||
) -> Vec<(&'pat Arm<'tcx>, Candidate<'pat, 'tcx>)>
|
) -> Vec<(&'pat Arm<'tcx>, Candidate<'pat, 'tcx>)>
|
||||||
where
|
where
|
||||||
|
@ -1332,7 +1332,6 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
||||||
bug!("Or-patterns should have been sorted to the end");
|
bug!("Or-patterns should have been sorted to the end");
|
||||||
};
|
};
|
||||||
let or_span = match_pair.pattern.span;
|
let or_span = match_pair.pattern.span;
|
||||||
let place = match_pair.place;
|
|
||||||
|
|
||||||
first_candidate.visit_leaves(|leaf_candidate| {
|
first_candidate.visit_leaves(|leaf_candidate| {
|
||||||
self.test_or_pattern(
|
self.test_or_pattern(
|
||||||
|
@ -1340,7 +1339,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
||||||
&mut otherwise,
|
&mut otherwise,
|
||||||
pats,
|
pats,
|
||||||
or_span,
|
or_span,
|
||||||
place.clone(),
|
&match_pair.place,
|
||||||
fake_borrows,
|
fake_borrows,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
@ -1368,7 +1367,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
||||||
otherwise: &mut Option<BasicBlock>,
|
otherwise: &mut Option<BasicBlock>,
|
||||||
pats: &'pat [Box<Pat<'tcx>>],
|
pats: &'pat [Box<Pat<'tcx>>],
|
||||||
or_span: Span,
|
or_span: Span,
|
||||||
place: PlaceBuilder<'tcx>,
|
place: &PlaceBuilder<'tcx>,
|
||||||
fake_borrows: &mut Option<FxIndexSet<Place<'tcx>>>,
|
fake_borrows: &mut Option<FxIndexSet<Place<'tcx>>>,
|
||||||
) {
|
) {
|
||||||
debug!("candidate={:#?}\npats={:#?}", candidate, pats);
|
debug!("candidate={:#?}\npats={:#?}", candidate, pats);
|
||||||
|
@ -1607,7 +1606,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
||||||
// encounter a candidate where the test is not relevant; at
|
// encounter a candidate where the test is not relevant; at
|
||||||
// that point, we stop sorting.
|
// that point, we stop sorting.
|
||||||
while let Some(candidate) = candidates.first_mut() {
|
while let Some(candidate) = candidates.first_mut() {
|
||||||
let Some(idx) = self.sort_candidate(&match_place.clone(), &test, candidate) else {
|
let Some(idx) = self.sort_candidate(&match_place, &test, candidate) else {
|
||||||
break;
|
break;
|
||||||
};
|
};
|
||||||
let (candidate, rest) = candidates.split_first_mut().unwrap();
|
let (candidate, rest) = candidates.split_first_mut().unwrap();
|
||||||
|
@ -1676,7 +1675,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
||||||
target_blocks
|
target_blocks
|
||||||
};
|
};
|
||||||
|
|
||||||
self.perform_test(span, scrutinee_span, block, match_place, &test, make_target_blocks);
|
self.perform_test(span, scrutinee_span, block, &match_place, &test, make_target_blocks);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Determine the fake borrows that are needed from a set of places that
|
/// Determine the fake borrows that are needed from a set of places that
|
||||||
|
|
|
@ -73,8 +73,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
||||||
{
|
{
|
||||||
existing_bindings.extend_from_slice(&new_bindings);
|
existing_bindings.extend_from_slice(&new_bindings);
|
||||||
mem::swap(&mut candidate.bindings, &mut existing_bindings);
|
mem::swap(&mut candidate.bindings, &mut existing_bindings);
|
||||||
candidate.subcandidates =
|
candidate.subcandidates = self.create_or_subcandidates(candidate, &place, pats);
|
||||||
self.create_or_subcandidates(candidate, place.clone(), pats);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -127,7 +126,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
||||||
fn create_or_subcandidates<'pat>(
|
fn create_or_subcandidates<'pat>(
|
||||||
&mut self,
|
&mut self,
|
||||||
candidate: &Candidate<'pat, 'tcx>,
|
candidate: &Candidate<'pat, 'tcx>,
|
||||||
place: PlaceBuilder<'tcx>,
|
place: &PlaceBuilder<'tcx>,
|
||||||
pats: &'pat [Box<Pat<'tcx>>],
|
pats: &'pat [Box<Pat<'tcx>>],
|
||||||
) -> Vec<Candidate<'pat, 'tcx>> {
|
) -> Vec<Candidate<'pat, 'tcx>> {
|
||||||
pats.iter()
|
pats.iter()
|
||||||
|
|
|
@ -150,7 +150,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
||||||
match_start_span: Span,
|
match_start_span: Span,
|
||||||
scrutinee_span: Span,
|
scrutinee_span: Span,
|
||||||
block: BasicBlock,
|
block: BasicBlock,
|
||||||
place_builder: PlaceBuilder<'tcx>,
|
place_builder: &PlaceBuilder<'tcx>,
|
||||||
test: &Test<'tcx>,
|
test: &Test<'tcx>,
|
||||||
make_target_blocks: impl FnOnce(&mut Self) -> Vec<BasicBlock>,
|
make_target_blocks: impl FnOnce(&mut Self) -> Vec<BasicBlock>,
|
||||||
) {
|
) {
|
||||||
|
@ -727,7 +727,8 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
||||||
let downcast_place = match_pair.place.downcast(adt_def, variant_index); // `(x as Variant)`
|
let downcast_place = match_pair.place.downcast(adt_def, variant_index); // `(x as Variant)`
|
||||||
let consequent_match_pairs = subpatterns.iter().map(|subpattern| {
|
let consequent_match_pairs = subpatterns.iter().map(|subpattern| {
|
||||||
// e.g., `(x as Variant).0`
|
// e.g., `(x as Variant).0`
|
||||||
let place = downcast_place.clone().field(subpattern.field, subpattern.pattern.ty);
|
let place = downcast_place
|
||||||
|
.clone_project(PlaceElem::Field(subpattern.field, subpattern.pattern.ty));
|
||||||
// e.g., `(x as Variant).0 @ P1`
|
// e.g., `(x as Variant).0 @ P1`
|
||||||
MatchPair::new(place, &subpattern.pattern, self)
|
MatchPair::new(place, &subpattern.pattern, self)
|
||||||
});
|
});
|
||||||
|
|
|
@ -18,7 +18,8 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
||||||
subpatterns
|
subpatterns
|
||||||
.iter()
|
.iter()
|
||||||
.map(|fieldpat| {
|
.map(|fieldpat| {
|
||||||
let place = place.clone().field(fieldpat.field, fieldpat.pattern.ty);
|
let place =
|
||||||
|
place.clone_project(PlaceElem::Field(fieldpat.field, fieldpat.pattern.ty));
|
||||||
MatchPair::new(place, &fieldpat.pattern, self)
|
MatchPair::new(place, &fieldpat.pattern, self)
|
||||||
})
|
})
|
||||||
.collect()
|
.collect()
|
||||||
|
@ -45,13 +46,12 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
||||||
match_pairs.extend(prefix.iter().enumerate().map(|(idx, subpattern)| {
|
match_pairs.extend(prefix.iter().enumerate().map(|(idx, subpattern)| {
|
||||||
let elem =
|
let elem =
|
||||||
ProjectionElem::ConstantIndex { offset: idx as u64, min_length, from_end: false };
|
ProjectionElem::ConstantIndex { offset: idx as u64, min_length, from_end: false };
|
||||||
let place = place.clone().project(elem);
|
MatchPair::new(place.clone_project(elem), subpattern, self)
|
||||||
MatchPair::new(place, subpattern, self)
|
|
||||||
}));
|
}));
|
||||||
|
|
||||||
if let Some(subslice_pat) = opt_slice {
|
if let Some(subslice_pat) = opt_slice {
|
||||||
let suffix_len = suffix.len() as u64;
|
let suffix_len = suffix.len() as u64;
|
||||||
let subslice = place.clone().project(ProjectionElem::Subslice {
|
let subslice = place.clone_project(PlaceElem::Subslice {
|
||||||
from: prefix.len() as u64,
|
from: prefix.len() as u64,
|
||||||
to: if exact_size { min_length - suffix_len } else { suffix_len },
|
to: if exact_size { min_length - suffix_len } else { suffix_len },
|
||||||
from_end: !exact_size,
|
from_end: !exact_size,
|
||||||
|
@ -66,7 +66,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
||||||
min_length,
|
min_length,
|
||||||
from_end: !exact_size,
|
from_end: !exact_size,
|
||||||
};
|
};
|
||||||
let place = place.clone().project(elem);
|
let place = place.clone_project(elem);
|
||||||
MatchPair::new(place, subpattern, self)
|
MatchPair::new(place, subpattern, self)
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue