From 2a710ac31d8ac2a3906130335679208226ee12d0 Mon Sep 17 00:00:00 2001 From: Ben Bridle Date: Wed, 15 Oct 2025 14:14:09 +1300 Subject: Make debug operator print the full expression stack The operator previously only showed the value on the top of the stack, but now it will list every value. --- src/types/expression_stack.rs | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) (limited to 'src') diff --git a/src/types/expression_stack.rs b/src/types/expression_stack.rs index e60dad7..1036842 100644 --- a/src/types/expression_stack.rs +++ b/src/types/expression_stack.rs @@ -72,7 +72,7 @@ impl ExpressionStack { Operator::Find => { pop!(b); pop!(a); push!(op_find(a, b)) }, Operator::Sum => { pop!(a); push!(op_sum(a)) }, Operator::Absolute => { pop!(a); push!(op_absolute(a)) }, - Operator::Debug => { pop!(a); op_debug(&a, &source); push!(Ok(a)) }, + Operator::Debug => { op_debug(&self.stack, &source); }, } return Ok(()); } @@ -210,18 +210,24 @@ fn op_sum(l: IntermediateValue) -> Result { } fn op_absolute(l: IntermediateValue) -> Result { Ok(from_isize(to_isize(l)?.wrapping_abs())) } -fn op_debug(l: &IntermediateValue, source: &SourceSpan) { - let (type_name, value) = match l { - IntermediateValue::Integer(integer) => - ("integer", integer.to_string()), - IntermediateValue::List(list) => { - let strings: Vec = list.iter().map(|t| t.value.to_string()).collect(); - ("list", format!("[{}]", strings.join(" "))) - } - IntermediateValue::Block(_) => unreachable!("Block value in expression"), - }; - let message = format!("Printing {type_name} value in expression at {}", source.location()); - log_info(&message, Some(format!(" --> {value}\n"))); +fn op_debug(stack: &Vec, source: &SourceSpan) { + let mut output = String::new(); + for value in stack.iter().rev() { + let string = match value { + IntermediateValue::Integer(integer) => + integer.to_string(), + IntermediateValue::List(list) => { + let strings: Vec = list.iter().map(|t| t.value.to_string()).collect(); + format!("[{}]", strings.join(" ")) + } + IntermediateValue::Block(_) => unreachable!("Block value in expression"), + }; + output.push_str(&format!(" --> {string}\n")); + } + let len = stack.len(); + let element = if len == 1 { "element" } else { "elements" }; + let message = format!("Printing expression stack with {len} {element} at {}", source.location()); + log_info(&message, Some(output)); } -- cgit v1.2.3-70-g09d2