Ensure stack before parsing dot-or-call

There are many cases where, due to codegen or a massively unruly codebase,
a deeply nested call(call(call(call(call(call(call(call(call(f())))))))))
can happen. This is a spot where it would be good to grow our stack, so that
we can survive to tell the programmer their code is dubiously written.
This commit is contained in:
Jubilee Young 2024-03-18 18:35:49 -07:00
parent 3c85e56249
commit cdeb170fc2
2 changed files with 4911 additions and 1 deletions

View file

@ -943,7 +943,10 @@ pub(super) fn parse_expr_dot_or_call_with(
// Stitch the list of outer attributes onto the return value.
// A little bit ugly, but the best way given the current code
// structure
let res = self.parse_expr_dot_or_call_with_(e0, lo);
let res = ensure_sufficient_stack(
// this expr demonstrates the recursion it guards against
|| self.parse_expr_dot_or_call_with_(e0, lo),
);
if attrs.is_empty() {
res
} else {

File diff suppressed because one or more lines are too long