15.3.1
change vouuyxwrmykruonmzrtumysuxltnslry
commit 240d0758e019aabb4b9cd6c67e5a64b33074b59b
author Alpha Chen <alpha@kejadlen.dev>
date
parent xqoxkkon
diff --git a/rust/src/chunk.rs b/rust/src/chunk.rs
index 9274b3f..3b20be1 100644
--- a/rust/src/chunk.rs
+++ b/rust/src/chunk.rs
@@ -5,6 +5,10 @@ use crate::value::Value;
 #[derive(Debug)]
 pub enum OpCode {
     Constant(usize),
+    Add,
+    Subtract,
+    Multiply,
+    Divide,
     Negate,
     Return,
 }
@@ -68,6 +72,10 @@ impl fmt::Display for DisassembledInstruction<'_> {
                 "{:<16} {:4} '{}'",
                 "OP_CONSTANT", constant, self.chunk.constants[constant]
             )?,
+            OpCode::Add => write!(f, "OP_ADD")?,
+            OpCode::Subtract => write!(f, "OP_SUBTRACT")?,
+            OpCode::Multiply => write!(f, "OP_MULTIPLY")?,
+            OpCode::Divide => write!(f, "OP_DIVIDE")?,
             OpCode::Negate => write!(f, "OP_NEGATE")?,
             OpCode::Return => write!(f, "OP_RETURN")?,
         }
diff --git a/rust/src/main.rs b/rust/src/main.rs
index 153f8eb..73bf577 100644
--- a/rust/src/main.rs
+++ b/rust/src/main.rs
@@ -19,7 +19,14 @@ fn main() -> Result<()> {
     let mut chunk = Chunk::default();
 
     chunk.push_constant(1.2, 123);
+    chunk.push_constant(3.4, 123);
+    chunk.push(OpCode::Add, 123);
+
+    chunk.push_constant(5.6, 123);
+    chunk.push(OpCode::Divide, 123);
+
     chunk.push(OpCode::Negate, 123);
+
     chunk.push(OpCode::Return, 123);
 
     chunk.disassemble("test chunk");
diff --git a/rust/src/vm.rs b/rust/src/vm.rs
index efc7910..e13ef97 100644
--- a/rust/src/vm.rs
+++ b/rust/src/vm.rs
@@ -1,3 +1,5 @@
+use std::ops::{Add, Div, Mul, Sub};
+
 use color_eyre::eyre::Result;
 use thiserror::Error;
 
@@ -42,6 +44,10 @@ impl VM {
                     let value = self.chunk.constants[*constant];
                     self.push(value);
                 }
+                OpCode::Add => self.binary_op(Value::add),
+                OpCode::Subtract => self.binary_op(Value::sub),
+                OpCode::Multiply => self.binary_op(Value::mul),
+                OpCode::Divide => self.binary_op(Value::div),
                 OpCode::Negate => {
                     let value = self.pop();
                     self.push(-value);
@@ -65,4 +71,10 @@ impl VM {
         self.stack_top -= 1;
         self.stack[self.stack_top]
     }
+
+    fn binary_op<T: Fn(Value, Value) -> Value>(&mut self, op: T) {
+        let b = self.pop();
+        let a = self.pop();
+        self.push(op(a, b));
+    }
 }