diff --git a/dust-lang/src/chunk.rs b/dust-lang/src/chunk.rs index 55d99ed..bb64b64 100644 --- a/dust-lang/src/chunk.rs +++ b/dust-lang/src/chunk.rs @@ -543,9 +543,9 @@ impl<'a> ChunkDisassembler<'a> { .as_ref() .map(|value| value.to_string()) .unwrap_or("empty".to_string()); - let trucated_length = 8; - let with_elipsis = trucated_length - 3; - let constant_display = if value_display.len() > with_elipsis { + let trucated_length = value_display.len().min(self.width - 2); + let with_elipsis = trucated_length.saturating_sub(3); + let constant_display = if with_elipsis > self.width - 2 { format!("{index:<5} {value_display:. Self { - Value::Primitive(Primitive::Function(Function { + Value::Function(Function { chunk: body, r#type: Type::Function(r#type), - })) + }) } pub fn integer>(into_i64: T) -> Self { @@ -372,7 +372,6 @@ pub enum Primitive { Byte(u8), Character(char), Float(f64), - Function(Function), Integer(i64), Range(RangeValue), String(String), @@ -384,7 +383,6 @@ impl Primitive { Primitive::Boolean(_) => Type::Boolean, Primitive::Byte(_) => Type::Byte, Primitive::Character(_) => Type::Character, - Primitive::Function(Function { r#type, .. }) => r#type.clone(), Primitive::Float(_) => Type::Float, Primitive::Integer(_) => Type::Integer, Primitive::Range(range) => range.r#type(), @@ -394,14 +392,6 @@ impl Primitive { } } - pub fn as_function(&self) -> Option<&Function> { - if let Primitive::Function(function) = self { - Some(function) - } else { - None - } - } - pub fn is_rangeable(&self) -> bool { matches!( self, @@ -601,9 +591,6 @@ impl Display for Primitive { Ok(()) } - Primitive::Function(Function { .. }) => { - write!(f, "function") - } Primitive::Integer(integer) => write!(f, "{integer}"), Primitive::Range(range_value) => { write!(f, "{range_value}") @@ -642,8 +629,6 @@ impl Ord for Primitive { } } (Primitive::Float(_), _) => Ordering::Greater, - (Primitive::Function(left), Primitive::Function(right)) => left.cmp(right), - (Primitive::Function(_), _) => Ordering::Greater, (Primitive::Integer(left), Primitive::Integer(right)) => left.cmp(right), (Primitive::Integer(_), _) => Ordering::Greater, (Primitive::Range(left), Primitive::Range(right)) => left.cmp(right), diff --git a/dust-lang/src/vm.rs b/dust-lang/src/vm.rs index 16c3e1e..05ab315 100644 --- a/dust-lang/src/vm.rs +++ b/dust-lang/src/vm.rs @@ -1,8 +1,8 @@ use std::mem::replace; use crate::{ - parse, value::Primitive, AnnotatedError, Chunk, ChunkError, DustError, Identifier, Instruction, - Operation, Span, Value, ValueError, + parse, value::Primitive, AnnotatedError, Chunk, ChunkError, DustError, Function, Identifier, + Instruction, Operation, Span, Value, ValueError, }; pub fn run(source: &str) -> Result, DustError> { @@ -371,7 +371,7 @@ impl Vm { Operation::Call => { let function_index = instruction.a(); let argument_count = instruction.b(); - let function = if let Value::Primitive(Primitive::Function(function)) = + let function = if let Value::Function(function) = self.get(function_index, position)?.clone() { function