OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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-native-context-specialization.h" | 5 #include "src/compiler/js-native-context-specialization.h" |
6 | 6 |
7 #include "src/accessors.h" | 7 #include "src/accessors.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 2292 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2303 if (map->is_migration_target()) { | 2303 if (map->is_migration_target()) { |
2304 flags |= CheckMapsFlag::kTryMigrateInstance; | 2304 flags |= CheckMapsFlag::kTryMigrateInstance; |
2305 } | 2305 } |
2306 } | 2306 } |
2307 return graph()->NewNode(simplified()->CheckMaps(flags, maps), receiver, | 2307 return graph()->NewNode(simplified()->CheckMaps(flags, maps), receiver, |
2308 effect, control); | 2308 effect, control); |
2309 } | 2309 } |
2310 | 2310 |
2311 Node* JSNativeContextSpecialization::BuildExtendPropertiesBackingStore( | 2311 Node* JSNativeContextSpecialization::BuildExtendPropertiesBackingStore( |
2312 Handle<Map> map, Node* properties, Node* effect, Node* control) { | 2312 Handle<Map> map, Node* properties, Node* effect, Node* control) { |
2313 // TODO(bmeurer/jkummerow): Property deletions can undo map transitions | |
2314 // while keeping the backing store around, meaning that even though the | |
2315 // map might believe that objects have no unused property fields, there | |
2316 // might actually be some. It would be nice to not create a new backing | |
2317 // store in that case (i.e. when properties->length() >= new_length). | |
2318 // However, introducing branches and Phi nodes here would make it more | |
2319 // difficult for escape analysis to get rid of the backing stores used | |
2320 // for intermediate states of chains of property additions. That makes | |
2321 // it unclear what the best approach is here. | |
2322 DCHECK_EQ(0, map->unused_property_fields()); | 2313 DCHECK_EQ(0, map->unused_property_fields()); |
2323 // Compute the length of the old {properties} and the new properties. | 2314 // Compute the length of the old {properties} and the new properties. |
2324 int length = map->NextFreePropertyIndex() - map->GetInObjectProperties(); | 2315 int length = map->NextFreePropertyIndex() - map->GetInObjectProperties(); |
2325 int new_length = length + JSObject::kFieldsAdded; | 2316 int new_length = length + JSObject::kFieldsAdded; |
2326 // Collect the field values from the {properties}. | 2317 // Collect the field values from the {properties}. |
2327 ZoneVector<Node*> values(zone()); | 2318 ZoneVector<Node*> values(zone()); |
2328 values.reserve(new_length); | 2319 values.reserve(new_length); |
2329 for (int i = 0; i < length; ++i) { | 2320 for (int i = 0; i < length; ++i) { |
2330 Node* value = effect = graph()->NewNode( | 2321 Node* value = effect = graph()->NewNode( |
2331 simplified()->LoadField(AccessBuilder::ForFixedArraySlot(i)), | 2322 simplified()->LoadField(AccessBuilder::ForFixedArraySlot(i)), |
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2571 return jsgraph()->javascript(); | 2562 return jsgraph()->javascript(); |
2572 } | 2563 } |
2573 | 2564 |
2574 SimplifiedOperatorBuilder* JSNativeContextSpecialization::simplified() const { | 2565 SimplifiedOperatorBuilder* JSNativeContextSpecialization::simplified() const { |
2575 return jsgraph()->simplified(); | 2566 return jsgraph()->simplified(); |
2576 } | 2567 } |
2577 | 2568 |
2578 } // namespace compiler | 2569 } // namespace compiler |
2579 } // namespace internal | 2570 } // namespace internal |
2580 } // namespace v8 | 2571 } // namespace v8 |
OLD | NEW |