]> git.lizzy.rs Git - rust.git/commitdiff
Add hacky stub version of CheckedBinaryOp.
authorScott Olson <scott@solson.me>
Sat, 11 Jun 2016 19:10:42 +0000 (13:10 -0600)
committerScott Olson <scott@solson.me>
Sat, 11 Jun 2016 19:10:42 +0000 (13:10 -0600)
src/interpreter/mod.rs

index b3de02e55b02563f54e0921d058ac6f87283ea2b..37113f38731973c8c63d699a8047bed51e609ca5 100644 (file)
@@ -861,7 +861,24 @@ fn eval_assignment(&mut self, lvalue: &mir::Lvalue<'tcx>, rvalue: &mir::Rvalue<'
                 self.memory.write_primval(dest, val)?;
             }
 
-            CheckedBinaryOp(..) => unimplemented!(),
+            // FIXME(solson): Factor this out with BinaryOp.
+            CheckedBinaryOp(bin_op, ref left, ref right) => {
+                let left_ptr = self.eval_operand(left)?;
+                let left_ty = self.operand_ty(left);
+                let left_val = self.read_primval(left_ptr, left_ty)?;
+
+                let right_ptr = self.eval_operand(right)?;
+                let right_ty = self.operand_ty(right);
+                let right_val = self.read_primval(right_ptr, right_ty)?;
+
+                let val = primval::binary_op(bin_op, left_val, right_val)?;
+                self.memory.write_primval(dest, val)?;
+
+                // FIXME(solson): Find the result type size properly. Perhaps refactor out
+                // Projection calculations so we can do the equivalent of `dest.1` here.
+                let s = self.type_size(left_ty, self.substs());
+                self.memory.write_bool(dest.offset(s as isize), false)?;
+            }
 
             UnaryOp(un_op, ref operand) => {
                 let ptr = self.eval_operand(operand)?;