diff options
| author | Santiago Pastorino <spastorino@gmail.com> | 2019-05-24 01:15:08 +0200 |
|---|---|---|
| committer | Santiago Pastorino <spastorino@gmail.com> | 2019-05-24 18:16:55 +0200 |
| commit | 34314caea39300276375f3cd948e09a37bec6873 (patch) | |
| tree | c58252a7abd37a39d3ecdaa5a6ab7fd215f0aa95 | |
| parent | 27cc0db7a248308fc2634ac68d7608a20b4a1c09 (diff) | |
| download | rust-34314caea39300276375f3cd948e09a37bec6873.tar.gz rust-34314caea39300276375f3cd948e09a37bec6873.zip | |
Make find iterate instead of recurse
| -rw-r--r-- | src/librustc_mir/dataflow/move_paths/mod.rs | 27 |
1 files changed, 14 insertions, 13 deletions
diff --git a/src/librustc_mir/dataflow/move_paths/mod.rs b/src/librustc_mir/dataflow/move_paths/mod.rs index 6d619793160..7aaf44a8a89 100644 --- a/src/librustc_mir/dataflow/move_paths/mod.rs +++ b/src/librustc_mir/dataflow/move_paths/mod.rs @@ -241,21 +241,22 @@ impl MovePathLookup { // unknown place, but will rather return the nearest available // parent. pub fn find(&self, place: &Place<'tcx>) -> LookupResult { - match *place { - Place::Base(PlaceBase::Local(local)) => LookupResult::Exact(self.locals[local]), - Place::Base(PlaceBase::Static(..)) => LookupResult::Parent(None), - Place::Projection(ref proj) => { - match self.find(&proj.base) { - LookupResult::Exact(base_path) => { - match self.projections.get(&(base_path, proj.elem.lift())) { - Some(&subpath) => LookupResult::Exact(subpath), - None => LookupResult::Parent(Some(base_path)) - } - } - inexact => inexact + place.iterate(|place_base, place_projection| { + let mut result = match place_base { + PlaceBase::Local(local) => self.locals[*local], + PlaceBase::Static(..) => return LookupResult::Parent(None), + }; + + for proj in place_projection { + if let Some(&subpath) = self.projections.get(&(result, proj.elem.lift())) { + result = subpath; + } else { + return LookupResult::Parent(Some(result)); } } - } + + LookupResult::Exact(result) + }) } pub fn find_local(&self, local: Local) -> MovePathIndex { |
