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