aboutsummaryrefslogtreecommitdiffstats
path: root/src/vm.rs
diff options
context:
space:
mode:
authorGustav Sörnäs <gustav@sornas.net>2021-01-28 21:53:21 +0100
committerGustav Sörnäs <gustav@sornas.net>2021-01-28 21:53:21 +0100
commit0159d05e183f58ae81d4697e0b178a487f0bde34 (patch)
tree838d4ffd6a3da11f3333e1371452dc7ed54f3bf0 /src/vm.rs
parentfddd4555f7162fb64b1fa1b57282de63d0f4d452 (diff)
downloadsylt-0159d05e183f58ae81d4697e0b178a487f0bde34.tar.gz
assign (ish) to blob fields
Diffstat (limited to 'src/vm.rs')
-rw-r--r--src/vm.rs13
1 files changed, 13 insertions, 0 deletions
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)),