summaryrefslogtreecommitdiff
path: root/src/stages/intermediate.rs
diff options
context:
space:
mode:
authorBen Bridle <ben@derelict.engineering>2025-10-15 13:25:28 +1300
committerBen Bridle <ben@derelict.engineering>2025-10-15 13:25:28 +1300
commita4c2b3ae304dc53e8e52cc952383b5171ce00b99 (patch)
tree9f893524673a4a028c9a744b84a624ca0d79ac89 /src/stages/intermediate.rs
parentc62da877b370392accfbd8a1087ad5673b6f55e4 (diff)
downloadtorque-asm-a4c2b3ae304dc53e8e52cc952383b5171ce00b99.zip
Raise an error if recursion depth exceeds a maximum value
This is preferable to having the assembler crash with a stack overflow error, because the user can now see which invocation caused the overflow.
Diffstat (limited to 'src/stages/intermediate.rs')
-rw-r--r--src/stages/intermediate.rs6
1 files changed, 6 insertions, 0 deletions
diff --git a/src/stages/intermediate.rs b/src/stages/intermediate.rs
index 07773a0..8cabe26 100644
--- a/src/stages/intermediate.rs
+++ b/src/stages/intermediate.rs
@@ -438,6 +438,12 @@ impl IntermediateParser {
unreachable!("Uncaught duplicate macro argument name '{name}'");
};
}
+ // Test the current recursion depth.
+ if self.environment_stack.len() == MAX_RECURSION_DEPTH {
+ let error = IntermediateError::MaxRecursionDepthExceeded;
+ self.errors.push(Tracked::from(error, source.clone()));
+ return None;
+ }
// Invoke the macro once.
let env = Environment { arguments: argument_map, id: next_id!() };
self.environment_stack.push(env);