diff options
| -rw-r--r-- | src/main.rs | 4 | ||||
| -rw-r--r-- | src/vm.rs | 34 |
2 files changed, 37 insertions, 1 deletions
diff --git a/src/main.rs b/src/main.rs index f407767..72fb8a1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -13,6 +13,10 @@ fn main() { let mut blocks = vm::Block::new("main"); blocks.add(vm::Op::Constant(vm::Value::Bool(true))); blocks.add(vm::Op::Print); + blocks.add(vm::Op::Constant(vm::Value::Int(123))); + blocks.add(vm::Op::Constant(vm::Value::Int(123))); + blocks.add(vm::Op::Add); + blocks.add(vm::Op::Print); blocks.add(vm::Op::Return); vm::run_block(blocks); @@ -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 => { |
