Skip to content

Commit

Permalink
Rollup merge of rust-lang#61120 - spastorino:eval-place-iterate, r=ol…
Browse files Browse the repository at this point in the history
…i-obk

Make eval_place iterate instead of recurse

r? @oli-obk
  • Loading branch information
Centril authored May 24, 2019
2 parents 35ccfc1 + cf9ebe4 commit d214743
Showing 1 changed file with 26 additions and 26 deletions.
52 changes: 26 additions & 26 deletions src/librustc_mir/interpret/place.rs
Original file line number Diff line number Diff line change
Expand Up @@ -609,40 +609,40 @@ where
/// place; for reading, a more efficient alternative is `eval_place_for_read`.
pub fn eval_place(
&mut self,
mir_place: &mir::Place<'tcx>
mir_place: &mir::Place<'tcx>,
) -> EvalResult<'tcx, PlaceTy<'tcx, M::PointerTag>> {
use rustc::mir::Place::*;
use rustc::mir::PlaceBase;
let place = match *mir_place {
Base(PlaceBase::Local(mir::RETURN_PLACE)) => match self.frame().return_place {
Some(return_place) =>

mir_place.iterate(|place_base, place_projection| {
let mut place = match place_base {
PlaceBase::Local(mir::RETURN_PLACE) => match self.frame().return_place {
Some(return_place) =>
// We use our layout to verify our assumption; caller will validate
// their layout on return.
PlaceTy {
place: *return_place,
layout: self.layout_of(self.monomorphize(self.frame().mir.return_ty())?)?,
},
None => return err!(InvalidNullPointerUsage),
},
Base(PlaceBase::Local(local)) => PlaceTy {
// This works even for dead/uninitialized locals; we check further when writing
place: Place::Local {
frame: self.cur_frame(),
local,
{
PlaceTy {
place: *return_place,
layout: self
.layout_of(self.monomorphize(self.frame().mir.return_ty())?)?,
}
}
None => return err!(InvalidNullPointerUsage),
},
layout: self.layout_of_local(self.frame(), local, None)?,
},
PlaceBase::Local(local) => PlaceTy {
// This works even for dead/uninitialized locals; we check further when writing
place: Place::Local { frame: self.cur_frame(), local: *local },
layout: self.layout_of_local(self.frame(), *local, None)?,
},
_ => self.eval_place_to_mplace(mir_place)?.into(),
};

Projection(ref proj) => {
let place = self.eval_place(&proj.base)?;
self.place_projection(place, &proj.elem)?
for proj in place_projection {
place = self.place_projection(place, &proj.elem)?
}

_ => self.eval_place_to_mplace(mir_place)?.into(),
};

self.dump_place(place.place);
Ok(place)
self.dump_place(place.place);
Ok(place)
})
}

/// Write a scalar to a place
Expand Down

0 comments on commit d214743

Please sign in to comment.