diff options
| author | Santiago Pastorino <spastorino@gmail.com> | 2019-05-24 01:28:41 +0200 |
|---|---|---|
| committer | Santiago Pastorino <spastorino@gmail.com> | 2019-05-24 23:58:21 +0200 |
| commit | e38b399d03605f68ddbec50bf31e2f6fb12d278d (patch) | |
| tree | 7a86b8e6e3324890b75bec9e764f831a53da72ac | |
| parent | 6d7a36231a902a57bd627c1f1f6cd658ea9ab717 (diff) | |
| download | rust-e38b399d03605f68ddbec50bf31e2f6fb12d278d.tar.gz rust-e38b399d03605f68ddbec50bf31e2f6fb12d278d.zip | |
Make eval_place_to_op iterate instead of recurse
| -rw-r--r-- | src/librustc_mir/interpret/operand.rs | 37 |
1 files changed, 24 insertions, 13 deletions
diff --git a/src/librustc_mir/interpret/operand.rs b/src/librustc_mir/interpret/operand.rs index 669e00c1f01..a674389a936 100644 --- a/src/librustc_mir/interpret/operand.rs +++ b/src/librustc_mir/interpret/operand.rs @@ -467,23 +467,34 @@ impl<'a, 'mir, 'tcx, M: Machine<'a, 'mir, 'tcx>> InterpretCx<'a, 'mir, 'tcx, M> mir_place: &mir::Place<'tcx>, layout: Option<TyLayout<'tcx>>, ) -> EvalResult<'tcx, OpTy<'tcx, M::PointerTag>> { - use rustc::mir::Place::*; + use rustc::mir::Place; use rustc::mir::PlaceBase; - let op = match mir_place { - Base(PlaceBase::Local(mir::RETURN_PLACE)) => return err!(ReadFromReturnPointer), - Base(PlaceBase::Local(local)) => self.access_local(self.frame(), *local, layout)?, - Base(PlaceBase::Static(place_static)) => { - self.eval_static_to_mplace(place_static)?.into() - } - Projection(proj) => { - let op = self.eval_place_to_op(&proj.base, None)?; - self.operand_projection(op, &proj.elem)? + mir_place.iterate(|place_base, place_projection| { + let mut op = match place_base { + PlaceBase::Local(mir::RETURN_PLACE) => return err!(ReadFromReturnPointer), + PlaceBase::Local(local) => { + // FIXME use place_projection.is_empty() when is available + let layout = if let Place::Base(_) = mir_place { + layout + } else { + None + }; + + self.access_local(self.frame(), *local, layout)? + } + PlaceBase::Static(place_static) => { + self.eval_static_to_mplace(place_static)?.into() + } + }; + + for proj in place_projection { + op = self.operand_projection(op, &proj.elem)? } - }; - trace!("eval_place_to_op: got {:?}", *op); - Ok(op) + trace!("eval_place_to_op: got {:?}", *op); + Ok(op) + }) } /// Evaluate the operand, returning a place where you can then find the data. |
