about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorRalf Jung <post@ralfj.de>2017-09-06 10:51:54 +0200
committerGitHub <noreply@github.com>2017-09-06 10:51:54 +0200
commitb456b7cc8dcee30a754a2f67694d5cd85b171bcf (patch)
tree796482a2698d79627afe1875b7c82814bd2001e3 /src
parentee5383fe2a035bcd5f1140e0e5e1f952b1bfa5ff (diff)
parent9fe0d60da621c982fbc9add5198e8c4f7bc961c4 (diff)
downloadrust-b456b7cc8dcee30a754a2f67694d5cd85b171bcf.tar.gz
rust-b456b7cc8dcee30a754a2f67694d5cd85b171bcf.zip
Merge pull request #330 from RalfJung/rustup
Rustup
Diffstat (limited to 'src')
-rw-r--r--src/librustc_mir/interpret/eval_context.rs4
-rw-r--r--src/librustc_mir/interpret/lvalue.rs11
-rw-r--r--src/librustc_mir/interpret/step.rs25
3 files changed, 17 insertions, 23 deletions
diff --git a/src/librustc_mir/interpret/eval_context.rs b/src/librustc_mir/interpret/eval_context.rs
index 44777caa4f5..bc227fcc398 100644
--- a/src/librustc_mir/interpret/eval_context.rs
+++ b/src/librustc_mir/interpret/eval_context.rs
@@ -467,8 +467,8 @@ impl<'a, 'tcx, M: Machine<'tcx>> EvalContext<'a, 'tcx, M> {
             for block in mir.basic_blocks() {
                 for stmt in block.statements.iter() {
                     match stmt.kind {
-                        StorageLive(mir::Lvalue::Local(local)) |
-                        StorageDead(mir::Lvalue::Local(local)) => {
+                        StorageLive(local) |
+                        StorageDead(local) => {
                             set.insert(local);
                         }
                         _ => {}
diff --git a/src/librustc_mir/interpret/lvalue.rs b/src/librustc_mir/interpret/lvalue.rs
index f26f5adfff9..3342be7300e 100644
--- a/src/librustc_mir/interpret/lvalue.rs
+++ b/src/librustc_mir/interpret/lvalue.rs
@@ -3,7 +3,7 @@ use rustc::ty::layout::{Size, Align};
 use rustc::ty::{self, Ty};
 use rustc_data_structures::indexed_vec::Idx;
 
-use super::{EvalResult, EvalContext, MemoryPointer, PrimVal, Value, Pointer, Machine, PtrAndAlign};
+use super::{EvalResult, EvalContext, MemoryPointer, PrimVal, Value, Pointer, Machine, PtrAndAlign, ValTy};
 
 #[derive(Copy, Clone, Debug)]
 pub enum Lvalue {
@@ -400,7 +400,7 @@ impl<'a, 'tcx, M: Machine<'tcx>> EvalContext<'a, 'tcx, M> {
         &mut self,
         base: Lvalue,
         base_ty: Ty<'tcx>,
-        proj_elem: &mir::ProjectionElem<'tcx, mir::Operand<'tcx>, Ty<'tcx>>,
+        proj_elem: &mir::ProjectionElem<'tcx, mir::Local, Ty<'tcx>>,
     ) -> EvalResult<'tcx, Lvalue> {
         use rustc::mir::ProjectionElem::*;
         let (ptr, extra) = match *proj_elem {
@@ -439,9 +439,10 @@ impl<'a, 'tcx, M: Machine<'tcx>> EvalContext<'a, 'tcx, M> {
                 return self.val_to_lvalue(val, pointee_type);
             }
 
-            Index(ref operand) => {
-                let n_ptr = self.eval_operand(operand)?;
-                let n = self.value_to_primval(n_ptr)?.to_u64()?;
+            Index(local) => {
+                let value = self.frame().get_local(local)?;
+                let ty = self.tcx.types.usize;
+                let n = self.value_to_primval(ValTy { value, ty })?.to_u64()?;
                 return self.lvalue_index(base, base_ty, n);
             }
 
diff --git a/src/librustc_mir/interpret/step.rs b/src/librustc_mir/interpret/step.rs
index ea90e39489d..e7d5a83532b 100644
--- a/src/librustc_mir/interpret/step.rs
+++ b/src/librustc_mir/interpret/step.rs
@@ -145,22 +145,15 @@ impl<'a, 'tcx, M: Machine<'tcx>> EvalContext<'a, 'tcx, M> {
                 }
             }
 
-            // Mark locals as dead or alive.
-            StorageLive(ref lvalue) |
-            StorageDead(ref lvalue) => {
-                let (frame, local) =
-                    match self.eval_lvalue(lvalue)? {
-                        Lvalue::Local { frame, local } if self.cur_frame() == frame => (
-                            frame,
-                            local,
-                        ),
-                        _ => return err!(Unimplemented("Storage annotations must refer to locals of the topmost stack frame.".to_owned())), // FIXME maybe this should get its own error type
-                    };
-                let old_val = match stmt.kind {
-                    StorageLive(_) => self.stack[frame].storage_live(local)?,
-                    StorageDead(_) => self.stack[frame].storage_dead(local)?,
-                    _ => bug!("We already checked that we are a storage stmt"),
-                };
+            // Mark locals as alive
+            StorageLive(local) => {
+                let old_val = self.frame_mut().storage_live(local)?;
+                self.deallocate_local(old_val)?;
+            }
+
+            // Mark locals as dead
+            StorageDead(local) => {
+                let old_val = self.frame_mut().storage_dead(local)?;
                 self.deallocate_local(old_val)?;
             }