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