// Copyright 2015 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. // Crankshaft changes the stack usage and messes up the binary search for the // stack depth that causes a stack overflow. The issue only arises without // regexp optimization, which can happen on pages that create a lot of regexps. // Flags: --nocrankshaft --noregexp-optimization // Should not crash with a stack overflow in the regexp compiler, even when the // JS has used most of the stack. function use_space_then_do_test(depth) { try { // The "+ depth" is to avoid the regexp compilation cache. var regexp_src = repeat(".(.)", 12) + depth; use_space(depth, regexp_src); return true; } catch (e) { assertFalse(("" + e).indexOf("tack") == -1); // Check for [Ss]tack. return false; } } function use_space(n, regexp_src) { if (--n == 0) { do_test(regexp_src); return; } use_space(n, regexp_src); } function repeat(str, n) { var answer = ""; while (n-- != 0) { answer += str; } return answer; } var subject = repeat("y", 200); function do_test(regexp_src) { var re = new RegExp(regexp_src); re.test(subject); } function try_different_stack_limits() { var lower = 100; var higher = 100000; while (lower < higher - 1) { var average = Math.floor((lower + higher) / 2); if (use_space_then_do_test(average)) { lower = average; } else { higher = average; } } for (var i = lower - 5; i < higher + 5; i++) { use_space_then_do_test(i); } } try_different_stack_limits();