Skip to content

Commit d214743

Browse files
authored
Rollup merge of rust-lang#61120 - spastorino:eval-place-iterate, r=oli-obk
Make eval_place iterate instead of recurse r? @oli-obk
2 parents 35ccfc1 + cf9ebe4 commit d214743

File tree

1 file changed

+26
-26
lines changed

1 file changed

+26
-26
lines changed

src/librustc_mir/interpret/place.rs

+26-26
Original file line numberDiff line numberDiff line change
@@ -609,40 +609,40 @@ where
609609
/// place; for reading, a more efficient alternative is `eval_place_for_read`.
610610
pub fn eval_place(
611611
&mut self,
612-
mir_place: &mir::Place<'tcx>
612+
mir_place: &mir::Place<'tcx>,
613613
) -> EvalResult<'tcx, PlaceTy<'tcx, M::PointerTag>> {
614-
use rustc::mir::Place::*;
615614
use rustc::mir::PlaceBase;
616-
let place = match *mir_place {
617-
Base(PlaceBase::Local(mir::RETURN_PLACE)) => match self.frame().return_place {
618-
Some(return_place) =>
615+
616+
mir_place.iterate(|place_base, place_projection| {
617+
let mut place = match place_base {
618+
PlaceBase::Local(mir::RETURN_PLACE) => match self.frame().return_place {
619+
Some(return_place) =>
619620
// We use our layout to verify our assumption; caller will validate
620621
// their layout on return.
621-
PlaceTy {
622-
place: *return_place,
623-
layout: self.layout_of(self.monomorphize(self.frame().mir.return_ty())?)?,
624-
},
625-
None => return err!(InvalidNullPointerUsage),
626-
},
627-
Base(PlaceBase::Local(local)) => PlaceTy {
628-
// This works even for dead/uninitialized locals; we check further when writing
629-
place: Place::Local {
630-
frame: self.cur_frame(),
631-
local,
622+
{
623+
PlaceTy {
624+
place: *return_place,
625+
layout: self
626+
.layout_of(self.monomorphize(self.frame().mir.return_ty())?)?,
627+
}
628+
}
629+
None => return err!(InvalidNullPointerUsage),
632630
},
633-
layout: self.layout_of_local(self.frame(), local, None)?,
634-
},
631+
PlaceBase::Local(local) => PlaceTy {
632+
// This works even for dead/uninitialized locals; we check further when writing
633+
place: Place::Local { frame: self.cur_frame(), local: *local },
634+
layout: self.layout_of_local(self.frame(), *local, None)?,
635+
},
636+
_ => self.eval_place_to_mplace(mir_place)?.into(),
637+
};
635638

636-
Projection(ref proj) => {
637-
let place = self.eval_place(&proj.base)?;
638-
self.place_projection(place, &proj.elem)?
639+
for proj in place_projection {
640+
place = self.place_projection(place, &proj.elem)?
639641
}
640642

641-
_ => self.eval_place_to_mplace(mir_place)?.into(),
642-
};
643-
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)