From e49df17d1159507e50434d9d3f866a0c41dd59b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edvard=20Th=C3=B6rnros?= Date: Tue, 2 Feb 2021 20:40:15 +0100 Subject: as_value -> from --- src/lib.rs | 17 +++++++++++++---- src/vm.rs | 10 +++++----- 2 files changed, 18 insertions(+), 9 deletions(-) (limited to 'src') 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 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 { -- cgit v1.2.1