1fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org// Copyright 2012 the V8 project authors. All rights reserved.
2fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org// Redistribution and use in source and binary forms, with or without
3fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org// modification, are permitted provided that the following conditions are
4fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org// met:
5fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org//
6fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org//     * Redistributions of source code must retain the above copyright
7fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org//       notice, this list of conditions and the following disclaimer.
8fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org//     * Redistributions in binary form must reproduce the above
9fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org//       copyright notice, this list of conditions and the following
10fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org//       disclaimer in the documentation and/or other materials provided
11fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org//       with the distribution.
12fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org//     * Neither the name of Google Inc. nor the names of its
13fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org//       contributors may be used to endorse or promote products derived
14fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org//       from this software without specific prior written permission.
15fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org//
16fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
28474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org// Flags: --allow-natives-syntax
29fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
30fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org// IC and Crankshaft support for smi-only elements in dynamic array literals.
31fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.orgfunction get(foo) { return foo; }  // Used to generate dynamic values.
32fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
33fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.orgfunction array_natives_test() {
34fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
35fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  // Ensure small array literals start in specific element kind mode.
361f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org  assertTrue(%HasFastSmiElements([]));
37fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastSmiElements([1]));
38fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastSmiElements([1,2]));
39fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastDoubleElements([1.1]));
40fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastDoubleElements([1.1,2]));
41fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
421e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org  // This code exists to eliminate the learning influence of AllocationSites
431e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org  // on the following tests.
441e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org  var __sequence = 0;
451e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org  function make_array_string(literal) {
461e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org    this.__sequence = this.__sequence + 1;
471e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org    return "/* " + this.__sequence + " */  " + literal;
481e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org  }
491e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org  function make_array(literal) {
501e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org    return eval(make_array_string(literal));
5159297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  }
521e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org
531e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org  // Push
541e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org  var a0 = make_array("[1, 2, 3]");
551e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org  assertTrue(%HasFastSmiElements(a0));
561e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org  a0.push(4);
571e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org  assertTrue(%HasFastSmiElements(a0));
581e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org  a0.push(1.3);
591e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org  assertTrue(%HasFastDoubleElements(a0));
601e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org  a0.push(1.5);
611e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org  assertTrue(%HasFastDoubleElements(a0));
621e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org  a0.push({});
631e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org  assertTrue(%HasFastObjectElements(a0));
641e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org  a0.push({});
651e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org  assertTrue(%HasFastObjectElements(a0));
66fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([1,2,3,4,1.3,1.5,{},{}], a0);
67fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
68fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  // Concat
69fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  var a1;
70fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a1 = [1,2,3].concat([]);
711f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org  assertTrue(%HasFastSmiElements(a1));
72fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([1,2,3], a1);
73fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a1 = [1,2,3].concat([4,5,6]);
74fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastSmiElements(a1));
75fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([1,2,3,4,5,6], a1);
76fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a1 = [1,2,3].concat([4,5,6], [7,8,9]);
77fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastSmiElements(a1));
78fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([1,2,3,4,5,6,7,8,9], a1);
79fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a1 = [1.1,2,3].concat([]);
801f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org  assertTrue(%HasFastDoubleElements(a1));
81fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([1.1,2,3], a1);
82fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a1 = [1,2,3].concat([1.1, 2]);
83fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastDoubleElements(a1));
84fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([1,2,3,1.1,2], a1);
85fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a1 = [1.1,2,3].concat([1, 2]);
86fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastDoubleElements(a1));
87fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([1.1,2,3,1,2], a1);
88fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a1 = [1.1,2,3].concat([1.2, 2]);
89fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastDoubleElements(a1));
90fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([1.1,2,3,1.2,2], a1);
91fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
92fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a1 = [1,2,3].concat([{}]);
93fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastObjectElements(a1));
94fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([1,2,3,{}], a1);
95fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a1 = [1.1,2,3].concat([{}]);
96fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastObjectElements(a1));
97fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([1.1,2,3,{}], a1);
98fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a1 = [{}].concat([1,2,3]);
99fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastObjectElements(a1));
100fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([{},1,2,3], a1);
101fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a1 = [{}].concat([1.1,2,3]);
102fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastObjectElements(a1));
103fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([{},1.1,2,3], a1);
104fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
105fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  // Slice
106fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  var a2 = [1,2,3];
107fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastSmiElements(a2.slice()));
108fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastSmiElements(a2.slice(1)));
109fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastSmiElements(a2.slice(1, 2)));
110fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([1,2,3], a2.slice());
111fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([2,3], a2.slice(1));
112fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([2], a2.slice(1,2));
113fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a2 = [1.1,2,3];
114fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastDoubleElements(a2.slice()));
115fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastDoubleElements(a2.slice(1)));
116fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastDoubleElements(a2.slice(1, 2)));
117fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([1.1,2,3], a2.slice());
118fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([2,3], a2.slice(1));
119fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([2], a2.slice(1,2));
120fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a2 = [{},2,3];
121fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastObjectElements(a2.slice()));
122fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastObjectElements(a2.slice(1)));
123fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastObjectElements(a2.slice(1, 2)));
124fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([{},2,3], a2.slice());
125fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([2,3], a2.slice(1));
126fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([2], a2.slice(1,2));
127fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
128fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  // Splice
129fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  var a3 = [1,2,3];
130fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  var a3r;
131fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a3r = a3.splice(0, 0);
132fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastSmiElements(a3r));
133fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastSmiElements(a3));
134fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([], a3r);
135fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([1, 2, 3], a3);
136fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a3 = [1,2,3];
137fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a3r = a3.splice(0, 1);
138fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastSmiElements(a3r));
139fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastSmiElements(a3));
140fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([1], a3r);
141fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([2, 3], a3);
142fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a3 = [1,2,3];
143fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a3r = a3.splice(0, 0, 2);
144fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastSmiElements(a3r));
145fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastSmiElements(a3));
146fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([], a3r);
147fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([2, 1, 2, 3], a3);
148fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a3 = [1,2,3];
149fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a3r = a3.splice(0, 1, 2);
150fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastSmiElements(a3r));
151fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastSmiElements(a3));
152fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([1], a3r);
153fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([2, 2, 3], a3);
154fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
155fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a3 = [1.1,2,3];
156fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a3r = a3.splice(0, 0);
157fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastDoubleElements(a3r));
158fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastDoubleElements(a3));
159fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([], a3r);
160fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([1.1, 2, 3], a3);
161fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a3 = [1.1,2,3];
162fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a3r = a3.splice(0, 1);
163fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastDoubleElements(a3r));
164fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastDoubleElements(a3));
165fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([1.1], a3r);
166fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([2, 3], a3);
167fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a3 = [1.1,2,3];
168fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a3r = a3.splice(0, 0, 2);
169fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  // Commented out since handled in js, which takes the best fit.
170fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  // assertTrue(%HasFastDoubleElements(a3r));
1711f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org  assertTrue(%HasFastSmiElements(a3r));
172fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastDoubleElements(a3));
173fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([], a3r);
174fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([2, 1.1, 2, 3], a3);
175fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a3 = [1.1,2,3];
176fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a3r = a3.splice(0, 1, 2);
177fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastDoubleElements(a3r));
178fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastDoubleElements(a3));
179fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([1.1], a3r);
180fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([2, 2, 3], a3);
181fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a3 = [1.1,2,3];
182fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a3r = a3.splice(0, 0, 2.1);
183fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  // Commented out since handled in js, which takes the best fit.
184fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  // assertTrue(%HasFastDoubleElements(a3r));
1851f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org  assertTrue(%HasFastSmiElements(a3r));
186fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastDoubleElements(a3));
187fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([], a3r);
188fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([2.1, 1.1, 2, 3], a3);
189fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a3 = [1.1,2,3];
190fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a3r = a3.splice(0, 1, 2.2);
191fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastDoubleElements(a3r));
192fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastDoubleElements(a3));
193fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([1.1], a3r);
194fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([2.2, 2, 3], a3);
195fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a3 = [1,2,3];
196fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a3r = a3.splice(0, 0, 2.1);
197fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  // Commented out since handled in js, which takes the best fit.
198fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  // assertTrue(%HasFastDoubleElements(a3r));
1991f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org  assertTrue(%HasFastSmiElements(a3r));
200fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastDoubleElements(a3));
201fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([], a3r);
202fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([2.1, 1, 2, 3], a3);
203fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a3 = [1,2,3];
204fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a3r = a3.splice(0, 1, 2.2);
205fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastDoubleElements(a3r));
206fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastDoubleElements(a3));
207fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([1], a3r);
208fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([2.2, 2, 3], a3);
209fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
210fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a3 = [{},2,3];
211fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a3r = a3.splice(0, 0);
212fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastObjectElements(a3r));
213fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastObjectElements(a3));
214fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([], a3r);
215fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([{}, 2, 3], a3);
216fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a3 = [1,2,{}];
217fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a3r = a3.splice(0, 1);
218fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastObjectElements(a3r));
219fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastObjectElements(a3));
220fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([1], a3r);
221fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([2, {}], a3);
222fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a3 = [1,2,3];
223fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a3r = a3.splice(0, 0, {});
224fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastObjectElements(a3r));
225fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastObjectElements(a3));
226fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([], a3r);
227fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([{}, 1, 2, 3], a3);
228fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a3 = [1,2,3];
229fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a3r = a3.splice(0, 1, {});
230fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastObjectElements(a3r));
231fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastObjectElements(a3));
232fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([1], a3r);
233fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([{}, 2, 3], a3);
234fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
235fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a3 = [1.1,2,3];
236fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a3r = a3.splice(0, 0, {});
237fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastObjectElements(a3r));
238fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastObjectElements(a3));
239fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([], a3r);
240fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([{}, 1.1, 2, 3], a3);
241fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a3 = [1.1,2,3];
242fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a3r = a3.splice(0, 1, {});
243fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastObjectElements(a3r));
244fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastObjectElements(a3));
245fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([1.1], a3r);
246fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([{}, 2, 3], a3);
247fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
248fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  // Pop
249fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  var a4 = [1,2,3];
250fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals(3, a4.pop());
251fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastSmiElements(a4));
252fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a4 = [1.1,2,3];
253fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals(3, a4.pop());
254fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastDoubleElements(a4));
255fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a4 = [{},2,3];
256fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals(3, a4.pop());
257fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastObjectElements(a4));
258fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
259fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  // Shift
260fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  var a4 = [1,2,3];
261fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals(1, a4.shift());
262fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastSmiElements(a4));
263fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a4 = [1.1,2,3];
264fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals(1.1, a4.shift());
265fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastDoubleElements(a4));
266fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a4 = [{},2,3];
267fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals({}, a4.shift());
268fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastObjectElements(a4));
269fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
270fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  // Unshift
271fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  var a4 = [1,2,3];
272fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a4.unshift(1);
273fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastSmiElements(a4));
274fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([1,1,2,3], a4);
275fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a4 = [1,2,3];
276fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a4.unshift(1.1);
277fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  // TODO(verwaest): We'll want to support double unshifting as well.
278fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  // assertTrue(%HasFastDoubleElements(a4));
279fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastObjectElements(a4));
280fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([1.1,1,2,3], a4);
281fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a4 = [1.1,2,3];
282fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a4.unshift(1);
283fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  // assertTrue(%HasFastDoubleElements(a4));
284fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastObjectElements(a4));
285fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([1,1.1,2,3], a4);
286fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a4 = [{},2,3];
287fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a4.unshift(1);
288fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastObjectElements(a4));
289fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([1,{},2,3], a4);
290fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a4 = [{},2,3];
291fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  a4.unshift(1.1);
292fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertTrue(%HasFastObjectElements(a4));
293fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  assertEquals([1.1,{},2,3], a4);
294fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org}
295fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
296474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.orgfor (var i = 0; i < 3; i++) {
297fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  array_natives_test();
298fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org}
299474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org%OptimizeFunctionOnNextCall(array_natives_test);
300474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.orgarray_natives_test();
301