1// Copyright 2015 the V8 project authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5// Crankshaft changes the stack usage and messes up the binary search for the 6// stack depth that causes a stack overflow. The issue only arises without 7// regexp optimization, which can happen on pages that create a lot of regexps. 8// Flags: --nocrankshaft --noregexp-optimization 9 10// Should not crash with a stack overflow in the regexp compiler, even when the 11// JS has used most of the stack. 12function use_space_then_do_test(depth) { 13 try { 14 // The "+ depth" is to avoid the regexp compilation cache. 15 var regexp_src = repeat(".(.)", 12) + depth; 16 use_space(depth, regexp_src); 17 return true; 18 } catch (e) { 19 assertFalse(("" + e).indexOf("tack") == -1); // Check for [Ss]tack. 20 return false; 21 } 22} 23 24function use_space(n, regexp_src) { 25 if (--n == 0) { 26 do_test(regexp_src); 27 return; 28 } 29 use_space(n, regexp_src); 30} 31 32function repeat(str, n) { 33 var answer = ""; 34 while (n-- != 0) { 35 answer += str; 36 } 37 return answer; 38} 39 40var subject = repeat("y", 200); 41 42function do_test(regexp_src) { 43 var re = new RegExp(regexp_src); 44 re.test(subject); 45} 46 47function try_different_stack_limits() { 48 var lower = 100; 49 var higher = 100000; 50 while (lower < higher - 1) { 51 var average = Math.floor((lower + higher) / 2); 52 if (use_space_then_do_test(average)) { 53 lower = average; 54 } else { 55 higher = average; 56 } 57 } 58 for (var i = lower - 5; i < higher + 5; i++) { 59 use_space_then_do_test(i); 60 } 61} 62 63try_different_stack_limits(); 64