Wed, 31 Dec 2014 06:09:35 +0100
Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.
1 var o;
2 var f1;
3 var counter = 0;
5 function f2(a) {
6 bailout();
7 return f2.arguments;
8 };
10 var restartCode = "counter = 0; " + f2.toSource();
12 // We need to reevaluate this function everytime, otherwise it is flagged as
13 // having an argument object and it would not be re-entered.
15 // This test case is checking that f.arguments reflects the overflow or the
16 // underflow of arguments after a bailout. Due to the way bailouts are
17 // recovered we need to check for the intial frame and for any other JS frame
18 // below.
19 //
20 // To produce a JSFrame, we need to avoid the 'Hot' counters of f1 to be the
21 // same as f2, because IonMonkey will try to inline f2 in f1, and not
22 // compiling/calling f2 separately. This explain why we ignore the 5 first call
23 // of f1 by returning immediately.
24 //
25 // Bailouts are caused by calling an object function, which is expected to be a
26 // function by IonMonkey. So bailout() cause a bailout in the currently
27 // compiled function.
28 //
29 // To avoid any preventive effect to re-enter f2, we re-evaluate it before every
30 // test.
32 // Check bailouts of the initial frame.
34 eval(restartCode);
35 while (counter++ < 50) {
36 o = f2();
37 assertEq(o.length, 0);
38 }
40 eval(restartCode);
41 while (counter++ < 50) {
42 o = f2(21);
43 assertEq(o.length, 1);
44 assertEq(o[0], 21);
45 }
47 eval(restartCode);
48 while (counter++ < 50) {
49 o = f2(21,42);
50 assertEq(o.length, 2);
51 assertEq(o[0], 21);
52 assertEq(o[1], 42);
53 }
55 // 100 arguments.
56 eval(restartCode);
57 while (counter++ < 50) {
58 o = f2(0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,
59 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,
60 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,
61 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,
62 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9);
63 assertEq(o.length, 100);
64 for (var i in o)
65 assertEq(o[i], i % 10);
66 }
68 // 200 arguments.
69 eval(restartCode);
70 while (counter++ < 50) {
71 o = f2(0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,
72 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,
73 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,
74 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,
75 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,
77 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,
78 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,
79 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,
80 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,
81 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9);
82 assertEq(o.length, 200);
83 for (var i in o)
84 assertEq(o[i], i % 10);
85 }
87 // 300 arguments.
88 eval(restartCode);
89 while (counter++ < 50) {
90 o = f2(0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,
91 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,
92 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,
93 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,
94 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,
96 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,
97 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,
98 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,
99 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,
100 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,
102 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,
103 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,
104 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,
105 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,
106 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9);
107 assertEq(o.length, 300);
108 for (var i in o)
109 assertEq(o[i], i % 10);
110 }
112 // Check bailouts of one frame which is not the initial frame.
114 eval(restartCode);
115 f1 = function() {
116 if (counter < 5) return 0;
117 return f2();
118 };
119 while (counter++ < 50) {
120 o = f1();
121 if (counter < 5) continue;
122 assertEq(o.length, 0);
123 }
125 eval(restartCode);
126 f1 = function() {
127 if (counter < 5) return 0;
128 return f2(21);
129 };
130 while (counter++ < 50) {
131 o = f1();
132 if (counter < 5) continue;
133 assertEq(o.length, 1);
134 assertEq(o[0], 21);
135 }
137 eval(restartCode);
138 f1 = function() {
139 if (counter < 5) return 0;
140 return f2(21,42);
141 };
142 while (counter++ < 50) {
143 o = f1();
144 if (counter < 5) continue;
145 assertEq(o.length, 2);
146 assertEq(o[0], 21);
147 assertEq(o[1], 42);
148 }
150 // 100 arguments.
151 eval(restartCode);
152 f1 = function() {
153 if (counter < 5) return 0;
154 return f2(0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,
155 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,
156 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,
157 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,
158 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9);
159 };
160 while (counter++ < 50) {
161 o = f1();
162 if (counter < 5) continue;
163 assertEq(o.length, 100);
164 for (var i in o)
165 assertEq(o[i], i % 10);
166 }
168 // 200 arguments.
169 eval(restartCode);
170 f1 = function() {
171 if (counter < 5) return 0;
172 return f2(0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,
173 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,
174 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,
175 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,
176 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,
178 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,
179 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,
180 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,
181 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,
182 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9);
183 };
184 while (counter++ < 50) {
185 o = f1();
186 if (counter < 5) continue;
187 assertEq(o.length, 200);
188 for (var i in o)
189 assertEq(o[i], i % 10);
190 }
192 // 300 arguments.
193 eval(restartCode);
194 f1 = function() {
195 if (counter < 5) return 0;
196 return f2(0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,
197 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,
198 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,
199 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,
200 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,
202 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,
203 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,
204 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,
205 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,
206 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,
208 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,
209 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,
210 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,
211 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,
212 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9);
213 };
214 while (counter++ < 500) {
215 o = f1();
216 if (counter < 5) continue;
217 assertEq(o.length, 300);
218 for (var i in o)
219 assertEq(o[i], i % 10);
220 }