blob: 9898faac231cd56e2ecbc5865364e98fb7881fa7 [file] [log] [blame]
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001// 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
4// met:
5//
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.
15//
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.
27
28// Flags: --allow-natives-syntax
29
30// IC and Crankshaft support for smi-only elements in dynamic array literals.
31function get(foo) { return foo; } // Used to generate dynamic values.
32
Ben Murdochda12d292016-06-02 14:46:10 +010033// This code exists to eliminate the learning influence of AllocationSites
34// on the following tests.
35function make_array_string(literal) {
36 this.__sequence = this.__sequence + 1;
37 return "/* " + this.__sequence + " */ " + literal;
38}
39function make_array(literal) {
40 return eval(make_array_string(literal));
41}
42
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000043var __sequence = 0;
Ben Murdochb8a8cc12014-11-26 15:28:44 +000044function array_natives_test() {
45
46 // Ensure small array literals start in specific element kind mode.
47 assertTrue(%HasFastSmiElements([]));
48 assertTrue(%HasFastSmiElements([1]));
49 assertTrue(%HasFastSmiElements([1,2]));
50 assertTrue(%HasFastDoubleElements([1.1]));
51 assertTrue(%HasFastDoubleElements([1.1,2]));
52
Ben Murdochb8a8cc12014-11-26 15:28:44 +000053 // Push
54 var a0 = make_array("[1, 2, 3]");
55 assertTrue(%HasFastSmiElements(a0));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000056 assertEquals(4, a0.push(4));
Ben Murdochb8a8cc12014-11-26 15:28:44 +000057 assertTrue(%HasFastSmiElements(a0));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000058 assertEquals(5, a0.push(1.3));
Ben Murdochb8a8cc12014-11-26 15:28:44 +000059 assertTrue(%HasFastDoubleElements(a0));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000060 assertEquals(6, a0.push(1.5));
Ben Murdochb8a8cc12014-11-26 15:28:44 +000061 assertTrue(%HasFastDoubleElements(a0));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000062 assertEquals(7, a0.push({}));
Ben Murdochb8a8cc12014-11-26 15:28:44 +000063 assertTrue(%HasFastObjectElements(a0));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000064 assertEquals(8, a0.push({}));
Ben Murdochb8a8cc12014-11-26 15:28:44 +000065 assertTrue(%HasFastObjectElements(a0));
66 assertEquals([1,2,3,4,1.3,1.5,{},{}], a0);
67
68 // Concat
69 var a1;
70 a1 = [1,2,3].concat([]);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000071 //assertTrue(%HasFastSmiElements(a1));
Ben Murdochb8a8cc12014-11-26 15:28:44 +000072 assertEquals([1,2,3], a1);
73 a1 = [1,2,3].concat([4,5,6]);
74 assertTrue(%HasFastSmiElements(a1));
75 assertEquals([1,2,3,4,5,6], a1);
76 a1 = [1,2,3].concat([4,5,6], [7,8,9]);
77 assertTrue(%HasFastSmiElements(a1));
78 assertEquals([1,2,3,4,5,6,7,8,9], a1);
79 a1 = [1.1,2,3].concat([]);
80 assertTrue(%HasFastDoubleElements(a1));
81 assertEquals([1.1,2,3], a1);
82 a1 = [1,2,3].concat([1.1, 2]);
83 assertTrue(%HasFastDoubleElements(a1));
84 assertEquals([1,2,3,1.1,2], a1);
85 a1 = [1.1,2,3].concat([1, 2]);
86 assertTrue(%HasFastDoubleElements(a1));
87 assertEquals([1.1,2,3,1,2], a1);
88 a1 = [1.1,2,3].concat([1.2, 2]);
89 assertTrue(%HasFastDoubleElements(a1));
90 assertEquals([1.1,2,3,1.2,2], a1);
91
92 a1 = [1,2,3].concat([{}]);
93 assertTrue(%HasFastObjectElements(a1));
94 assertEquals([1,2,3,{}], a1);
95 a1 = [1.1,2,3].concat([{}]);
96 assertTrue(%HasFastObjectElements(a1));
97 assertEquals([1.1,2,3,{}], a1);
98 a1 = [{}].concat([1,2,3]);
99 assertTrue(%HasFastObjectElements(a1));
100 assertEquals([{},1,2,3], a1);
101 a1 = [{}].concat([1.1,2,3]);
102 assertTrue(%HasFastObjectElements(a1));
103 assertEquals([{},1.1,2,3], a1);
104
105 // Slice
106 var a2 = [1,2,3];
107 assertTrue(%HasFastSmiElements(a2.slice()));
108 assertTrue(%HasFastSmiElements(a2.slice(1)));
109 assertTrue(%HasFastSmiElements(a2.slice(1, 2)));
110 assertEquals([1,2,3], a2.slice());
111 assertEquals([2,3], a2.slice(1));
112 assertEquals([2], a2.slice(1,2));
113 a2 = [1.1,2,3];
114 assertTrue(%HasFastDoubleElements(a2.slice()));
115 assertTrue(%HasFastDoubleElements(a2.slice(1)));
116 assertTrue(%HasFastDoubleElements(a2.slice(1, 2)));
117 assertEquals([1.1,2,3], a2.slice());
118 assertEquals([2,3], a2.slice(1));
119 assertEquals([2], a2.slice(1,2));
120 a2 = [{},2,3];
121 assertTrue(%HasFastObjectElements(a2.slice()));
122 assertTrue(%HasFastObjectElements(a2.slice(1)));
123 assertTrue(%HasFastObjectElements(a2.slice(1, 2)));
124 assertEquals([{},2,3], a2.slice());
125 assertEquals([2,3], a2.slice(1));
126 assertEquals([2], a2.slice(1,2));
127
128 // Splice
129 var a3 = [1,2,3];
130 var a3r;
131 a3r = a3.splice(0, 0);
132 assertTrue(%HasFastSmiElements(a3r));
133 assertTrue(%HasFastSmiElements(a3));
134 assertEquals([], a3r);
135 assertEquals([1, 2, 3], a3);
136 a3 = [1,2,3];
137 a3r = a3.splice(0, 1);
138 assertTrue(%HasFastSmiElements(a3r));
139 assertTrue(%HasFastSmiElements(a3));
140 assertEquals([1], a3r);
141 assertEquals([2, 3], a3);
142 a3 = [1,2,3];
143 a3r = a3.splice(0, 0, 2);
144 assertTrue(%HasFastSmiElements(a3r));
145 assertTrue(%HasFastSmiElements(a3));
146 assertEquals([], a3r);
147 assertEquals([2, 1, 2, 3], a3);
148 a3 = [1,2,3];
149 a3r = a3.splice(0, 1, 2);
150 assertTrue(%HasFastSmiElements(a3r));
151 assertTrue(%HasFastSmiElements(a3));
152 assertEquals([1], a3r);
153 assertEquals([2, 2, 3], a3);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000154 a3 = [1.1,2,3];
155 a3r = a3.splice(0, 0);
156 assertTrue(%HasFastDoubleElements(a3r));
157 assertTrue(%HasFastDoubleElements(a3));
158 assertEquals([], a3r);
159 assertEquals([1.1, 2, 3], a3);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000160 a3 = [1.1, 2, 3];
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000161 a3r = a3.splice(0, 1);
162 assertTrue(%HasFastDoubleElements(a3r));
163 assertTrue(%HasFastDoubleElements(a3));
164 assertEquals([1.1], a3r);
165 assertEquals([2, 3], a3);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000166 a3 = [1.1, 2, 3];
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000167 a3r = a3.splice(0, 0, 2);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000168 assertTrue(%HasFastDoubleElements(a3r));
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000169 assertTrue(%HasFastDoubleElements(a3));
170 assertEquals([], a3r);
171 assertEquals([2, 1.1, 2, 3], a3);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000172 a3 = [1.1, 2, 3];
173 assertTrue(%HasFastDoubleElements(a3));
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000174 a3r = a3.splice(0, 1, 2);
175 assertTrue(%HasFastDoubleElements(a3r));
176 assertTrue(%HasFastDoubleElements(a3));
177 assertEquals([1.1], a3r);
178 assertEquals([2, 2, 3], a3);
179 a3 = [1.1,2,3];
180 a3r = a3.splice(0, 0, 2.1);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000181 assertTrue(%HasFastDoubleElements(a3r));
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000182 assertTrue(%HasFastDoubleElements(a3));
183 assertEquals([], a3r);
184 assertEquals([2.1, 1.1, 2, 3], a3);
185 a3 = [1.1,2,3];
186 a3r = a3.splice(0, 1, 2.2);
187 assertTrue(%HasFastDoubleElements(a3r));
188 assertTrue(%HasFastDoubleElements(a3));
189 assertEquals([1.1], a3r);
190 assertEquals([2.2, 2, 3], a3);
191 a3 = [1,2,3];
192 a3r = a3.splice(0, 0, 2.1);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000193 assertTrue(%HasFastDoubleElements(a3r));
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000194 assertTrue(%HasFastDoubleElements(a3));
195 assertEquals([], a3r);
196 assertEquals([2.1, 1, 2, 3], a3);
197 a3 = [1,2,3];
198 a3r = a3.splice(0, 1, 2.2);
199 assertTrue(%HasFastDoubleElements(a3r));
200 assertTrue(%HasFastDoubleElements(a3));
201 assertEquals([1], a3r);
202 assertEquals([2.2, 2, 3], a3);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000203 a3 = [{},2,3];
204 a3r = a3.splice(0, 0);
205 assertTrue(%HasFastObjectElements(a3r));
206 assertTrue(%HasFastObjectElements(a3));
207 assertEquals([], a3r);
208 assertEquals([{}, 2, 3], a3);
209 a3 = [1,2,{}];
210 a3r = a3.splice(0, 1);
211 assertTrue(%HasFastObjectElements(a3r));
212 assertTrue(%HasFastObjectElements(a3));
213 assertEquals([1], a3r);
214 assertEquals([2, {}], a3);
215 a3 = [1,2,3];
216 a3r = a3.splice(0, 0, {});
217 assertTrue(%HasFastObjectElements(a3r));
218 assertTrue(%HasFastObjectElements(a3));
219 assertEquals([], a3r);
220 assertEquals([{}, 1, 2, 3], a3);
221 a3 = [1,2,3];
222 a3r = a3.splice(0, 1, {});
223 assertTrue(%HasFastObjectElements(a3r));
224 assertTrue(%HasFastObjectElements(a3));
225 assertEquals([1], a3r);
226 assertEquals([{}, 2, 3], a3);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000227 a3 = [1.1,2,3];
228 a3r = a3.splice(0, 0, {});
229 assertTrue(%HasFastObjectElements(a3r));
230 assertTrue(%HasFastObjectElements(a3));
231 assertEquals([], a3r);
232 assertEquals([{}, 1.1, 2, 3], a3);
233 a3 = [1.1,2,3];
234 a3r = a3.splice(0, 1, {});
235 assertTrue(%HasFastObjectElements(a3r));
236 assertTrue(%HasFastObjectElements(a3));
237 assertEquals([1.1], a3r);
238 assertEquals([{}, 2, 3], a3);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000239 a3 = [1.1, 2.2, 3.3];
240 a3r = a3.splice(2, 1);
241 assertTrue(%HasFastDoubleElements(a3r));
242 assertTrue(%HasFastDoubleElements(a3));
243 assertEquals([3.3], a3r);
244 //assertTrue(%HasFastDoubleElements(a3r));
245 assertEquals([1.1, 2.2], a3);
246 //assertTrue(%HasFastDoubleElements(a3r));
247 a3r = a3.splice(1, 1, 4.4, 5.5);
248 //assertTrue(%HasFastDoubleElements(a3r));
249 //assertTrue(%HasFastDoubleElements(a3));
250 assertEquals([2.2], a3r);
251 assertEquals([1.1, 4.4, 5.5], a3);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000252
253 // Pop
254 var a4 = [1,2,3];
255 assertEquals(3, a4.pop());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000256 assertEquals([1,2], a4);
257 //assertTrue(%HasFastSmiElements(a4));
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000258 a4 = [1.1,2,3];
259 assertEquals(3, a4.pop());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000260 assertEquals([1.1,2], a4);
261 //assertTrue(%HasFastDoubleElements(a4));
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000262 a4 = [{},2,3];
263 assertEquals(3, a4.pop());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000264 assertEquals([{},2], a4);
265 //assertTrue(%HasFastObjectElements(a4));
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000266
267 // Shift
268 var a4 = [1,2,3];
269 assertEquals(1, a4.shift());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000270 assertEquals([2,3], a4);
271 //assertTrue(%HasFastSmiElements(a4));
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000272 a4 = [1.1,2,3];
273 assertEquals(1.1, a4.shift());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000274 assertEquals([2,3], a4);
275 //assertTrue(%HasFastDoubleElements(a4));
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000276 a4 = [{},2,3];
277 assertEquals({}, a4.shift());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000278 assertEquals([2,3], a4);
279 //assertTrue(%HasFastObjectElements(a4));
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000280
281 // Unshift
282 var a4 = [1,2,3];
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000283 assertEquals(4, a4.unshift(1));
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000284 assertTrue(%HasFastSmiElements(a4));
285 assertEquals([1,1,2,3], a4);
286 a4 = [1,2,3];
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000287 assertEquals(4, a4.unshift(1.1));
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400288 assertTrue(%HasFastDoubleElements(a4));
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000289 assertEquals([1.1,1,2,3], a4);
290 a4 = [1.1,2,3];
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000291 assertEquals(4, a4.unshift(1));
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400292 assertTrue(%HasFastDoubleElements(a4));
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000293 assertEquals([1,1.1,2,3], a4);
294 a4 = [{},2,3];
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000295 assertEquals(4, a4.unshift(1));
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000296 assertTrue(%HasFastObjectElements(a4));
297 assertEquals([1,{},2,3], a4);
298 a4 = [{},2,3];
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000299 assertEquals(4, a4.unshift(1.1));
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000300 assertTrue(%HasFastObjectElements(a4));
301 assertEquals([1.1,{},2,3], a4);
302}
303
304for (var i = 0; i < 3; i++) {
305 array_natives_test();
306}
307%OptimizeFunctionOnNextCall(array_natives_test);
308array_natives_test();