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
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
33var __sequence = 0;
34function array_natives_test() {
35
36  // Ensure small array literals start in specific element kind mode.
37  assertTrue(%HasFastSmiElements([]));
38  assertTrue(%HasFastSmiElements([1]));
39  assertTrue(%HasFastSmiElements([1,2]));
40  assertTrue(%HasFastDoubleElements([1.1]));
41  assertTrue(%HasFastDoubleElements([1.1,2]));
42
43  // This code exists to eliminate the learning influence of AllocationSites
44  // on the following tests.
45  function make_array_string(literal) {
46    this.__sequence = this.__sequence + 1;
47    return "/* " + this.__sequence + " */  " + literal;
48  }
49  function make_array(literal) {
50    return eval(make_array_string(literal));
51  }
52
53  // Push
54  var a0 = make_array("[1, 2, 3]");
55  assertTrue(%HasFastSmiElements(a0));
56  assertEquals(4, a0.push(4));
57  assertTrue(%HasFastSmiElements(a0));
58  assertEquals(5, a0.push(1.3));
59  assertTrue(%HasFastDoubleElements(a0));
60  assertEquals(6, a0.push(1.5));
61  assertTrue(%HasFastDoubleElements(a0));
62  assertEquals(7, a0.push({}));
63  assertTrue(%HasFastObjectElements(a0));
64  assertEquals(8, a0.push({}));
65  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([]);
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);
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);
154  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);
160  a3 = [1.1, 2, 3];
161  a3r = a3.splice(0, 1);
162  assertTrue(%HasFastDoubleElements(a3r));
163  assertTrue(%HasFastDoubleElements(a3));
164  assertEquals([1.1], a3r);
165  assertEquals([2, 3], a3);
166  a3 = [1.1, 2, 3];
167  a3r = a3.splice(0, 0, 2);
168  assertTrue(%HasFastDoubleElements(a3r));
169  assertTrue(%HasFastDoubleElements(a3));
170  assertEquals([], a3r);
171  assertEquals([2, 1.1, 2, 3], a3);
172  a3 = [1.1, 2, 3];
173  assertTrue(%HasFastDoubleElements(a3));
174  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);
181  assertTrue(%HasFastDoubleElements(a3r));
182  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);
193  assertTrue(%HasFastDoubleElements(a3r));
194  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);
203  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);
227  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);
239  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);
252
253  // Pop
254  var a4 = [1,2,3];
255  assertEquals(3, a4.pop());
256  assertEquals([1,2], a4);
257  //assertTrue(%HasFastSmiElements(a4));
258  a4 = [1.1,2,3];
259  assertEquals(3, a4.pop());
260  assertEquals([1.1,2], a4);
261  //assertTrue(%HasFastDoubleElements(a4));
262  a4 = [{},2,3];
263  assertEquals(3, a4.pop());
264  assertEquals([{},2], a4);
265  //assertTrue(%HasFastObjectElements(a4));
266
267  // Shift
268  var a4 = [1,2,3];
269  assertEquals(1, a4.shift());
270  assertEquals([2,3], a4);
271  //assertTrue(%HasFastSmiElements(a4));
272  a4 = [1.1,2,3];
273  assertEquals(1.1, a4.shift());
274  assertEquals([2,3], a4);
275  //assertTrue(%HasFastDoubleElements(a4));
276  a4 = [{},2,3];
277  assertEquals({}, a4.shift());
278  assertEquals([2,3], a4);
279  //assertTrue(%HasFastObjectElements(a4));
280
281  // Unshift
282  var a4 = [1,2,3];
283  assertEquals(4, a4.unshift(1));
284  assertTrue(%HasFastSmiElements(a4));
285  assertEquals([1,1,2,3], a4);
286  a4 = [1,2,3];
287  assertEquals(4, a4.unshift(1.1));
288  assertTrue(%HasFastDoubleElements(a4));
289  assertEquals([1.1,1,2,3], a4);
290  a4 = [1.1,2,3];
291  assertEquals(4, a4.unshift(1));
292  assertTrue(%HasFastDoubleElements(a4));
293  assertEquals([1,1.1,2,3], a4);
294  a4 = [{},2,3];
295  assertEquals(4, a4.unshift(1));
296  assertTrue(%HasFastObjectElements(a4));
297  assertEquals([1,{},2,3], a4);
298  a4 = [{},2,3];
299  assertEquals(4, a4.unshift(1.1));
300  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();
309