aboutsummaryrefslogtreecommitdiffstats
path: root/src/vm.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/vm.rs')
-rw-r--r--src/vm.rs34
1 files changed, 33 insertions, 1 deletions
diff --git a/src/vm.rs b/src/vm.rs
index 6b26b65..6a3ccd3 100644
--- a/src/vm.rs
+++ b/src/vm.rs
@@ -10,6 +10,10 @@ pub enum Value {
pub enum Op {
Pop,
Constant(Value),
+ Add,
+ Sub,
+ Mul,
+ Div,
Print,
Return,
}
@@ -87,8 +91,36 @@ impl VM {
self.stack.push(value);
}
+ Op::Add => {
+ let b = self.stack.pop().unwrap();
+ let a = self.stack.pop().unwrap();
+ match (a, b) {
+ (Value::Float(a), Value::Float(b)) => self.stack.push(Value::Float(b + a)),
+ (Value::Int(a), Value::Int(b)) => self.stack.push(Value::Int(b + a)),
+ _ => unimplemented!("Cannot add '{:?}' and '{:?}'.", a, b),
+ }
+ }
+
+ Op::Sub => {
+ let b = self.stack.pop().unwrap();
+ let a = self.stack.pop().unwrap();
+ match (a, b) {
+ (Value::Float(a), Value::Float(b)) => self.stack.push(Value::Float(b - a)),
+ (Value::Int(a), Value::Int(b)) => self.stack.push(Value::Int(b - a)),
+ _ => unimplemented!("Cannot sub '{:?}' and '{:?}'.", a, b),
+ }
+ }
+
+ Op::Mul => {
+ todo!();
+ }
+
+ Op::Div => {
+ todo!();
+ }
+
Op::Print => {
- println!("PRINT: {:?}", self.stack[0]);
+ println!("PRINT: {:?}", self.stack.pop());
}
Op::Return => {