Message164839
This is a fix for issue #5765: stack overflow evaluating eval("()" * 30000)
The solution was to add two fields (recursion_depth and
recursion_limit) to the symbol table object and just increment and
check the depth in symtable_visit_expr raising a RuntimeError in case
the limit is exceeded.
The test case added also covers other similar cases (a.b.b.b.b.b...
and a[0][0][0][0]....)
There is no depth check in when visiting statement because I cannot
think to a way to nesting statements too much without getting other
errors before. If there is a way to do it, it would be trivial to also
cover that part.
The patch uses the current depth and current recursion limit but
multiplies them for a factor because I suppose that the amount of C
stack used by the compiler per recursion is smaller than the amount
used by the interpreter; the constant in the patch is 4. Using a
constant of 1 (i.e. just using the normal recursion limit) doesn't
allow a previously existing test about big expressions to pass. |
|
Date |
User |
Action |
Args |
2012-07-07 13:22:05 | ag6502 | set | recipients:
+ ag6502 |
2012-07-07 13:22:04 | ag6502 | link | issue15274 messages |
2012-07-07 13:22:04 | ag6502 | create | |
|