summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBen Bridle <ben@derelict.engineering>2025-10-20 11:53:45 +1300
committerBen Bridle <ben@derelict.engineering>2025-10-20 11:53:45 +1300
commit55be4528d2dc59acbc51fc672d9846b960972658 (patch)
tree05b6e87fba724beb049ebdd643f7b690dac29e29 /src
parent86e80124fbf48d173c59da12eb3689fbcf3d6d43 (diff)
downloadtorque-asm-55be4528d2dc59acbc51fc672d9846b960972658.zip
Allow one-element lists to be used as integers in expressions
If an operator requires an integer value but instead receives a list value that contains a single integer, that integer will be extracted and used instead.
Diffstat (limited to 'src')
-rw-r--r--src/types/expression_stack.rs10
1 files changed, 8 insertions, 2 deletions
diff --git a/src/types/expression_stack.rs b/src/types/expression_stack.rs
index 1036842..fdf6ed8 100644
--- a/src/types/expression_stack.rs
+++ b/src/types/expression_stack.rs
@@ -18,7 +18,10 @@ impl ExpressionStack {
1 => {
match self.stack.pop().unwrap() {
IntermediateValue::Integer(value) => Ok(*value),
- IntermediateValue::List(_) => Err(ExpressionError::InvalidReturnType("a list")),
+ IntermediateValue::List(mut list) => match list.len() {
+ 1 => Ok(list.pop().unwrap().value),
+ _ => Err(ExpressionError::InvalidReturnType("a list")),
+ }
IntermediateValue::Block(_) => Err(ExpressionError::InvalidReturnType("a block")),
}
}
@@ -95,7 +98,10 @@ fn null_span() -> SourceSpan {
fn to_isize(value: IntermediateValue) -> Result<isize, ExpressionError> {
let received = match value {
IntermediateValue::Integer(integer) => return Ok(integer.value),
- IntermediateValue::List(_) => "a list",
+ IntermediateValue::List(mut list) => match list.len() {
+ 1 => return Ok(list.pop().unwrap().value),
+ _ => "a list"
+ }
IntermediateValue::Block(_) => "a block",
};
Err(ExpressionError::InvalidArgumentType("an integer", received))