| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 176 %OptimizeFunctionOnNextCall(polymorphic); | 176 %OptimizeFunctionOnNextCall(polymorphic); |
| 177 polymorphic(smis, element_kind.fast_smi_only_elements); | 177 polymorphic(smis, element_kind.fast_smi_only_elements); |
| 178 polymorphic(strings, element_kind.fast_elements); | 178 polymorphic(strings, element_kind.fast_elements); |
| 179 polymorphic(doubles, support_smi_only_arrays | 179 polymorphic(doubles, support_smi_only_arrays |
| 180 ? element_kind.fast_double_elements | 180 ? element_kind.fast_double_elements |
| 181 : element_kind.fast_elements); | 181 : element_kind.fast_elements); |
| 182 | 182 |
| 183 // Crankshaft support for smi-only elements in dynamic array literals. | 183 // Crankshaft support for smi-only elements in dynamic array literals. |
| 184 function get(foo) { return foo; } // Used to generate dynamic values. | 184 function get(foo) { return foo; } // Used to generate dynamic values. |
| 185 | 185 |
| 186 //function crankshaft_test(expected_kind) { | |
| 187 function crankshaft_test() { | 186 function crankshaft_test() { |
| 188 var a = [get(1), get(2), get(3)]; | 187 var a = [get(1), get(2), get(3)]; |
| 189 assertKind(element_kind.fast_smi_only_elements, a); | 188 assertKind(element_kind.fast_smi_only_elements, a); |
| 190 var b = [get(1), get(2), get("three")]; | 189 var b = [get(1), get(2), get("three")]; |
| 191 assertKind(element_kind.fast_elements, b); | 190 assertKind(element_kind.fast_elements, b); |
| 192 var c = [get(1), get(2), get(3.5)]; | 191 var c = [get(1), get(2), get(3.5)]; |
| 193 // The full code generator doesn't support conversion to fast_double_elements | 192 // The full code generator doesn't support conversion to fast_double_elements |
| 194 // yet. Crankshaft does, but only with --smi-only-arrays support. | 193 // yet. Crankshaft does, but only with --smi-only-arrays support. |
| 195 if ((%GetOptimizationStatus(crankshaft_test) & 1) && | 194 if ((%GetOptimizationStatus(crankshaft_test) & 1) && |
| 196 support_smi_only_arrays) { | 195 support_smi_only_arrays) { |
| 197 assertKind(element_kind.fast_double_elements, c); | 196 assertKind(element_kind.fast_double_elements, c); |
| 198 } else { | 197 } else { |
| 199 assertKind(element_kind.fast_elements, c); | 198 assertKind(element_kind.fast_elements, c); |
| 200 } | 199 } |
| 201 } | 200 } |
| 202 for (var i = 0; i < 3; i++) { | 201 for (var i = 0; i < 3; i++) { |
| 203 crankshaft_test(); | 202 crankshaft_test(); |
| 204 } | 203 } |
| 205 %OptimizeFunctionOnNextCall(crankshaft_test); | 204 %OptimizeFunctionOnNextCall(crankshaft_test); |
| 206 crankshaft_test(); | 205 crankshaft_test(); |
| 206 |
| 207 // Elements_kind transitions for arrays. |
| 208 |
| 209 // A map can have three different elements_kind transitions: SMI->DOUBLE, |
| 210 // DOUBLE->OBJECT, and SMI->OBJECT. No matter in which order these three are |
| 211 // created, they must always end up with the same FAST map. |
| 212 // Preparation: create one pair of identical objects for each case. |
| 213 var a = [1, 2, 3]; |
| 214 var b = [1, 2, 3]; |
| 215 assertTrue(%HaveSameMap(a, b)); |
| 216 assertKind(element_kind.fast_smi_only_elements, a); |
| 217 var c = [1, 2, 3]; |
| 218 c["case2"] = true; |
| 219 var d = [1, 2, 3]; |
| 220 d["case2"] = true; |
| 221 assertTrue(%HaveSameMap(c, d)); |
| 222 assertFalse(%HaveSameMap(a, c)); |
| 223 assertKind(element_kind.fast_smi_only_elements, c); |
| 224 var e = [1, 2, 3]; |
| 225 e["case3"] = true; |
| 226 var f = [1, 2, 3]; |
| 227 f["case3"] = true; |
| 228 assertTrue(%HaveSameMap(e, f)); |
| 229 assertFalse(%HaveSameMap(a, e)); |
| 230 assertFalse(%HaveSameMap(c, e)); |
| 231 assertKind(element_kind.fast_smi_only_elements, e); |
| 232 // Case 1: SMI->DOUBLE, DOUBLE->OBJECT, SMI->OBJECT. |
| 233 a[0] = 1.5; |
| 234 assertKind(element_kind.fast_double_elements, a); |
| 235 a[0] = "foo"; |
| 236 assertKind(element_kind.fast_elements, a); |
| 237 b[0] = "bar"; |
| 238 assertTrue(%HaveSameMap(a, b)); |
| 239 // Case 2: SMI->DOUBLE, SMI->OBJECT, DOUBLE->OBJECT. |
| 240 c[0] = 1.5; |
| 241 assertKind(element_kind.fast_double_elements, c); |
| 242 assertFalse(%HaveSameMap(c, d)); |
| 243 d[0] = "foo"; |
| 244 assertKind(element_kind.fast_elements, d); |
| 245 assertFalse(%HaveSameMap(c, d)); |
| 246 c[0] = "bar"; |
| 247 assertTrue(%HaveSameMap(c, d)); |
| 248 // Case 3: SMI->OBJECT, SMI->DOUBLE, DOUBLE->OBJECT. |
| 249 e[0] = "foo"; |
| 250 assertKind(element_kind.fast_elements, e); |
| 251 assertFalse(%HaveSameMap(e, f)); |
| 252 f[0] = 1.5; |
| 253 assertKind(element_kind.fast_double_elements, f); |
| 254 assertFalse(%HaveSameMap(e, f)); |
| 255 f[0] = "bar"; |
| 256 assertKind(element_kind.fast_elements, f); |
| 257 assertTrue(%HaveSameMap(e, f)); |
| OLD | NEW |