1
Fork 0

Use Place directly, it's Copy more use cases

This commit is contained in:
Santiago Pastorino 2020-03-30 20:25:43 -03:00
parent 760bca4f5b
commit 25528c1e28
No known key found for this signature in database
GPG key ID: 8131A24E0C79EFAF
4 changed files with 25 additions and 28 deletions

View file

@ -230,7 +230,7 @@ fn build_drop_shim<'tcx>(
elaborate_drops::elaborate_drop(
&mut elaborator,
source_info,
&dropee,
dropee,
(),
return_block,
elaborate_drops::Unwind::To(resume_block),

View file

@ -346,7 +346,7 @@ impl<'b, 'tcx> ElaborateDropsCtxt<'b, 'tcx> {
let resume_block = self.patch.resume_block();
match terminator.kind {
TerminatorKind::Drop { ref location, target, unwind } => {
TerminatorKind::Drop { location, target, unwind } => {
self.init_data.seek_before(loc);
match self.move_data().rev_lookup.find(location.as_ref()) {
LookupResult::Exact(path) => elaborate_drop(
@ -371,7 +371,7 @@ impl<'b, 'tcx> ElaborateDropsCtxt<'b, 'tcx> {
}
}
}
TerminatorKind::DropAndReplace { ref location, ref value, target, unwind } => {
TerminatorKind::DropAndReplace { location, ref value, target, unwind } => {
assert!(!data.is_cleanup);
self.elaborate_replace(loc, location, value, target, unwind);
@ -396,7 +396,7 @@ impl<'b, 'tcx> ElaborateDropsCtxt<'b, 'tcx> {
fn elaborate_replace(
&mut self,
loc: Location,
location: &Place<'tcx>,
location: Place<'tcx>,
value: &Operand<'tcx>,
target: BasicBlock,
unwind: Option<BasicBlock>,
@ -407,7 +407,7 @@ impl<'b, 'tcx> ElaborateDropsCtxt<'b, 'tcx> {
assert!(!data.is_cleanup, "DropAndReplace in unwind path not supported");
let assign = Statement {
kind: StatementKind::Assign(box (*location, Rvalue::Use(value.clone()))),
kind: StatementKind::Assign(box (location, Rvalue::Use(value.clone()))),
source_info: terminator.source_info,
};
@ -459,7 +459,7 @@ impl<'b, 'tcx> ElaborateDropsCtxt<'b, 'tcx> {
debug!("elaborate_drop_and_replace({:?}) - untracked {:?}", terminator, parent);
self.patch.patch_terminator(
bb,
TerminatorKind::Drop { location: *location, target, unwind: Some(unwind) },
TerminatorKind::Drop { location, target, unwind: Some(unwind) },
);
}
}

View file

@ -853,7 +853,7 @@ fn elaborate_generator_drops<'tcx>(
elaborate_drop(
&mut elaborator,
*source_info,
&Place::from(SELF_ARG),
Place::from(SELF_ARG),
(),
*target,
unwind,

View file

@ -100,7 +100,7 @@ where
source_info: SourceInfo,
place: &'l Place<'tcx>,
place: Place<'tcx>,
path: D::Path,
succ: BasicBlock,
unwind: Unwind,
@ -109,7 +109,7 @@ where
pub fn elaborate_drop<'b, 'tcx, D>(
elaborator: &mut D,
source_info: SourceInfo,
place: &Place<'tcx>,
place: Place<'tcx>,
path: D::Path,
succ: BasicBlock,
unwind: Unwind,
@ -126,7 +126,7 @@ where
D: DropElaborator<'b, 'tcx>,
'tcx: 'b,
{
fn place_ty(&self, place: &Place<'tcx>) -> Ty<'tcx> {
fn place_ty(&self, place: Place<'tcx>) -> Ty<'tcx> {
place.ty(self.elaborator.body(), self.tcx()).ty
}
@ -168,7 +168,7 @@ where
self.elaborator.patch().patch_terminator(
bb,
TerminatorKind::Drop {
location: *self.place,
location: self.place,
target: self.succ,
unwind: self.unwind.into_option(),
},
@ -195,7 +195,7 @@ where
/// (the move path is `None` if the field is a rest field).
fn move_paths_for_fields(
&self,
base_place: &Place<'tcx>,
base_place: Place<'tcx>,
variant_path: D::Path,
variant: &'tcx ty::VariantDef,
substs: SubstsRef<'tcx>,
@ -219,7 +219,7 @@ where
fn drop_subpath(
&mut self,
place: &Place<'tcx>,
place: Place<'tcx>,
path: Option<D::Path>,
succ: BasicBlock,
unwind: Unwind,
@ -267,12 +267,10 @@ where
) -> Vec<BasicBlock> {
Some(succ)
.into_iter()
.chain(fields.iter().rev().zip(unwind_ladder).map(
|(&(ref place, path), &unwind_succ)| {
succ = self.drop_subpath(place, path, succ, unwind_succ);
succ
},
))
.chain(fields.iter().rev().zip(unwind_ladder).map(|(&(place, path), &unwind_succ)| {
succ = self.drop_subpath(place, path, succ, unwind_succ);
succ
}))
.collect()
}
@ -315,7 +313,7 @@ where
debug!("drop_ladder({:?}, {:?})", self, fields);
let mut fields = fields;
fields.retain(|&(ref place, _)| {
fields.retain(|&(place, _)| {
self.place_ty(place).needs_drop(self.tcx(), self.elaborator.param_env())
});
@ -364,7 +362,7 @@ where
let unwind_succ =
self.unwind.map(|unwind| self.box_free_block(adt, substs, unwind, Unwind::InCleanup));
self.drop_subpath(&interior, interior_path, succ, unwind_succ)
self.drop_subpath(interior, interior_path, succ, unwind_succ)
}
fn open_drop_for_adt(&mut self, adt: &'tcx ty::AdtDef, substs: SubstsRef<'tcx>) -> BasicBlock {
@ -439,8 +437,7 @@ where
self.place.clone(),
ProjectionElem::Downcast(Some(variant.ident.name), variant_index),
);
let fields =
self.move_paths_for_fields(&base_place, variant_path, &variant, substs);
let fields = self.move_paths_for_fields(base_place, variant_path, &variant, substs);
values.push(discr.val);
if let Unwind::To(unwind) = unwind {
// We can't use the half-ladder from the original
@ -527,7 +524,7 @@ where
// way lies only trouble.
let discr_ty = adt.repr.discr_type().to_ty(self.tcx());
let discr = Place::from(self.new_temp(discr_ty));
let discr_rv = Rvalue::Discriminant(*self.place);
let discr_rv = Rvalue::Discriminant(self.place);
let switch_block = BasicBlockData {
statements: vec![self.assign(&discr, discr_rv)],
terminator: Some(Terminator {
@ -564,7 +561,7 @@ where
Rvalue::Ref(
tcx.lifetimes.re_erased,
BorrowKind::Mut { allow_two_phase_borrow: false },
*self.place,
self.place,
),
)],
terminator: Some(Terminator {
@ -712,7 +709,7 @@ where
let base_block = BasicBlockData {
statements: vec![
self.assign(elem_size, Rvalue::NullaryOp(NullOp::SizeOf, ety)),
self.assign(len, Rvalue::Len(*self.place)),
self.assign(len, Rvalue::Len(self.place)),
],
is_cleanup: self.unwind.is_cleanup(),
terminator: Some(Terminator {
@ -761,7 +758,7 @@ where
// cur = tmp as *mut T;
// end = Offset(cur, len);
vec![
self.assign(&tmp, Rvalue::AddressOf(Mutability::Mut, *self.place)),
self.assign(&tmp, Rvalue::AddressOf(Mutability::Mut, self.place)),
self.assign(&cur, Rvalue::Cast(CastKind::Misc, Operand::Move(tmp), iter_ty)),
self.assign(
&length_or_end,
@ -935,7 +932,7 @@ where
fn drop_block(&mut self, target: BasicBlock, unwind: Unwind) -> BasicBlock {
let block =
TerminatorKind::Drop { location: *self.place, target, unwind: unwind.into_option() };
TerminatorKind::Drop { location: self.place, target, unwind: unwind.into_option() };
self.new_block(unwind, block)
}