blob: ff96e041b101e12a04b2c55a13ca66938dff3a74 [file] [log] [blame]
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001// 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();