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
30 // IC and Crankshaft support for smi-only elements in dynamic array literals.
31 function get(foo) { return foo; } // Used to generate dynamic values.
33 function array_natives_test() {
35 // Ensure small array literals start in specific element kind mode.
36 assertTrue(%HasFastSmiElements([]));
37 assertTrue(%HasFastSmiElements([1]));
38 assertTrue(%HasFastSmiElements([1,2]));
39 assertTrue(%HasFastDoubleElements([1.1]));
40 assertTrue(%HasFastDoubleElements([1.1,2]));
42 // This code exists to eliminate the learning influence of AllocationSites
43 // on the following tests.
45 function make_array_string(literal) {
46 this.__sequence = this.__sequence + 1;
47 return "/* " + this.__sequence + " */ " + literal;
49 function make_array(literal) {
50 return eval(make_array_string(literal));
54 var a0 = make_array("[1, 2, 3]");
55 assertTrue(%HasFastSmiElements(a0));
57 assertTrue(%HasFastSmiElements(a0));
59 assertTrue(%HasFastDoubleElements(a0));
61 assertTrue(%HasFastDoubleElements(a0));
63 assertTrue(%HasFastObjectElements(a0));
65 assertTrue(%HasFastObjectElements(a0));
66 assertEquals([1,2,3,4,1.3,1.5,{},{}], a0);
70 a1 = [1,2,3].concat([]);
71 assertTrue(%HasFastSmiElements(a1));
72 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);
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);
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));
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));
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));
131 a3r = a3.splice(0, 0);
132 assertTrue(%HasFastSmiElements(a3r));
133 assertTrue(%HasFastSmiElements(a3));
134 assertEquals([], a3r);
135 assertEquals([1, 2, 3], a3);
137 a3r = a3.splice(0, 1);
138 assertTrue(%HasFastSmiElements(a3r));
139 assertTrue(%HasFastSmiElements(a3));
140 assertEquals([1], a3r);
141 assertEquals([2, 3], a3);
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);
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);
156 a3r = a3.splice(0, 0);
157 assertTrue(%HasFastDoubleElements(a3r));
158 assertTrue(%HasFastDoubleElements(a3));
159 assertEquals([], a3r);
160 assertEquals([1.1, 2, 3], a3);
162 a3r = a3.splice(0, 1);
163 assertTrue(%HasFastDoubleElements(a3r));
164 assertTrue(%HasFastDoubleElements(a3));
165 assertEquals([1.1], a3r);
166 assertEquals([2, 3], a3);
168 a3r = a3.splice(0, 0, 2);
169 // Commented out since handled in js, which takes the best fit.
170 // assertTrue(%HasFastDoubleElements(a3r));
171 assertTrue(%HasFastSmiElements(a3r));
172 assertTrue(%HasFastDoubleElements(a3));
173 assertEquals([], a3r);
174 assertEquals([2, 1.1, 2, 3], a3);
176 a3r = a3.splice(0, 1, 2);
177 assertTrue(%HasFastDoubleElements(a3r));
178 assertTrue(%HasFastDoubleElements(a3));
179 assertEquals([1.1], a3r);
180 assertEquals([2, 2, 3], a3);
182 a3r = a3.splice(0, 0, 2.1);
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.1, 2, 3], a3);
190 a3r = a3.splice(0, 1, 2.2);
191 assertTrue(%HasFastDoubleElements(a3r));
192 assertTrue(%HasFastDoubleElements(a3));
193 assertEquals([1.1], a3r);
194 assertEquals([2.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, 2, 3], a3);
204 a3r = a3.splice(0, 1, 2.2);
205 assertTrue(%HasFastDoubleElements(a3r));
206 assertTrue(%HasFastDoubleElements(a3));
207 assertEquals([1], a3r);
208 assertEquals([2.2, 2, 3], a3);
211 a3r = a3.splice(0, 0);
212 assertTrue(%HasFastObjectElements(a3r));
213 assertTrue(%HasFastObjectElements(a3));
214 assertEquals([], a3r);
215 assertEquals([{}, 2, 3], a3);
217 a3r = a3.splice(0, 1);
218 assertTrue(%HasFastObjectElements(a3r));
219 assertTrue(%HasFastObjectElements(a3));
220 assertEquals([1], a3r);
221 assertEquals([2, {}], a3);
223 a3r = a3.splice(0, 0, {});
224 assertTrue(%HasFastObjectElements(a3r));
225 assertTrue(%HasFastObjectElements(a3));
226 assertEquals([], a3r);
227 assertEquals([{}, 1, 2, 3], a3);
229 a3r = a3.splice(0, 1, {});
230 assertTrue(%HasFastObjectElements(a3r));
231 assertTrue(%HasFastObjectElements(a3));
232 assertEquals([1], a3r);
233 assertEquals([{}, 2, 3], a3);
236 a3r = a3.splice(0, 0, {});
237 assertTrue(%HasFastObjectElements(a3r));
238 assertTrue(%HasFastObjectElements(a3));
239 assertEquals([], a3r);
240 assertEquals([{}, 1.1, 2, 3], a3);
242 a3r = a3.splice(0, 1, {});
243 assertTrue(%HasFastObjectElements(a3r));
244 assertTrue(%HasFastObjectElements(a3));
245 assertEquals([1.1], a3r);
246 assertEquals([{}, 2, 3], a3);
250 assertEquals(3, a4.pop());
251 assertTrue(%HasFastSmiElements(a4));
253 assertEquals(3, a4.pop());
254 assertTrue(%HasFastDoubleElements(a4));
256 assertEquals(3, a4.pop());
257 assertTrue(%HasFastObjectElements(a4));
261 assertEquals(1, a4.shift());
262 assertTrue(%HasFastSmiElements(a4));
264 assertEquals(1.1, a4.shift());
265 assertTrue(%HasFastDoubleElements(a4));
267 assertEquals({}, a4.shift());
268 assertTrue(%HasFastObjectElements(a4));
273 assertTrue(%HasFastSmiElements(a4));
274 assertEquals([1,1,2,3], a4);
277 assertTrue(%HasFastDoubleElements(a4));
278 assertEquals([1.1,1,2,3], a4);
281 assertTrue(%HasFastDoubleElements(a4));
282 assertEquals([1,1.1,2,3], a4);
285 assertTrue(%HasFastObjectElements(a4));
286 assertEquals([1,{},2,3], a4);
289 assertTrue(%HasFastObjectElements(a4));
290 assertEquals([1.1,{},2,3], a4);
293 for (var i = 0; i < 3; i++) {
294 array_natives_test();
296 %OptimizeFunctionOnNextCall(array_natives_test);
297 array_natives_test();