From 34314caea39300276375f3cd948e09a37bec6873 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Fri, 24 May 2019 01:15:08 +0200 Subject: [PATCH] Make find iterate instead of recurse --- src/librustc_mir/dataflow/move_paths/mod.rs | 27 +++++++++++---------- 1 file 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 6d619793160fb..7aaf44a8a890e 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 {