diff options
author | Ben Bridle <ben@derelict.engineering> | 2025-10-20 11:53:45 +1300 |
---|---|---|
committer | Ben Bridle <ben@derelict.engineering> | 2025-10-20 11:53:45 +1300 |
commit | 55be4528d2dc59acbc51fc672d9846b960972658 (patch) | |
tree | 05b6e87fba724beb049ebdd643f7b690dac29e29 | |
parent | 86e80124fbf48d173c59da12eb3689fbcf3d6d43 (diff) | |
download | torque-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.
-rw-r--r-- | src/types/expression_stack.rs | 10 |
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)) |