OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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 <iomanip> | 5 #include <iomanip> |
6 #include <sstream> | 6 #include <sstream> |
7 | 7 |
8 #include "src/v8.h" | 8 #include "src/v8.h" |
9 | 9 |
10 #include "src/accessors.h" | 10 #include "src/accessors.h" |
(...skipping 2402 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2413 // Check the state of the root map. | 2413 // Check the state of the root map. |
2414 Handle<Map> root_map(old_map->FindRootMap(), isolate); | 2414 Handle<Map> root_map(old_map->FindRootMap(), isolate); |
2415 if (!old_map->EquivalentToForTransition(*root_map)) { | 2415 if (!old_map->EquivalentToForTransition(*root_map)) { |
2416 return CopyGeneralizeAllRepresentations(old_map, modify_index, store_mode, | 2416 return CopyGeneralizeAllRepresentations(old_map, modify_index, store_mode, |
2417 new_kind, new_attributes, | 2417 new_kind, new_attributes, |
2418 "GenAll_NotEquivalent"); | 2418 "GenAll_NotEquivalent"); |
2419 } | 2419 } |
2420 | 2420 |
2421 ElementsKind from_kind = root_map->elements_kind(); | 2421 ElementsKind from_kind = root_map->elements_kind(); |
2422 ElementsKind to_kind = old_map->elements_kind(); | 2422 ElementsKind to_kind = old_map->elements_kind(); |
2423 if (from_kind != to_kind && | 2423 if (from_kind != to_kind && to_kind != DICTIONARY_ELEMENTS && |
2424 !(IsTransitionableFastElementsKind(from_kind) && | 2424 !(IsTransitionableFastElementsKind(from_kind) && |
2425 IsMoreGeneralElementsKindTransition(from_kind, to_kind))) { | 2425 IsMoreGeneralElementsKindTransition(from_kind, to_kind))) { |
2426 return CopyGeneralizeAllRepresentations(old_map, modify_index, store_mode, | 2426 return CopyGeneralizeAllRepresentations(old_map, modify_index, store_mode, |
2427 new_kind, new_attributes, | 2427 new_kind, new_attributes, |
2428 "GenAll_InvalidElementsTransition"); | 2428 "GenAll_InvalidElementsTransition"); |
2429 } | 2429 } |
2430 int root_nof = root_map->NumberOfOwnDescriptors(); | 2430 int root_nof = root_map->NumberOfOwnDescriptors(); |
2431 if (modify_index >= 0 && modify_index < root_nof) { | 2431 if (modify_index >= 0 && modify_index < root_nof) { |
2432 PropertyDetails old_details = old_descriptors->GetDetails(modify_index); | 2432 PropertyDetails old_details = old_descriptors->GetDetails(modify_index); |
2433 if (old_details.kind() != new_kind || | 2433 if (old_details.kind() != new_kind || |
(...skipping 443 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2877 // static | 2877 // static |
2878 MaybeHandle<Map> Map::TryUpdate(Handle<Map> old_map) { | 2878 MaybeHandle<Map> Map::TryUpdate(Handle<Map> old_map) { |
2879 DisallowHeapAllocation no_allocation; | 2879 DisallowHeapAllocation no_allocation; |
2880 DisallowDeoptimization no_deoptimization(old_map->GetIsolate()); | 2880 DisallowDeoptimization no_deoptimization(old_map->GetIsolate()); |
2881 | 2881 |
2882 if (!old_map->is_deprecated()) return old_map; | 2882 if (!old_map->is_deprecated()) return old_map; |
2883 | 2883 |
2884 // Check the state of the root map. | 2884 // Check the state of the root map. |
2885 Map* root_map = old_map->FindRootMap(); | 2885 Map* root_map = old_map->FindRootMap(); |
2886 if (!old_map->EquivalentToForTransition(root_map)) return MaybeHandle<Map>(); | 2886 if (!old_map->EquivalentToForTransition(root_map)) return MaybeHandle<Map>(); |
| 2887 |
| 2888 ElementsKind from_kind = root_map->elements_kind(); |
| 2889 ElementsKind to_kind = old_map->elements_kind(); |
| 2890 if (from_kind != to_kind) { |
| 2891 // Try to follow existing elements kind transitions. |
| 2892 root_map = root_map->LookupElementsTransitionMap(to_kind); |
| 2893 if (root_map == NULL) return MaybeHandle<Map>(); |
| 2894 // From here on, use the map with correct elements kind as root map. |
| 2895 } |
2887 int root_nof = root_map->NumberOfOwnDescriptors(); | 2896 int root_nof = root_map->NumberOfOwnDescriptors(); |
2888 | 2897 |
2889 int old_nof = old_map->NumberOfOwnDescriptors(); | 2898 int old_nof = old_map->NumberOfOwnDescriptors(); |
2890 DescriptorArray* old_descriptors = old_map->instance_descriptors(); | 2899 DescriptorArray* old_descriptors = old_map->instance_descriptors(); |
2891 | 2900 |
2892 Map* new_map = root_map; | 2901 Map* new_map = root_map; |
2893 for (int i = root_nof; i < old_nof; ++i) { | 2902 for (int i = root_nof; i < old_nof; ++i) { |
2894 PropertyDetails old_details = old_descriptors->GetDetails(i); | 2903 PropertyDetails old_details = old_descriptors->GetDetails(i); |
2895 Map* transition = TransitionArray::SearchTransition( | 2904 Map* transition = TransitionArray::SearchTransition( |
2896 new_map, old_details.kind(), old_descriptors->GetKey(i), | 2905 new_map, old_details.kind(), old_descriptors->GetKey(i), |
(...skipping 13796 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
16693 Handle<Object> new_value) { | 16702 Handle<Object> new_value) { |
16694 if (cell->value() != *new_value) { | 16703 if (cell->value() != *new_value) { |
16695 cell->set_value(*new_value); | 16704 cell->set_value(*new_value); |
16696 Isolate* isolate = cell->GetIsolate(); | 16705 Isolate* isolate = cell->GetIsolate(); |
16697 cell->dependent_code()->DeoptimizeDependentCodeGroup( | 16706 cell->dependent_code()->DeoptimizeDependentCodeGroup( |
16698 isolate, DependentCode::kPropertyCellChangedGroup); | 16707 isolate, DependentCode::kPropertyCellChangedGroup); |
16699 } | 16708 } |
16700 } | 16709 } |
16701 } // namespace internal | 16710 } // namespace internal |
16702 } // namespace v8 | 16711 } // namespace v8 |
OLD | NEW |