Skip to content

Commit

Permalink
Make move_path_children_matching closure take a PlaceElem instead of …
Browse files Browse the repository at this point in the history
…a slice
  • Loading branch information
spastorino committed Sep 9, 2019
1 parent 7efee8d commit b04e6c7
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 16 deletions.
11 changes: 7 additions & 4 deletions src/librustc_mir/dataflow/drop_flag_effects.rs
Expand Up @@ -10,14 +10,17 @@ pub fn move_path_children_matching<'tcx, F>(move_data: &MoveData<'tcx>,
path: MovePathIndex,
mut cond: F)
-> Option<MovePathIndex>
where F: FnMut(&[mir::PlaceElem<'tcx>]) -> bool
where F: FnMut(&mir::PlaceElem<'tcx>) -> bool
{
let mut next_child = move_data.move_paths[path].first_child;
while let Some(child_index) = next_child {
if cond(&move_data.move_paths[child_index].place.projection) {
return Some(child_index)
let move_path_children = &move_data.move_paths[child_index];
if let Some(elem) = move_path_children.place.projection.last() {
if cond(elem) {
return Some(child_index)
}
}
next_child = move_data.move_paths[child_index].next_sibling;
next_child = move_path_children.next_sibling;
}

None
Expand Down
21 changes: 9 additions & 12 deletions src/librustc_mir/transform/elaborate_drops.rs
Expand Up @@ -236,36 +236,33 @@ impl<'a, 'b, 'tcx> DropElaborator<'a, 'tcx> for Elaborator<'a, 'b, 'tcx> {
}

fn field_subpath(&self, path: Self::Path, field: Field) -> Option<Self::Path> {
dataflow::move_path_children_matching(self.ctxt.move_data(), path, |p| match p {
[.., ProjectionElem::Field(idx, _)] => *idx == field,
dataflow::move_path_children_matching(self.ctxt.move_data(), path, |e| match e {
ProjectionElem::Field(idx, _) => *idx == field,
_ => false,
})
}

fn array_subpath(&self, path: Self::Path, index: u32, size: u32) -> Option<Self::Path> {
dataflow::move_path_children_matching(self.ctxt.move_data(), path, |p| match p {
[.., ProjectionElem::ConstantIndex { offset, min_length: _, from_end: false }] => {
dataflow::move_path_children_matching(self.ctxt.move_data(), path, |e| match e {
ProjectionElem::ConstantIndex { offset, min_length: _, from_end: false } => {
*offset == index
}
[.., ProjectionElem::ConstantIndex { offset, min_length: _, from_end: true }] => {
ProjectionElem::ConstantIndex { offset, min_length: _, from_end: true } => {
size - offset == index
}
_ => false,
})
}

fn deref_subpath(&self, path: Self::Path) -> Option<Self::Path> {
dataflow::move_path_children_matching(self.ctxt.move_data(), path, |p| {
match p {
[.., ProjectionElem::Deref] => true,
_ => false
}
dataflow::move_path_children_matching(self.ctxt.move_data(), path, |e| {
*e == ProjectionElem::Deref
})
}

fn downcast_subpath(&self, path: Self::Path, variant: VariantIdx) -> Option<Self::Path> {
dataflow::move_path_children_matching(self.ctxt.move_data(), path, |p| match p {
[.., ProjectionElem::Downcast(_, idx)] => *idx == variant,
dataflow::move_path_children_matching(self.ctxt.move_data(), path, |e| match e {
ProjectionElem::Downcast(_, idx) => *idx == variant,
_ => false
})
}
Expand Down

0 comments on commit b04e6c7

Please sign in to comment.