Skip to content

Commit e8beea7

Browse files
committed
Make eval_place iterate instead of recurse
1 parent f492693 commit e8beea7

File tree

1 file changed

+29
-29
lines changed

1 file changed

+29
-29
lines changed

src/librustc_mir/interpret/place.rs

+29-29
Original file line numberDiff line numberDiff line change
@@ -607,42 +607,42 @@ where
607607
/// place; for reading, a more efficient alternative is `eval_place_for_read`.
608608
pub fn eval_place(
609609
&mut self,
610-
mir_place: &mir::Place<'tcx>
610+
mir_place: &mir::Place<'tcx>,
611611
) -> EvalResult<'tcx, PlaceTy<'tcx, M::PointerTag>> {
612-
use rustc::mir::Place::*;
613612
use rustc::mir::PlaceBase;
614-
let place = match mir_place {
615-
Base(PlaceBase::Local(mir::RETURN_PLACE)) => match self.frame().return_place {
616-
Some(return_place) =>
617-
// We use our layout to verify our assumption; caller will validate
618-
// their layout on return.
619-
PlaceTy {
620-
place: *return_place,
621-
layout: self.layout_of(self.monomorphize(self.frame().mir.return_ty())?)?,
613+
614+
mir_place.iterate(|place_base, place_projection| {
615+
let mut place = match place_base {
616+
PlaceBase::Local(mir::RETURN_PLACE) => match self.frame().return_place {
617+
Some(return_place) => {
618+
// We use our layout to verify our assumption; caller will validate
619+
// their layout on return.
620+
PlaceTy {
621+
place: *return_place,
622+
layout: self
623+
.layout_of(self.monomorphize(self.frame().mir.return_ty())?)?,
624+
}
625+
}
626+
None => return err!(InvalidNullPointerUsage),
627+
},
628+
PlaceBase::Local(local) => PlaceTy {
629+
// This works even for dead/uninitialized locals; we check further when writing
630+
place: Place::Local {
631+
frame: self.cur_frame(),
632+
local: *local,
622633
},
623-
None => return err!(InvalidNullPointerUsage),
624-
},
625-
Base(PlaceBase::Local(local)) => PlaceTy {
626-
// This works even for dead/uninitialized locals; we check further when writing
627-
place: Place::Local {
628-
frame: self.cur_frame(),
629-
local: *local,
634+
layout: self.layout_of_local(self.frame(), *local, None)?,
630635
},
631-
layout: self.layout_of_local(self.frame(), *local, None)?,
632-
},
633-
634-
Projection(proj) => {
635-
let place = self.eval_place(&proj.base)?;
636-
self.place_projection(place, &proj.elem)?
637-
}
636+
PlaceBase::Static(place_static) => self.eval_static_to_mplace(place_static)?.into(),
637+
};
638638

639-
Base(PlaceBase::Static(place_static)) => {
640-
self.eval_static_to_mplace(place_static)?.into()
639+
for proj in place_projection {
640+
place = self.place_projection(place, &proj.elem)?
641641
}
642-
};
643642

644-
self.dump_place(place.place);
645-
Ok(place)
643+
self.dump_place(place.place);
644+
Ok(place)
645+
})
646646
}
647647

648648
/// Write a scalar to a place

0 commit comments

Comments
 (0)