| // Copyright 2020 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // Flags: --stack-size=100 --no-opt |
| |
| function f( |
| x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, |
| x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, |
| x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, |
| x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, |
| x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, |
| x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, |
| x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, |
| x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, |
| x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, |
| x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, |
| x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, |
| x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, |
| x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, |
| x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, |
| x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, |
| x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x |
| ) { } |
| |
| function runNearStackLimit(f) { |
| let recursing_towards_stack_limit = true; |
| let f_succeeded = false; |
| |
| function t() { |
| try { |
| t(); |
| if (f_succeeded) return; |
| // Keep calling f until it stops throwing stack overflow exceptions. |
| f(); |
| // f didn't throw, so we are done. |
| f_succeeded = true; |
| } catch(e) { |
| if (recursing_towards_stack_limit) { |
| recursing_towards_stack_limit = false; |
| // We reached the near stack limit state, call f first time. |
| f(); |
| // f didn't throw, so we are done. |
| f_succeeded = true; |
| } |
| } |
| }; |
| |
| try { |
| t(); |
| } catch(e) {} |
| } |
| |
| runNearStackLimit(f); |