We should be able to inline getter/setter calls inside an inline cache even when...
[WebKit-https.git] / Source / JavaScriptCore / tests / stress / try-catch-stub-routine-replaced.js
1 // The main purpose of this test is to ensure that
2 // we will re-use no longer in use CallSiteIndices for
3 // inline cache stubs. See relevant code in destructor
4 // which calls:
5 // DFG::CommonData::removeCallSiteIndex(.)
6 // CodeBlock::removeExceptionHandlerForCallSite(.)
7 // Which add old call site indices to a free list.
8
9 function assert(b) {
10     if (!b)
11         throw new Error("bad value");
12 }
13 noInline(assert);
14
15 var arr = []
16 function allocate() {
17     for (var i = 0; i < 10000; i++)
18         arr.push({});
19 }
20
21 function hello() { return 20; }
22 noInline(hello);
23
24 function foo(o) {
25     let baz = hello();
26     let v;
27     try {
28         v = o.f;
29         v = o.f;
30         v = o.f;
31     } catch(e) {
32         assert(baz === 20);
33         assert(v === 2); // Really flagCount.
34     }
35     return v;
36 }
37 noInline(foo);
38
39 var objChain = {f: 40};
40 var fakeOut = {x: 30, f: 100};
41 for (let i = 0; i < 1000; i++)
42     foo(i % 2 ? objChain : fakeOut);
43
44 var i;
45 var flag = "flag";
46 var flagCount = 0;
47 objChain = { 
48     get f() {
49         if (flagCount === 2)
50             throw new Error("I'm testing you.");
51         if (i === flag)
52             flagCount++;
53         return flagCount;
54     }
55 };
56 for (i = 0; i < 100; i++) {
57     allocate();
58     if (i === 99)
59         i = flag;
60     foo(objChain);
61 }
62
63 fakeOut = {x: 30, get f() { return 100}};
64 for (i = 0; i < 100; i++) {
65     allocate();
66     if (i === 99)
67         i = flag;
68     foo(fakeOut);
69 }
70
71 var o = { 
72     get f() {
73         return flagCount;
74     },
75     x: 100
76 };
77
78 for (i = 0; i < 100; i++)
79     foo(o);