JSC should have InstanceOf inline caching
[WebKit-https.git] / JSTests / stress / instanceof-dynamic-proxy-loop.js
1 class Foo0 { }
2 class Foo1 { }
3 class Foo2 { }
4 class Foo3 { }
5 class Foo4 { }
6 class Foo5 { }
7 class Foo6 { }
8 class Foo7 { }
9 class Foo8 { }
10 class Foo9 { }
11 class Foo10 { }
12 class Foo11 { }
13 class Foo12 { }
14 class Foo13 { }
15 class Foo14 { }
16 class Foo15 { }
17 class Foo16 { }
18 class Foo17 { }
19 class Foo18 { }
20 class Foo19 { }
21 class Foo20 { }
22 class Foo21 { }
23 class Foo22 { }
24 class Foo23 { }
25 class Foo24 { }
26 class Foo25 { }
27 class Foo26 { }
28 class Foo27 { }
29 class Foo28 { }
30 class Foo29 { }
31 class Foo30 { }
32 class Foo31 { }
33 class Foo32 { }
34 class Foo33 { }
35 class Foo34 { }
36 class Foo35 { }
37 class Foo36 { }
38 class Foo37 { }
39 class Foo38 { }
40 class Foo39 { }
41 class Foo40 { }
42 class Foo41 { }
43 class Foo42 { }
44 class Foo43 { }
45 class Foo44 { }
46 class Foo45 { }
47 class Foo46 { }
48 class Foo47 { }
49 class Foo48 { }
50 class Foo49 { }
51 class Foo50 { }
52 class Foo51 { }
53 class Foo52 { }
54 class Foo53 { }
55 class Foo54 { }
56 class Foo55 { }
57 class Foo56 { }
58 class Foo57 { }
59 class Foo58 { }
60 class Foo59 { }
61 class Foo60 { }
62 class Foo61 { }
63 class Foo62 { }
64 class Foo63 { }
65 class Foo64 { }
66 class Foo65 { }
67 class Foo66 { }
68 class Foo67 { }
69 class Foo68 { }
70 class Foo69 { }
71 class Foo70 { }
72 class Foo71 { }
73 class Foo72 { }
74 class Foo73 { }
75 class Foo74 { }
76 class Foo75 { }
77 class Foo76 { }
78 class Foo77 { }
79 class Foo78 { }
80 class Foo79 { }
81 class Foo80 { }
82 class Foo81 { }
83 class Foo82 { }
84 class Foo83 { }
85 class Foo84 { }
86 class Foo85 { }
87 class Foo86 { }
88 class Foo87 { }
89 class Foo88 { }
90 class Foo89 { }
91 class Foo90 { }
92 class Foo91 { }
93 class Foo92 { }
94 class Foo93 { }
95 class Foo94 { }
96 class Foo95 { }
97 class Foo96 { }
98 class Foo97 { }
99 class Foo98 { }
100 class Foo99 { }
101
102 var foos = [new Foo0(), new Foo1(), new Foo2(), new Foo3(), new Foo4(), new Foo5(), new Foo6(), new Foo7(), new Foo8(), new Foo9(), new Foo10(), new Foo11(), new Foo12(), new Foo13(), new Foo14(), new Foo15(), new Foo16(), new Foo17(), new Foo18(), new Foo19(), new Foo20(), new Foo21(), new Foo22(), new Foo23(), new Foo24(), new Foo25(), new Foo26(), new Foo27(), new Foo28(), new Foo29(), new Foo30(), new Foo31(), new Foo32(), new Foo33(), new Foo34(), new Foo35(), new Foo36(), new Foo37(), new Foo38(), new Foo39(), new Foo40(), new Foo41(), new Foo42(), new Foo43(), new Foo44(), new Foo45(), new Foo46(), new Foo47(), new Foo48(), new Foo49(), new Foo50(), new Foo51(), new Foo52(), new Foo53(), new Foo54(), new Foo55(), new Foo56(), new Foo57(), new Foo58(), new Foo59(), new Foo60(), new Foo61(), new Foo62(), new Foo63(), new Foo64(), new Foo65(), new Foo66(), new Foo67(), new Foo68(), new Foo69(), new Foo70(), new Foo71(), new Foo72(), new Foo73(), new Foo74(), new Foo75(), new Foo76(), new Foo77(), new Foo78(), new Foo79(), new Foo80(), new Foo81(), new Foo82(), new Foo83(), new Foo84(), new Foo85(), new Foo86(), new Foo87(), new Foo88(), new Foo89(), new Foo90(), new Foo91(), new Foo92(), new Foo93(), new Foo94(), new Foo95(), new Foo96(), new Foo97(), new Foo98(), new Foo99()];
103
104 class Foo { }
105
106 function Bar() { }
107
108 var numberOfGetPrototypeOfCalls = 0;
109
110 var doBadThings = function() { };
111
112 Bar.prototype = new Proxy(
113     {},
114     {
115         getPrototypeOf()
116         {
117             numberOfGetPrototypeOfCalls++;
118             doBadThings();
119             return Foo.prototype;
120         }
121     });
122
123 // Break some watchpoints.
124 var o = {f:42};
125 o.g = 43;
126
127 function foo(o, p)
128 {
129     var result = o.f;
130     for (var i = 0; i < 5; ++i)
131         var _ = p instanceof Foo;
132     return result + o.f;
133 }
134
135 noInline(foo);
136
137 for (var i = 0; i < 10000; ++i) {
138     var result = foo({f:42}, foos[i % foos.length]);
139     if (result != 84)
140         throw "Error: bad result in loop: " + result;
141 }
142
143 var globalO = {f:42};
144 var didCallGetter = false;
145 doBadThings = function() {
146     delete globalO.f;
147     globalO.__defineGetter__("f", function() {
148         didCallGetter = true;
149         return 43;
150     });
151 };
152
153 var result = foo(globalO, new Bar());
154 if (result != 85)
155     throw "Error: bad result at end: " + result;
156 if (!didCallGetter)
157     throw "Error: did not call getter";
158 if (numberOfGetPrototypeOfCalls != 5)
159     throw "Error: did not call getPrototypeOf() the right number of times at end";