| OLD | NEW |
| 1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/compiler/js-create-lowering.h" | 5 #include "src/compiler/js-create-lowering.h" |
| 6 | 6 |
| 7 #include "src/allocation-site-scopes.h" | 7 #include "src/allocation-site-scopes.h" |
| 8 #include "src/code-factory.h" | 8 #include "src/code-factory.h" |
| 9 #include "src/compilation-dependencies.h" | 9 #include "src/compilation-dependencies.h" |
| 10 #include "src/compiler/access-builder.h" | 10 #include "src/compiler/access-builder.h" |
| (...skipping 1079 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1090 PretenureFlag pretenure) { | 1090 PretenureFlag pretenure) { |
| 1091 DCHECK_LE(1, capacity); | 1091 DCHECK_LE(1, capacity); |
| 1092 DCHECK_LE(capacity, JSArray::kInitialMaxFastElementArray); | 1092 DCHECK_LE(capacity, JSArray::kInitialMaxFastElementArray); |
| 1093 | 1093 |
| 1094 Handle<Map> elements_map = IsFastDoubleElementsKind(elements_kind) | 1094 Handle<Map> elements_map = IsFastDoubleElementsKind(elements_kind) |
| 1095 ? factory()->fixed_double_array_map() | 1095 ? factory()->fixed_double_array_map() |
| 1096 : factory()->fixed_array_map(); | 1096 : factory()->fixed_array_map(); |
| 1097 ElementAccess access = IsFastDoubleElementsKind(elements_kind) | 1097 ElementAccess access = IsFastDoubleElementsKind(elements_kind) |
| 1098 ? AccessBuilder::ForFixedDoubleArrayElement() | 1098 ? AccessBuilder::ForFixedDoubleArrayElement() |
| 1099 : AccessBuilder::ForFixedArrayElement(); | 1099 : AccessBuilder::ForFixedArrayElement(); |
| 1100 Node* value; | 1100 Node* value = jsgraph()->TheHoleConstant(); |
| 1101 if (IsFastDoubleElementsKind(elements_kind)) { | |
| 1102 // Load the hole NaN pattern from the canonical location. | |
| 1103 value = effect = graph()->NewNode( | |
| 1104 simplified()->LoadField(AccessBuilder::ForExternalDoubleValue()), | |
| 1105 jsgraph()->ExternalConstant( | |
| 1106 ExternalReference::address_of_the_hole_nan()), | |
| 1107 effect, control); | |
| 1108 } else { | |
| 1109 value = jsgraph()->TheHoleConstant(); | |
| 1110 } | |
| 1111 | 1101 |
| 1112 // Actually allocate the backing store. | 1102 // Actually allocate the backing store. |
| 1113 AllocationBuilder a(jsgraph(), effect, control); | 1103 AllocationBuilder a(jsgraph(), effect, control); |
| 1114 a.AllocateArray(capacity, elements_map, pretenure); | 1104 a.AllocateArray(capacity, elements_map, pretenure); |
| 1115 for (int i = 0; i < capacity; ++i) { | 1105 for (int i = 0; i < capacity; ++i) { |
| 1116 Node* index = jsgraph()->Constant(i); | 1106 Node* index = jsgraph()->Constant(i); |
| 1117 a.Store(access, index, value); | 1107 a.Store(access, index, value); |
| 1118 } | 1108 } |
| 1119 return a.Finish(); | 1109 return a.Finish(); |
| 1120 } | 1110 } |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1248 return jsgraph()->HeapConstant(boilerplate_elements); | 1238 return jsgraph()->HeapConstant(boilerplate_elements); |
| 1249 } | 1239 } |
| 1250 | 1240 |
| 1251 // Compute the elements to store first (might have effects). | 1241 // Compute the elements to store first (might have effects). |
| 1252 int const elements_length = boilerplate_elements->length(); | 1242 int const elements_length = boilerplate_elements->length(); |
| 1253 Handle<Map> elements_map(boilerplate_elements->map(), isolate()); | 1243 Handle<Map> elements_map(boilerplate_elements->map(), isolate()); |
| 1254 ZoneVector<Node*> elements_values(elements_length, zone()); | 1244 ZoneVector<Node*> elements_values(elements_length, zone()); |
| 1255 if (elements_map->instance_type() == FIXED_DOUBLE_ARRAY_TYPE) { | 1245 if (elements_map->instance_type() == FIXED_DOUBLE_ARRAY_TYPE) { |
| 1256 Handle<FixedDoubleArray> elements = | 1246 Handle<FixedDoubleArray> elements = |
| 1257 Handle<FixedDoubleArray>::cast(boilerplate_elements); | 1247 Handle<FixedDoubleArray>::cast(boilerplate_elements); |
| 1258 Node* the_hole_value = nullptr; | |
| 1259 for (int i = 0; i < elements_length; ++i) { | 1248 for (int i = 0; i < elements_length; ++i) { |
| 1260 if (elements->is_the_hole(i)) { | 1249 if (elements->is_the_hole(i)) { |
| 1261 if (the_hole_value == nullptr) { | 1250 elements_values[i] = jsgraph()->TheHoleConstant(); |
| 1262 // Load the hole NaN pattern from the canonical location. | |
| 1263 the_hole_value = effect = graph()->NewNode( | |
| 1264 simplified()->LoadField(AccessBuilder::ForExternalDoubleValue()), | |
| 1265 jsgraph()->ExternalConstant( | |
| 1266 ExternalReference::address_of_the_hole_nan()), | |
| 1267 effect, control); | |
| 1268 } | |
| 1269 elements_values[i] = the_hole_value; | |
| 1270 } else { | 1251 } else { |
| 1271 elements_values[i] = jsgraph()->Constant(elements->get_scalar(i)); | 1252 elements_values[i] = jsgraph()->Constant(elements->get_scalar(i)); |
| 1272 } | 1253 } |
| 1273 } | 1254 } |
| 1274 } else { | 1255 } else { |
| 1275 Handle<FixedArray> elements = | 1256 Handle<FixedArray> elements = |
| 1276 Handle<FixedArray>::cast(boilerplate_elements); | 1257 Handle<FixedArray>::cast(boilerplate_elements); |
| 1277 for (int i = 0; i < elements_length; ++i) { | 1258 for (int i = 0; i < elements_length; ++i) { |
| 1278 if (elements->is_the_hole(isolate(), i)) { | 1259 if (elements->is_the_hole(isolate(), i)) { |
| 1279 elements_values[i] = jsgraph()->TheHoleConstant(); | 1260 elements_values[i] = jsgraph()->TheHoleConstant(); |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1348 return jsgraph()->simplified(); | 1329 return jsgraph()->simplified(); |
| 1349 } | 1330 } |
| 1350 | 1331 |
| 1351 MachineOperatorBuilder* JSCreateLowering::machine() const { | 1332 MachineOperatorBuilder* JSCreateLowering::machine() const { |
| 1352 return jsgraph()->machine(); | 1333 return jsgraph()->machine(); |
| 1353 } | 1334 } |
| 1354 | 1335 |
| 1355 } // namespace compiler | 1336 } // namespace compiler |
| 1356 } // namespace internal | 1337 } // namespace internal |
| 1357 } // namespace v8 | 1338 } // namespace v8 |
| OLD | NEW |