aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorGustav Sörnäs <gustav@sornas.net>2021-01-29 20:12:43 +0100
committerGustav Sörnäs <gustav@sornas.net>2021-01-29 20:12:43 +0100
commitc16f77289248633fb3229877e33e5e68dd27a826 (patch)
treed4ad34299513bb490add947ac072784c75bae108 /src
parenta9a7970f683ed72b0eaf1703b06363cffeadb842 (diff)
downloadsylt-c16f77289248633fb3229877e33e5e68dd27a826.tar.gz
blobs as parameters. also typecheck
Diffstat (limited to 'src')
-rw-r--r--src/compiler.rs2
-rw-r--r--src/vm.rs24
2 files changed, 25 insertions, 1 deletions
diff --git a/src/compiler.rs b/src/compiler.rs
index be2fe44..83dca4a 100644
--- a/src/compiler.rs
+++ b/src/compiler.rs
@@ -850,7 +850,7 @@ impl Compiler {
"float" => Ok(Type::Float),
"bool" => Ok(Type::Bool),
"str" => Ok(Type::String),
- _ => Err(()),
+ x => self.find_blob(x).map(|blob| Type::BlobInstance(blob)).ok_or(()),
}
}
_ => Err(()),
diff --git a/src/vm.rs b/src/vm.rs
index 4e501ba..2b5b2bf 100644
--- a/src/vm.rs
+++ b/src/vm.rs
@@ -743,6 +743,30 @@ impl VM {
}
}
+ Op::Get(field) => {
+ let inst = self.stack.pop();
+ if let Some(Value::BlobInstance(ty, _)) = inst {
+ let value = self.blobs[ty].name_to_field.get(&field).unwrap().1.as_value();
+ self.stack.push(value);
+ } else {
+ self.stack.push(Value::Nil);
+ error!(self, ErrorKind::RuntimeTypeError(Op::Get(field.clone()), vec![inst.unwrap()]));
+ }
+ }
+
+ Op::Set(field) => {
+ let value = self.stack.pop().unwrap();
+ let inst = self.stack.pop();
+ if let Some(Value::BlobInstance(ty, _)) = inst {
+ let ty = &self.blobs[ty].name_to_field.get(&field).unwrap().1;
+ if ty != &Type::from(&value) {
+ error!(self, ErrorKind::RuntimeTypeError(Op::Set(field.clone()), vec![inst.unwrap()]));
+ }
+ } else {
+ error!(self, ErrorKind::RuntimeTypeError(Op::Set(field.clone()), vec![inst.unwrap()]));
+ }
+ }
+
Op::PopUpvalue => {
self.stack.pop().unwrap();
}