summaryrefslogtreecommitdiffstats
path: root/bytecode/src/main.rs
diff options
context:
space:
mode:
authorRose Hogenson <rosehogenson@posteo.net>2024-04-28 15:06:43 -0700
committerRose Hogenson <rosehogenson@posteo.net>2024-04-28 15:06:43 -0700
commit5737e8430d43b3b5bd448f761cd2f3c35707a174 (patch)
treeb24f44ea5245a56b2f712c2eef6a3897f53bd098 /bytecode/src/main.rs
parent9f5889c1263d63b953b3a324da07321deef5ca58 (diff)
downloadsml-5737e8430d43b3b5bd448f761cd2f3c35707a174.tar.zst
Add case over int.
Diffstat (limited to 'bytecode/src/main.rs')
-rw-r--r--bytecode/src/main.rs28
1 files changed, 28 insertions, 0 deletions
diff --git a/bytecode/src/main.rs b/bytecode/src/main.rs
index bbc0ddd..4cba4ef 100644
--- a/bytecode/src/main.rs
+++ b/bytecode/src/main.rs
@@ -96,6 +96,34 @@ impl State {
};
self.heap.locals[usize::from(op.out)] = Value::from_int(res);
}
+ Op::Less(op) => {
+ let Some(v1) = self.read_arg(op.val1).to_int() else {
+ return Err(Box::from("less needs an int"));
+ };
+ let Some(v2) = self.read_arg(op.val2).to_int() else {
+ return Err(Box::from("less needs an int"));
+ };
+ let res = if v1 < v2 { 1 } else { 0 };
+ self.heap.locals[usize::from(op.out)] = Value::from_int(res);
+ }
+ Op::Eq(op) => {
+ let Some(v1) = self.read_arg(op.val1).to_int() else {
+ return Err(Box::from("eq needs an int"));
+ };
+ let Some(v2) = self.read_arg(op.val2).to_int() else {
+ return Err(Box::from("eq needs an int"));
+ };
+ let res = if v1 == v2 { 1 } else { 0 };
+ self.heap.locals[usize::from(op.out)] = Value::from_int(res);
+ }
+ Op::If(op) => {
+ let Some(t) = self.read_arg(op.test).to_int() else {
+ return Err(Box::from("if needs an int"));
+ };
+ if t != 0 {
+ self.i = op.target;
+ }
+ }
}
Ok(())
}