]> git.lizzy.rs Git - rust.git/commitdiff
Handle "offset" intrinsic on integer pointers.
authorScott Olson <scott@solson.me>
Sat, 19 Mar 2016 15:09:13 +0000 (09:09 -0600)
committerScott Olson <scott@solson.me>
Sat, 19 Mar 2016 15:09:13 +0000 (09:09 -0600)
src/interpreter.rs

index a15eec77b5b7f2b6b4d20597c604b789b09d205b..52463c1af55ca7803b4e4b454e6b0b421815b494 100644 (file)
@@ -342,11 +342,21 @@ fn call_intrinsic(&mut self, name: &str, substs: &'tcx Substs<'tcx>,
                 let ptr_arg    = try!(self.eval_operand(&args[0]));
                 let offset_arg = try!(self.eval_operand(&args[1]));
 
-                let ptr    = try!(self.memory.read_ptr(ptr_arg));
                 let offset = try!(self.memory.read_int(offset_arg, self.memory.pointer_size));
 
-                let result_ptr = ptr.offset(offset as isize * pointee_size);
-                try!(self.memory.write_ptr(dest, result_ptr));
+                match self.memory.read_ptr(ptr_arg) {
+                    Ok(ptr) => {
+                        let result_ptr = ptr.offset(offset as isize * pointee_size);
+                        try!(self.memory.write_ptr(dest, result_ptr));
+                    }
+                    Err(EvalError::ReadBytesAsPointer) => {
+                        let psize = self.memory.pointer_size;
+                        let addr = try!(self.memory.read_int(ptr_arg, psize));
+                        let result_addr = addr + offset * pointee_size as i64;
+                        try!(self.memory.write_int(dest, result_addr, psize));
+                    }
+                    Err(e) => return Err(e),
+                }
             }
 
             "size_of" => {