aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEdvard Thörnros <edvard.thornros@gmail.com>2021-01-09 16:15:55 +0100
committerEdvard Thörnros <edvard.thornros@gmail.com>2021-01-09 16:15:55 +0100
commit158c2c284fa61be972dd868e2f262f9e04a0edb4 (patch)
tree2a5e26df6993deba75ba9fc91d2784f1623c24a6
parent0bd19fbf34dff8b3030fcc243e05e5e894acfff5 (diff)
downloadsylt-158c2c284fa61be972dd868e2f262f9e04a0edb4.tar.gz
Add, Sub
-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 => {