From 92075e6bc23d63d62e2d0caf83acbf81ad0ccd99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edvard=20Th=C3=B6rnros?= Date: Thu, 28 Jan 2021 20:16:08 +0100 Subject: Pass blobs all the way --- src/vm.rs | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) (limited to 'src/vm.rs') diff --git a/src/vm.rs b/src/vm.rs index 5f7e0e3..cb30704 100644 --- a/src/vm.rs +++ b/src/vm.rs @@ -8,6 +8,7 @@ use std::cell::RefCell; use crate::compiler::Type; use crate::error::{Error, ErrorKind}; +use crate::compiler::{Prog, Blob}; macro_rules! error { ( $thing:expr, $kind:expr) => { @@ -276,6 +277,9 @@ pub struct VM { stack: Vec, frames: Vec, + + blobs: Vec>, + print_blocks: bool, print_ops: bool, } @@ -291,6 +295,7 @@ impl VM { upvalues: HashMap::new(), stack: Vec::new(), frames: Vec::new(), + blobs: Vec::new(), print_blocks: false, print_ops: false, } @@ -620,7 +625,9 @@ impl VM { self.frame().block.borrow().ops[self.frame().ip]); } - pub fn run(&mut self, block: Rc>) -> Result<(), Error>{ + pub fn run(&mut self, prog: &Prog) -> Result<(), Error>{ + let block = Rc::clone(&prog.blocks[0]); + self.blobs = prog.blobs.clone(); self.stack.clear(); self.frames.clear(); @@ -834,10 +841,10 @@ impl VM { errors } - pub fn typecheck(&mut self, blocks: &Vec>>) -> Result<(), Vec> { + pub fn typecheck(&mut self, prog: &Prog) -> Result<(), Vec> { let mut errors = Vec::new(); - for block in blocks.iter() { + for block in prog.blocks.iter() { errors.append(&mut self.typecheck_block(Rc::clone(block))); } -- cgit v1.2.1 From b7e480f93f8ea3feb9155df207bb308b11e79303 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edvard=20Th=C3=B6rnros?= Date: Thu, 28 Jan 2021 20:54:24 +0100 Subject: Creating blobs --- src/vm.rs | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) (limited to 'src/vm.rs') diff --git a/src/vm.rs b/src/vm.rs index cb30704..df970db 100644 --- a/src/vm.rs +++ b/src/vm.rs @@ -21,6 +21,8 @@ macro_rules! error { #[derive(Clone)] pub enum Value { + Blob(usize), + BlobInstance(usize, Vec), Float(f64), Int(i64), Bool(bool), @@ -75,6 +77,8 @@ impl UpValue { impl Debug for Value { fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { + Value::Blob(i) => write!(fmt, "(blob {})", i), + Value::BlobInstance(i, v) => write!(fmt, "(inst {} {:?})", i, v), Value::Float(f) => write!(fmt, "(float {})", f), Value::Int(i) => write!(fmt, "(int {})", i), Value::Bool(b) => write!(fmt, "(bool {})", b), @@ -98,6 +102,8 @@ impl Value { fn as_type(&self) -> Type { match self { + Value::BlobInstance(i, _) => Type::BlobInstance(*i), + Value::Blob(i) => Type::Blob(*i), Value::Float(_) => Type::Float, Value::Int(_) => Type::Int, Value::Bool(_) => Type::Bool, @@ -557,7 +563,22 @@ impl VM { Op::Call(num_args) => { let new_base = self.stack.len() - 1 - num_args; - match &self.stack[new_base] { + match self.stack[new_base].clone() { + Value::Blob(blob_id) => { + let blob = &self.blobs[blob_id]; + + let mut values = Vec::with_capacity(blob.name_to_field.len()); + for _ in 0..values.capacity() { + values.push(Value::Nil); + } + + for (slot, ty) in blob.name_to_field.values() { + values[*slot] = ty.as_value(); + } + + self.stack.pop(); + self.stack.push(Value::BlobInstance(blob_id, values)); + } Value::Function(_, block) => { let inner = block.borrow(); let args = inner.args(); @@ -751,6 +772,21 @@ impl VM { Op::Call(num_args) => { let new_base = self.stack.len() - 1 - num_args; match self.stack[new_base].clone() { + Value::Blob(blob_id) => { + let blob = &self.blobs[blob_id]; + + let mut values = Vec::with_capacity(blob.name_to_field.len()); + for _ in 0..values.capacity() { + values.push(Value::Nil); + } + + for (slot, ty) in blob.name_to_field.values() { + values[*slot] = ty.as_value(); + } + + self.stack.pop(); + self.stack.push(Value::BlobInstance(blob_id, values)); + } Value::Function(_, block) => { let inner = block.borrow(); let args = inner.args(); @@ -844,6 +880,7 @@ impl VM { pub fn typecheck(&mut self, prog: &Prog) -> Result<(), Vec> { let mut errors = Vec::new(); + self.blobs = prog.blobs.clone(); for block in prog.blocks.iter() { errors.append(&mut self.typecheck_block(Rc::clone(block))); } -- cgit v1.2.1 From fddd4555f7162fb64b1fa1b57282de63d0f4d452 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edvard=20Th=C3=B6rnros?= Date: Thu, 28 Jan 2021 21:10:48 +0100 Subject: Access fields --- src/vm.rs | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'src/vm.rs') diff --git a/src/vm.rs b/src/vm.rs index df970db..028f2cd 100644 --- a/src/vm.rs +++ b/src/vm.rs @@ -122,6 +122,7 @@ pub enum Op { Pop, PopUpvalue, Constant(Value), + Get(String), Add, Sub, @@ -415,6 +416,16 @@ impl VM { self.stack.push(value); } + Op::Get(field) => { + let inst = self.stack.pop(); + if let Some(Value::BlobInstance(ty, values)) = inst { + let slot = self.blobs[ty].name_to_field.get(&field).unwrap().0; + self.stack.push(values[slot].clone()); + } else { + error!(self, ErrorKind::RuntimeTypeError(Op::Get(field.clone()), vec![inst.unwrap()])); + } + } + Op::Neg => { match self.stack.pop().unwrap() { Value::Float(a) => self.stack.push(Value::Float(-a)), -- cgit v1.2.1 From 0159d05e183f58ae81d4697e0b178a487f0bde34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gustav=20S=C3=B6rn=C3=A4s?= Date: Thu, 28 Jan 2021 21:53:21 +0100 Subject: assign (ish) to blob fields --- src/vm.rs | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'src/vm.rs') diff --git a/src/vm.rs b/src/vm.rs index 028f2cd..5b0abae 100644 --- a/src/vm.rs +++ b/src/vm.rs @@ -122,7 +122,9 @@ pub enum Op { Pop, PopUpvalue, Constant(Value), + Get(String), + Set(String), Add, Sub, @@ -426,6 +428,17 @@ impl VM { } } + Op::Set(field) => { + let value = self.stack.pop().unwrap(); + let inst = self.stack.pop(); + if let Some(Value::BlobInstance(ty, mut values)) = inst { + let slot = self.blobs[ty].name_to_field.get(&field).unwrap().0; + values[slot] = value; + } else { + error!(self, ErrorKind::RuntimeTypeError(Op::Get(field.clone()), vec![inst.unwrap()])); + } + } + Op::Neg => { match self.stack.pop().unwrap() { Value::Float(a) => self.stack.push(Value::Float(-a)), -- cgit v1.2.1 From 904fd111bcd539190cf6bcf10f60c29813c7012b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gustav=20S=C3=B6rn=C3=A4s?= Date: Thu, 28 Jan 2021 21:56:51 +0100 Subject: assign to blob fields First try babyyyyyyyyy --- src/vm.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'src/vm.rs') diff --git a/src/vm.rs b/src/vm.rs index 5b0abae..4e501ba 100644 --- a/src/vm.rs +++ b/src/vm.rs @@ -22,7 +22,7 @@ macro_rules! error { #[derive(Clone)] pub enum Value { Blob(usize), - BlobInstance(usize, Vec), + BlobInstance(usize, Rc>>), Float(f64), Int(i64), Bool(bool), @@ -422,7 +422,7 @@ impl VM { let inst = self.stack.pop(); if let Some(Value::BlobInstance(ty, values)) = inst { let slot = self.blobs[ty].name_to_field.get(&field).unwrap().0; - self.stack.push(values[slot].clone()); + self.stack.push(values.borrow()[slot].clone()); } else { error!(self, ErrorKind::RuntimeTypeError(Op::Get(field.clone()), vec![inst.unwrap()])); } @@ -431,9 +431,9 @@ impl VM { Op::Set(field) => { let value = self.stack.pop().unwrap(); let inst = self.stack.pop(); - if let Some(Value::BlobInstance(ty, mut values)) = inst { + if let Some(Value::BlobInstance(ty, values)) = inst { let slot = self.blobs[ty].name_to_field.get(&field).unwrap().0; - values[slot] = value; + values.borrow_mut()[slot] = value; } else { error!(self, ErrorKind::RuntimeTypeError(Op::Get(field.clone()), vec![inst.unwrap()])); } @@ -601,7 +601,7 @@ impl VM { } self.stack.pop(); - self.stack.push(Value::BlobInstance(blob_id, values)); + self.stack.push(Value::BlobInstance(blob_id, Rc::new(RefCell::new(values)))); } Value::Function(_, block) => { let inner = block.borrow(); @@ -809,7 +809,7 @@ impl VM { } self.stack.pop(); - self.stack.push(Value::BlobInstance(blob_id, values)); + self.stack.push(Value::BlobInstance(blob_id, Rc::new(RefCell::new(values)))); } Value::Function(_, block) => { let inner = block.borrow(); -- cgit v1.2.1