Unreviewed, teach run-javascriptcore-tests that this is a slow test.
[WebKit-https.git] / LayoutTests / js / script-tests / regress-139548.js
1 //@ slow!
2
3 description("Regression test for https://webkit.org/b/139548. This test should not crash.");
4
5 var maxArgCount = 8;
6 var argIncrement = 1;
7
8 function ToStringObj()
9 {
10     s: ""
11 }
12
13 // Want a function that a native C++ function can call.
14 ToStringObj.prototype.toString = function() { this.s = new String(""); return this.s; };
15
16 var myObj = new ToStringObj();
17
18 function makeArgsArray(firstArg, argCount)
19 {
20     var args = [firstArg];
21     for (var argIndex = 1; argIndex < argCount; argIndex++)
22         args.push(argIndex);
23
24     return args;
25 }
26
27 function recurseNoDFG(depth)
28 {
29     var s = "";
30     if (depth <= 0)
31         return 0;
32
33     for (var i = 1; i < maxArgCount; i += argIncrement) {
34         try {
35             s = myObj.toLocaleString();
36             return recurseNoDFG.apply(this, makeArgsArray(depth - 1, i));
37         } catch (e) {
38             if (e instanceof String)
39                 throw e;
40
41             for (var j = 1; j < maxArgCount; j += argIncrement) {
42                 try {
43                     s = myObj.toLocaleString();
44                     recurseNoDFG.apply(this, makeArgsArray(depth - 1, j)) + 1;
45                 } catch (e1) {
46                 }
47             }
48
49             throw "Got an exception";
50         }
51     }
52     return s.length;
53 }
54
55 function recurse(depth)
56 {
57     var s = "";
58
59     if (depth <= 0)
60         return 0;
61
62     for (var i = 1; i < maxArgCount; i += argIncrement) {
63         s = myObj.toLocaleString();
64         return recurse.apply(this, makeArgsArray(depth - 1, i));
65     }
66
67     return s.length;
68 }
69
70 function probeAndRecurse(depth)
71 {
72     var result;
73
74     // Probe stack depth
75     try {
76         result = probeAndRecurse(depth);
77         if (result == 0)
78             depth = 50;
79         else if (result < 0)
80             return result + 1;
81         else
82             return result;
83     } catch (e) {
84         // Go up a several frames and then call recursive functions that consume
85         // variable stack amounts in an effort to exercise various stack checks.
86         return -6;
87     }
88
89     for (var i = 1; i < maxArgCount; i += argIncrement) {
90         try {
91             recurseNoDFG.apply(this, makeArgsArray(depth, i));
92         } catch (e) {
93         }
94     }
95
96     for (var i = 1; i < maxArgCount; i += argIncrement) {
97         try {
98             recurse.apply(this, makeArgsArray(depth, i));
99         } catch (e) {
100         }
101     }
102
103     return 1;
104 }
105
106 // Warm up recurse functions
107 for (var loopCount = 0; loopCount < 5000; loopCount++)
108     recurse(10);
109
110 probeAndRecurse(0);