summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Bridle <ben@derelict.engineering>2025-10-15 11:28:29 +1300
committerBen Bridle <ben@derelict.engineering>2025-10-15 11:28:56 +1300
commit928b391e3d6fe343351d15c5fb24c338bac57818 (patch)
tree4e390ed99f7b7d843e1ec5fa9ad6d3dbbd394f08
parentdc6653aadf984af3bdd3ef45124bcee609dc52bc (diff)
downloadtorque-asm-928b391e3d6fe343351d15c5fb24c338bac57818.zip
Add debug operator for expressions
The <dbg> operator will print the value that is currently at the top of the expression stack as an info-level log message, to help with debugging complex expressions.
-rw-r--r--src/types/expression_stack.rs14
-rw-r--r--src/types/operator.rs3
2 files changed, 17 insertions, 0 deletions
diff --git a/src/types/expression_stack.rs b/src/types/expression_stack.rs
index 25710d2..3f80dc8 100644
--- a/src/types/expression_stack.rs
+++ b/src/types/expression_stack.rs
@@ -70,6 +70,7 @@ impl ExpressionStack {
Operator::Length => { pop!(a); push!(op_length(a)) },
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)) },
}
return Ok(());
}
@@ -184,6 +185,19 @@ 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")));
+}
/// Find the number of bits required to hold an integer.
diff --git a/src/types/operator.rs b/src/types/operator.rs
index e360567..8a76e52 100644
--- a/src/types/operator.rs
+++ b/src/types/operator.rs
@@ -21,6 +21,7 @@ pub enum Operator {
Length,
Sum,
Absolute,
+ Debug,
}
impl Operator {
@@ -61,6 +62,7 @@ impl Operator {
"<len>" => Some(Operator::Length),
"<sum>" => Some(Operator::Sum),
"<abs>" => Some(Operator::Absolute),
+ "<dbg>" => Some(Operator::Debug),
_ => None,
}
}
@@ -90,6 +92,7 @@ impl std::fmt::Display for Operator {
Operator::Length => "<len>",
Operator::Sum => "<sum>",
Operator::Absolute => "<abs>",
+ Operator::Debug => "<dbg>",
};
write!(f, "{string}")
}