aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorEdvard Thörnros <edvard.thornros@gmail.com>2021-02-02 20:40:15 +0100
committerEdvard Thörnros <edvard.thornros@gmail.com>2021-02-02 20:40:15 +0100
commite49df17d1159507e50434d9d3f866a0c41dd59b9 (patch)
tree00cab0eaaef0769e184f3a4c8d7d46a3680b8c2c /src
parent1aa5daae7c8b18b2ff4128c7bcc49db676e7e293 (diff)
downloadsylt-e49df17d1159507e50434d9d3f866a0c41dd59b9.tar.gz
as_value -> from
Diffstat (limited to 'src')
-rw-r--r--src/lib.rs17
-rw-r--r--src/vm.rs10
2 files changed, 18 insertions, 9 deletions
diff --git a/src/lib.rs b/src/lib.rs
index ec3b1c0..bad1a34 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -124,14 +124,16 @@ impl Type {
_ => false,
}
}
+}
- pub fn as_value(&self) -> Value {
- match self {
+impl From<&Type> for Value {
+ fn from(ty: &Type) -> Self {
+ match ty {
Type::Void => Value::Nil,
Type::Blob(i) => Value::Blob(*i),
Type::BlobInstance(i) => Value::BlobInstance(*i, Rc::new(RefCell::new(Vec::new()))),
Type::Tuple(fields) => {
- Value::Tuple(Rc::new(fields.iter().map(|x| x.as_value()).collect()))
+ Value::Tuple(Rc::new(fields.iter().map(Value::from).collect()))
}
Type::UnknownType => Value::Unkown,
Type::Int => Value::Int(1),
@@ -140,11 +142,18 @@ impl Type {
Type::String => Value::String(Rc::new("".to_string())),
Type::Function(_, _) => Value::Function(
Vec::new(),
- Rc::new(RefCell::new(Block::from_type(self)))),
+ Rc::new(RefCell::new(Block::from_type(ty)))),
}
}
}
+impl From<Type> for Value {
+ fn from(ty: Type) -> Self {
+ Value::from(&ty)
+ }
+}
+
+
#[derive(Clone)]
pub enum Value {
Blob(usize),
diff --git a/src/vm.rs b/src/vm.rs
index b6ee10e..474c51d 100644
--- a/src/vm.rs
+++ b/src/vm.rs
@@ -517,7 +517,7 @@ impl VM {
Op::Get(field) => {
let inst = self.pop();
if let Value::BlobInstance(ty, _) = inst {
- let value = self.blobs[ty].name_to_field.get(&field).unwrap().1.as_value();
+ let value = Value::from(&self.blobs[ty].name_to_field.get(&field).unwrap().1);
self.push(value);
} else {
self.push(Value::Nil);
@@ -544,7 +544,7 @@ impl VM {
}
Op::ReadUpvalue(slot) => {
- let value = self.frame().block.borrow().ups[slot].2.as_value();
+ let value = Value::from(&self.frame().block.borrow().ups[slot].2);
self.push(value);
}
@@ -601,7 +601,7 @@ impl VM {
}
for (slot, ty) in blob.name_to_field.values() {
- values[*slot] = ty.as_value();
+ values[*slot] = ty.into();
}
self.pop();
@@ -626,7 +626,7 @@ impl VM {
args, stack_args));
}
- self.stack[new_base] = block.borrow().ret().as_value();
+ self.stack[new_base] = block.borrow().ret().into();
self.stack.truncate(new_base + 1);
}
@@ -672,7 +672,7 @@ impl VM {
self.push(Value::Function(Vec::new(), Rc::clone(&block)));
for arg in block.borrow().args() {
- self.push(arg.as_value());
+ self.push(arg.into());
}
self.frames.push(Frame {