aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/compiler.rs2
-rw-r--r--src/vm.rs12
2 files changed, 7 insertions, 7 deletions
diff --git a/src/compiler.rs b/src/compiler.rs
index 431a762..78b2671 100644
--- a/src/compiler.rs
+++ b/src/compiler.rs
@@ -113,7 +113,7 @@ impl Type {
match self {
Type::Void => Value::Nil,
Type::Blob(i) => Value::Blob(*i),
- Type::BlobInstance(i) => Value::BlobInstance(*i, Vec::new()),
+ Type::BlobInstance(i) => Value::BlobInstance(*i, Rc::new(RefCell::new(Vec::new()))),
Type::UnknownType => Value::Unkown,
Type::Int => Value::Int(1),
Type::Float => Value::Float(1.0),
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<Value>),
+ BlobInstance(usize, Rc<RefCell<Vec<Value>>>),
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();