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 --expose-gc
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_literal_test() {
35 assertTrue(%HasFastSmiElements(a0));
36 var a1 = [get(1), get(2), get(3)];
37 assertTrue(%HasFastSmiElements(a1));
39 var b0 = [1, 2, get("three")];
40 assertTrue(%HasFastObjectElements(b0));
41 var b1 = [get(1), get(2), get("three")];
42 assertTrue(%HasFastObjectElements(b1));
44 var c0 = [1, 2, get(3.5)];
45 assertTrue(%HasFastDoubleElements(c0));
46 assertEquals(3.5, c0[2]);
47 assertEquals(2, c0[1]);
48 assertEquals(1, c0[0]);
51 assertTrue(%HasFastDoubleElements(c1));
52 assertEquals(3.5, c1[2]);
53 assertEquals(2, c1[1]);
54 assertEquals(1, c1[0]);
56 var c2 = [get(1), get(2), get(3.5)];
57 assertTrue(%HasFastDoubleElements(c2));
58 assertEquals(3.5, c2[2]);
59 assertEquals(2, c2[1]);
60 assertEquals(1, c2[0]);
62 var object = new Object();
63 var d0 = [1, 2, object];
64 assertTrue(%HasFastObjectElements(d0));
65 assertEquals(object, d0[2]);
66 assertEquals(2, d0[1]);
67 assertEquals(1, d0[0]);
70 assertTrue(%HasFastDoubleElements(e0));
71 assertEquals(3.5, e0[2]);
72 assertEquals(2, e0[1]);
73 assertEquals(1, e0[0]);
75 var f0 = [1, 2, [1, 2]];
76 assertTrue(%HasFastObjectElements(f0));
77 assertEquals([1,2], f0[2]);
78 assertEquals(2, f0[1]);
79 assertEquals(1, f0[0]);
82 for (var i = 0; i < 3; i++) {
85 %OptimizeFunctionOnNextCall(array_literal_test);
88 function test_large_literal() {
101 [ 0, 1, 2, 3, 4, 5, d(), d(), d(), d(), d(), d(), o(), o(), o(), o() ];
102 assertFalse(%HasDictionaryElements(large));
103 assertFalse(%HasFastSmiElements(large));
104 assertFalse(%HasFastDoubleElements(large));
105 assertTrue(%HasFastObjectElements(large));
107 [0, 1, 2, 3, 4, 5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5,
108 new Object(), new Object(), new Object(), new Object()]);
111 for (var i = 0; i < 3; i++) {
112 test_large_literal();
114 %OptimizeFunctionOnNextCall(test_large_literal);
115 test_large_literal();
117 function deopt_array(use_literal) {
128 %OptimizeFunctionOnNextCall(deopt_array);
129 var array = deopt_array(false);
130 assertOptimized(deopt_array);
132 assertOptimized(deopt_array);
133 array = deopt_array(false);
134 assertOptimized(deopt_array);
136 // Check that unexpected changes in the objects stored into the boilerplate
137 // also force a deopt.
138 function deopt_array_literal_all_smis(a) {
142 deopt_array_literal_all_smis(2);
143 deopt_array_literal_all_smis(3);
144 deopt_array_literal_all_smis(4);
145 array = deopt_array_literal_all_smis(4);
146 assertEquals(0, array[0]);
147 assertEquals(1, array[1]);
148 assertEquals(4, array[2]);
149 %OptimizeFunctionOnNextCall(deopt_array_literal_all_smis);
150 array = deopt_array_literal_all_smis(5);
151 array = deopt_array_literal_all_smis(6);
152 assertOptimized(deopt_array_literal_all_smis);
153 assertEquals(0, array[0]);
154 assertEquals(1, array[1]);
155 assertEquals(6, array[2]);
157 array = deopt_array_literal_all_smis(.5);
158 assertUnoptimized(deopt_array_literal_all_smis);
159 assertEquals(0, array[0]);
160 assertEquals(1, array[1]);
161 assertEquals(.5, array[2]);
163 function deopt_array_literal_all_doubles(a) {
167 deopt_array_literal_all_doubles(.5);
168 deopt_array_literal_all_doubles(.5);
169 deopt_array_literal_all_doubles(.5);
170 array = deopt_array_literal_all_doubles(0.5);
171 assertEquals(0.5, array[0]);
172 assertEquals(1, array[1]);
173 assertEquals(0.5, array[2]);
174 %OptimizeFunctionOnNextCall(deopt_array_literal_all_doubles);
175 array = deopt_array_literal_all_doubles(5);
176 array = deopt_array_literal_all_doubles(6);
177 assertOptimized(deopt_array_literal_all_doubles);
178 assertEquals(0.5, array[0]);
179 assertEquals(1, array[1]);
180 assertEquals(6, array[2]);
182 var foo = new Object();
183 array = deopt_array_literal_all_doubles(foo);
184 assertUnoptimized(deopt_array_literal_all_doubles);
185 assertEquals(0.5, array[0]);
186 assertEquals(1, array[1]);
187 assertEquals(foo, array[2]);
189 (function literals_after_osr() {
191 // Trigger OSR, if optimization is not disabled.
192 if (%GetOptimizationStatus(literals_after_osr) != 4) {
193 while (%GetOptimizationCount(literals_after_osr) == 0) {}