aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main.rs4
-rw-r--r--src/vm.rs34
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);
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 => {