summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/types/expression_stack.rs32
1 files changed, 19 insertions, 13 deletions
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<IntermediateValue, ExpressionError> {
}
fn op_absolute(l: IntermediateValue) -> Result<IntermediateValue, ExpressionError> {
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<String> = 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<IntermediateValue>, 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<String> = 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));
}