1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are
6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided
11 // with the distribution.
12 // * Neither the name of Google Inc. nor the names of its
13 // contributors may be used to endorse or promote products derived
14 // from this software without specific prior written permission.
16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 // Flags: --allow-natives-syntax --smi-only-arrays
30 // Test element kind of objects.
31 // Since --smi-only-arrays affects builtins, its default setting at compile time
32 // sticks if built with snapshot. If --smi-only-arrays is deactivated by
33 // default, only a no-snapshot build actually has smi-only arrays enabled in
34 // this test case. Depending on whether smi-only arrays are actually enabled,
35 // this test takes the appropriate code path to check smi-only arrays.
37 support_smi_only_arrays = %HasFastSmiElements([1,2,3,4,5,6,7,8,9,10]);
39 if (support_smi_only_arrays) {
40 print("Tests include smi-only arrays.");
42 print("Tests do NOT include smi-only arrays.");
45 // IC and Crankshaft support for smi-only elements in dynamic array literals.
46 function get(foo) { return foo; } // Used to generate dynamic values.
48 function array_natives_test() {
50 // Ensure small array literals start in specific element kind mode.
51 assertTrue(%HasFastSmiElements([]));
52 assertTrue(%HasFastSmiElements([1]));
53 assertTrue(%HasFastSmiElements([1,2]));
54 assertTrue(%HasFastDoubleElements([1.1]));
55 assertTrue(%HasFastDoubleElements([1.1,2]));
59 if (%HasFastSmiElements(a0)) {
60 assertTrue(%HasFastSmiElements(a0));
62 assertTrue(%HasFastSmiElements(a0));
64 assertTrue(%HasFastDoubleElements(a0));
66 assertTrue(%HasFastDoubleElements(a0));
68 assertTrue(%HasFastObjectElements(a0));
70 assertTrue(%HasFastObjectElements(a0));
72 assertTrue(%HasFastObjectElements(a0));
78 assertTrue(%HasFastObjectElements(a0));
80 assertEquals([1,2,3,4,1.3,1.5,{},{}], a0);
84 a1 = [1,2,3].concat([]);
85 assertTrue(%HasFastSmiElements(a1));
86 assertEquals([1,2,3], a1);
87 a1 = [1,2,3].concat([4,5,6]);
88 assertTrue(%HasFastSmiElements(a1));
89 assertEquals([1,2,3,4,5,6], a1);
90 a1 = [1,2,3].concat([4,5,6], [7,8,9]);
91 assertTrue(%HasFastSmiElements(a1));
92 assertEquals([1,2,3,4,5,6,7,8,9], a1);
93 a1 = [1.1,2,3].concat([]);
94 assertTrue(%HasFastDoubleElements(a1));
95 assertEquals([1.1,2,3], a1);
96 a1 = [1,2,3].concat([1.1, 2]);
97 assertTrue(%HasFastDoubleElements(a1));
98 assertEquals([1,2,3,1.1,2], a1);
99 a1 = [1.1,2,3].concat([1, 2]);
100 assertTrue(%HasFastDoubleElements(a1));
101 assertEquals([1.1,2,3,1,2], a1);
102 a1 = [1.1,2,3].concat([1.2, 2]);
103 assertTrue(%HasFastDoubleElements(a1));
104 assertEquals([1.1,2,3,1.2,2], a1);
106 a1 = [1,2,3].concat([{}]);
107 assertTrue(%HasFastObjectElements(a1));
108 assertEquals([1,2,3,{}], a1);
109 a1 = [1.1,2,3].concat([{}]);
110 assertTrue(%HasFastObjectElements(a1));
111 assertEquals([1.1,2,3,{}], a1);
112 a1 = [{}].concat([1,2,3]);
113 assertTrue(%HasFastObjectElements(a1));
114 assertEquals([{},1,2,3], a1);
115 a1 = [{}].concat([1.1,2,3]);
116 assertTrue(%HasFastObjectElements(a1));
117 assertEquals([{},1.1,2,3], a1);
121 assertTrue(%HasFastSmiElements(a2.slice()));
122 assertTrue(%HasFastSmiElements(a2.slice(1)));
123 assertTrue(%HasFastSmiElements(a2.slice(1, 2)));
124 assertEquals([1,2,3], a2.slice());
125 assertEquals([2,3], a2.slice(1));
126 assertEquals([2], a2.slice(1,2));
128 assertTrue(%HasFastDoubleElements(a2.slice()));
129 assertTrue(%HasFastDoubleElements(a2.slice(1)));
130 assertTrue(%HasFastDoubleElements(a2.slice(1, 2)));
131 assertEquals([1.1,2,3], a2.slice());
132 assertEquals([2,3], a2.slice(1));
133 assertEquals([2], a2.slice(1,2));
135 assertTrue(%HasFastObjectElements(a2.slice()));
136 assertTrue(%HasFastObjectElements(a2.slice(1)));
137 assertTrue(%HasFastObjectElements(a2.slice(1, 2)));
138 assertEquals([{},2,3], a2.slice());
139 assertEquals([2,3], a2.slice(1));
140 assertEquals([2], a2.slice(1,2));
145 a3r = a3.splice(0, 0);
146 assertTrue(%HasFastSmiElements(a3r));
147 assertTrue(%HasFastSmiElements(a3));
148 assertEquals([], a3r);
149 assertEquals([1, 2, 3], a3);
151 a3r = a3.splice(0, 1);
152 assertTrue(%HasFastSmiElements(a3r));
153 assertTrue(%HasFastSmiElements(a3));
154 assertEquals([1], a3r);
155 assertEquals([2, 3], a3);
157 a3r = a3.splice(0, 0, 2);
158 assertTrue(%HasFastSmiElements(a3r));
159 assertTrue(%HasFastSmiElements(a3));
160 assertEquals([], a3r);
161 assertEquals([2, 1, 2, 3], a3);
163 a3r = a3.splice(0, 1, 2);
164 assertTrue(%HasFastSmiElements(a3r));
165 assertTrue(%HasFastSmiElements(a3));
166 assertEquals([1], a3r);
167 assertEquals([2, 2, 3], a3);
170 a3r = a3.splice(0, 0);
171 assertTrue(%HasFastDoubleElements(a3r));
172 assertTrue(%HasFastDoubleElements(a3));
173 assertEquals([], a3r);
174 assertEquals([1.1, 2, 3], a3);
176 a3r = a3.splice(0, 1);
177 assertTrue(%HasFastDoubleElements(a3r));
178 assertTrue(%HasFastDoubleElements(a3));
179 assertEquals([1.1], a3r);
180 assertEquals([2, 3], a3);
182 a3r = a3.splice(0, 0, 2);
183 // Commented out since handled in js, which takes the best fit.
184 // assertTrue(%HasFastDoubleElements(a3r));
185 assertTrue(%HasFastSmiElements(a3r));
186 assertTrue(%HasFastDoubleElements(a3));
187 assertEquals([], a3r);
188 assertEquals([2, 1.1, 2, 3], a3);
190 a3r = a3.splice(0, 1, 2);
191 assertTrue(%HasFastDoubleElements(a3r));
192 assertTrue(%HasFastDoubleElements(a3));
193 assertEquals([1.1], a3r);
194 assertEquals([2, 2, 3], a3);
196 a3r = a3.splice(0, 0, 2.1);
197 // Commented out since handled in js, which takes the best fit.
198 // assertTrue(%HasFastDoubleElements(a3r));
199 assertTrue(%HasFastSmiElements(a3r));
200 assertTrue(%HasFastDoubleElements(a3));
201 assertEquals([], a3r);
202 assertEquals([2.1, 1.1, 2, 3], a3);
204 a3r = a3.splice(0, 1, 2.2);
205 assertTrue(%HasFastDoubleElements(a3r));
206 assertTrue(%HasFastDoubleElements(a3));
207 assertEquals([1.1], a3r);
208 assertEquals([2.2, 2, 3], a3);
210 a3r = a3.splice(0, 0, 2.1);
211 // Commented out since handled in js, which takes the best fit.
212 // assertTrue(%HasFastDoubleElements(a3r));
213 assertTrue(%HasFastSmiElements(a3r));
214 assertTrue(%HasFastDoubleElements(a3));
215 assertEquals([], a3r);
216 assertEquals([2.1, 1, 2, 3], a3);
218 a3r = a3.splice(0, 1, 2.2);
219 assertTrue(%HasFastDoubleElements(a3r));
220 assertTrue(%HasFastDoubleElements(a3));
221 assertEquals([1], a3r);
222 assertEquals([2.2, 2, 3], a3);
225 a3r = a3.splice(0, 0);
226 assertTrue(%HasFastObjectElements(a3r));
227 assertTrue(%HasFastObjectElements(a3));
228 assertEquals([], a3r);
229 assertEquals([{}, 2, 3], a3);
231 a3r = a3.splice(0, 1);
232 assertTrue(%HasFastObjectElements(a3r));
233 assertTrue(%HasFastObjectElements(a3));
234 assertEquals([1], a3r);
235 assertEquals([2, {}], a3);
237 a3r = a3.splice(0, 0, {});
238 assertTrue(%HasFastObjectElements(a3r));
239 assertTrue(%HasFastObjectElements(a3));
240 assertEquals([], a3r);
241 assertEquals([{}, 1, 2, 3], a3);
243 a3r = a3.splice(0, 1, {});
244 assertTrue(%HasFastObjectElements(a3r));
245 assertTrue(%HasFastObjectElements(a3));
246 assertEquals([1], a3r);
247 assertEquals([{}, 2, 3], a3);
250 a3r = a3.splice(0, 0, {});
251 assertTrue(%HasFastObjectElements(a3r));
252 assertTrue(%HasFastObjectElements(a3));
253 assertEquals([], a3r);
254 assertEquals([{}, 1.1, 2, 3], a3);
256 a3r = a3.splice(0, 1, {});
257 assertTrue(%HasFastObjectElements(a3r));
258 assertTrue(%HasFastObjectElements(a3));
259 assertEquals([1.1], a3r);
260 assertEquals([{}, 2, 3], a3);
264 assertEquals(3, a4.pop());
265 assertTrue(%HasFastSmiElements(a4));
267 assertEquals(3, a4.pop());
268 assertTrue(%HasFastDoubleElements(a4));
270 assertEquals(3, a4.pop());
271 assertTrue(%HasFastObjectElements(a4));
275 assertEquals(1, a4.shift());
276 assertTrue(%HasFastSmiElements(a4));
278 assertEquals(1.1, a4.shift());
279 assertTrue(%HasFastDoubleElements(a4));
281 assertEquals({}, a4.shift());
282 assertTrue(%HasFastObjectElements(a4));
287 assertTrue(%HasFastSmiElements(a4));
288 assertEquals([1,1,2,3], a4);
291 // TODO(verwaest): We'll want to support double unshifting as well.
292 // assertTrue(%HasFastDoubleElements(a4));
293 assertTrue(%HasFastObjectElements(a4));
294 assertEquals([1.1,1,2,3], a4);
297 // assertTrue(%HasFastDoubleElements(a4));
298 assertTrue(%HasFastObjectElements(a4));
299 assertEquals([1,1.1,2,3], a4);
302 assertTrue(%HasFastObjectElements(a4));
303 assertEquals([1,{},2,3], a4);
306 assertTrue(%HasFastObjectElements(a4));
307 assertEquals([1.1,{},2,3], a4);
310 if (support_smi_only_arrays) {
311 for (var i = 0; i < 3; i++) {
312 array_natives_test();
314 %OptimizeFunctionOnNextCall(array_natives_test);
315 array_natives_test();