aboutsummaryrefslogtreecommitdiffstats
path: root/src/vm.rs
diff options
context:
space:
mode:
authorGustav Sörnäs <gustav@sornas.net>2021-01-09 21:25:39 +0100
committerGustav Sörnäs <gustav@sornas.net>2021-01-09 21:25:39 +0100
commit3ede943556bebb85427415f21ec231973da9e080 (patch)
tree4750e3123303799d08407776f3ed820801f8a067 /src/vm.rs
parent3971c2a09ab6fedc6bdcf5b7597fbf3d0bafeb0d (diff)
downloadsylt-3ede943556bebb85427415f21ec231973da9e080.tar.gz
wip line numbers and errors
Diffstat (limited to 'src/vm.rs')
-rw-r--r--src/vm.rs40
1 files changed, 34 insertions, 6 deletions
diff --git a/src/vm.rs b/src/vm.rs
index 633b920..d45e4d6 100644
--- a/src/vm.rs
+++ b/src/vm.rs
@@ -1,3 +1,7 @@
+use std::collections::HashMap;
+
+use crate::tokenizer::PlacedToken;
+
#[derive(Debug, Clone, Copy, PartialEq, PartialOrd)]
pub enum Value {
@@ -34,27 +38,38 @@ pub enum Op {
#[derive(Debug)]
pub struct Block {
name: String,
+ filename: String,
ops: Vec<Op>,
+ last_line_offset: Option<usize>,
+ line_offsets: HashMap<usize, usize>,
}
impl Block {
- pub fn new(name: &str) -> Self {
+ pub fn new(name: &str, filename: &str) -> Self {
Self {
name: String::from(name),
+ filename: String::from(filename),
ops: Vec::new(),
+ last_line_offset: None,
+ line_offsets: HashMap::new(),
}
}
- pub fn add(&mut self, op: Op) -> usize {
+ pub fn add(&mut self, op: Op, token_position: Option<usize>) -> usize {
let len = self.ops.len();
+ if token_position != self.last_line_offset {
+ if let Some(token_position) = token_position {
+ self.line_offsets.insert(len, token_position);
+ }
+ }
self.ops.push(op);
len
}
- pub fn add_from(&mut self, ops: &[Op]) -> usize {
+ pub fn add_from(&mut self, ops: &[Op], token_position: Option<usize>) -> usize {
let len = self.ops.len();
for op in ops {
- self.add(*op);
+ self.add(*op, token_position);
}
len
}
@@ -68,6 +83,19 @@ pub struct VM {
ip: usize,
}
+#[derive(Debug)]
+pub enum VMErrorKind {
+ TypeError(Value, Value),
+ AssertFailed(Value, Value),
+}
+
+#[derive(Debug)]
+pub struct VMError {
+ kind: VMErrorKind,
+ token: PlacedToken,
+ message: String,
+}
+
pub fn run_block(block: Block) {
let mut vm = VM {
stack: Vec::new(),
@@ -89,7 +117,7 @@ impl VM {
self.stack.get(self.stack.len() - amount)
}
- pub fn run(&mut self) {
+ pub fn run(&mut self) -> Result<(), VMError>{
const PRINT_WHILE_RUNNING: bool = true;
const PRINT_BLOCK: bool = true;
@@ -211,7 +239,7 @@ impl VM {
}
Op::Return => {
- return;
+ return Ok(());
}
}
self.ip += 1;