KevinScript
KevinScript copied to clipboard
Deeply nested programs crash with a stack overflow while evaluating
Consider the following program:
if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){if (True){
print("OK.");
}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
This should print "OK", but instead it crashes with a RecursionError.
This occurs because evaluate
is naively recursive - in the worst case, it uses as much stack space as the maximum height of the abstract syntax tree.