diff options
| author | Edvard Thörnros <edvard.thornros@gmail.com> | 2021-02-02 20:40:15 +0100 |
|---|---|---|
| committer | Edvard Thörnros <edvard.thornros@gmail.com> | 2021-02-02 20:40:15 +0100 |
| commit | e49df17d1159507e50434d9d3f866a0c41dd59b9 (patch) | |
| tree | 00cab0eaaef0769e184f3a4c8d7d46a3680b8c2c /src | |
| parent | 1aa5daae7c8b18b2ff4128c7bcc49db676e7e293 (diff) | |
| download | sylt-e49df17d1159507e50434d9d3f866a0c41dd59b9.tar.gz | |
as_value -> from
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib.rs | 17 | ||||
| -rw-r--r-- | src/vm.rs | 10 |
2 files changed, 18 insertions, 9 deletions
@@ -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), @@ -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 { |
