diff options
| author | Santiago Pastorino <spastorino@gmail.com> | 2019-07-30 00:07:28 +0200 |
|---|---|---|
| committer | Santiago Pastorino <spastorino@gmail.com> | 2019-09-09 18:16:49 -0300 |
| commit | e9c41148c0c834d13d6f45bfd99c8f23781c5d31 (patch) | |
| tree | 2a320e3101debf4bab12c6f07c434a0ab4328a9e /src/librustc_mir/interpret | |
| parent | 824383d4ab66abd32abc6e19b68d78ecfddcb7d4 (diff) | |
| download | rust-e9c41148c0c834d13d6f45bfd99c8f23781c5d31.tar.gz rust-e9c41148c0c834d13d6f45bfd99c8f23781c5d31.zip | |
Convert Place's projection to a boxed slice
Diffstat (limited to 'src/librustc_mir/interpret')
| -rw-r--r-- | src/librustc_mir/interpret/operand.rs | 50 | ||||
| -rw-r--r-- | src/librustc_mir/interpret/place.rs | 62 | ||||
| -rw-r--r-- | src/librustc_mir/interpret/terminator.rs | 2 |
3 files changed, 55 insertions, 59 deletions
diff --git a/src/librustc_mir/interpret/operand.rs b/src/librustc_mir/interpret/operand.rs index b5aab992e3a..06b7206f429 100644 --- a/src/librustc_mir/interpret/operand.rs +++ b/src/librustc_mir/interpret/operand.rs @@ -472,39 +472,37 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { // avoid allocations. pub(super) fn eval_place_to_op( &self, - mir_place: &mir::Place<'tcx>, + place: &mir::Place<'tcx>, layout: Option<TyLayout<'tcx>>, ) -> InterpResult<'tcx, OpTy<'tcx, M::PointerTag>> { use rustc::mir::PlaceBase; - mir_place.iterate(|place_base, place_projection| { - let mut op = match place_base { - PlaceBase::Local(mir::RETURN_PLACE) => - throw_unsup!(ReadFromReturnPointer), - PlaceBase::Local(local) => { - // Do not use the layout passed in as argument if the base we are looking at - // here is not the entire place. - // FIXME use place_projection.is_empty() when is available - let layout = if mir_place.projection.is_none() { - layout - } else { - None - }; - - self.access_local(self.frame(), *local, layout)? - } - PlaceBase::Static(place_static) => { - self.eval_static_to_mplace(place_static)?.into() - } - }; + let mut op = match &place.base { + PlaceBase::Local(mir::RETURN_PLACE) => + throw_unsup!(ReadFromReturnPointer), + PlaceBase::Local(local) => { + // Do not use the layout passed in as argument if the base we are looking at + // here is not the entire place. + // FIXME use place_projection.is_empty() when is available + let layout = if place.projection.is_empty() { + layout + } else { + None + }; - for proj in place_projection { - op = self.operand_projection(op, &proj.elem)? + self.access_local(self.frame(), *local, layout)? + } + PlaceBase::Static(place_static) => { + self.eval_static_to_mplace(&place_static)?.into() } + }; - trace!("eval_place_to_op: got {:?}", *op); - Ok(op) - }) + for elem in place.projection.iter() { + op = self.operand_projection(op, elem)? + } + + trace!("eval_place_to_op: got {:?}", *op); + Ok(op) } /// Evaluate the operand, returning a place where you can then find the data. diff --git a/src/librustc_mir/interpret/place.rs b/src/librustc_mir/interpret/place.rs index f358bb00f4d..1a285486182 100644 --- a/src/librustc_mir/interpret/place.rs +++ b/src/librustc_mir/interpret/place.rs @@ -629,45 +629,43 @@ where /// place; for reading, a more efficient alternative is `eval_place_for_read`. pub fn eval_place( &mut self, - mir_place: &mir::Place<'tcx>, + place: &mir::Place<'tcx>, ) -> InterpResult<'tcx, PlaceTy<'tcx, M::PointerTag>> { use rustc::mir::PlaceBase; - 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.subst_from_frame_and_normalize_erasing_regions( - self.frame().body.return_ty() - ) - )?, - } + let mut place_ty = 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.subst_from_frame_and_normalize_erasing_regions( + self.frame().body.return_ty() + ) + )?, } - None => throw_unsup!(InvalidNullPointerUsage), - }, - 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)?, + } + None => throw_unsup!(InvalidNullPointerUsage), + }, + 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, }, - PlaceBase::Static(place_static) => self.eval_static_to_mplace(place_static)?.into(), - }; + layout: self.layout_of_local(self.frame(), *local, None)?, + }, + PlaceBase::Static(place_static) => self.eval_static_to_mplace(&place_static)?.into(), + }; - for proj in place_projection { - place = self.place_projection(place, &proj.elem)? - } + for elem in place.projection.iter() { + place_ty = self.place_projection(place_ty, elem)? + } - self.dump_place(place.place); - Ok(place) - }) + self.dump_place(place_ty.place); + Ok(place_ty) } /// Write a scalar to a place diff --git a/src/librustc_mir/interpret/terminator.rs b/src/librustc_mir/interpret/terminator.rs index 5de297923ce..8310ef02f96 100644 --- a/src/librustc_mir/interpret/terminator.rs +++ b/src/librustc_mir/interpret/terminator.rs @@ -391,7 +391,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { // Don't forget to check the return type! if let Some(caller_ret) = dest { let callee_ret = self.eval_place( - &mir::Place::RETURN_PLACE + &mir::Place::return_place() )?; if !Self::check_argument_compat( rust_abi, |
