[JSC] Do not use asArrayModes() with Structures because it discards TypedArray inform...
[WebKit-https.git] / JSTests / stress / ftl-try-catch-tail-call-inilned-caller.js
1 // This test ensures the TailCallInilnedCaller has the correct
2 // stack trace in the FTL inside a try block.
3 // This case arises when you have a situation like this:
4 // foo makes a call to bar, bar is inlined in foo. bar makes a call
5 // to baz and baz is inlined in bar. And then baz makes a tail-call to jaz,
6 // and jaz is inlined in baz. We want the callframe for jaz to appear to 
7 // have caller be bar. 
8
9
10 "use strict";
11 function value() {
12     return "value";
13 }
14 noInline(value);
15
16 function assert(b) {
17     if (!b)
18         throw new Error("bad value");
19 }
20 noInline(assert);
21
22 function validate(stack) {
23     let arr = stack.split("\n");
24     assert(arr[0].indexOf("jaz") !== -1);
25     assert(arr[1].indexOf("bar") !== -1);
26     assert(arr[2].indexOf("foo") !== -1);
27 }
28
29 function foo() {
30     let v = value();
31     try {
32         return bar() + 1;
33     } catch(e) {
34         assert(v === "value");
35         validate(e.stack);
36     }
37 }
38 noInline(foo);
39
40 function bar() {
41     return baz() + 1;
42 }
43
44 function baz() { 
45     return jaz();
46 }
47
48 let flag = false;
49 function jaz() { 
50     if (flag)
51         throw new Error("lol");
52     return 20; 
53 }
54 noInline(jaz);
55
56 for (var i = 0; i < 50000; i++) {
57     foo();
58 }
59 flag = true;
60 foo();