Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index 3f9a9ca1f7a4b164d905f17a3f2c5cba8c644ef4..6fa90541ed09cd47d8f0cc039a0c8f247a3fe11b 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -2416,6 +2416,18 @@ Handle<Map> Map::CopyGeneralizeAllRepresentations(Handle<Map> map, |
} |
+// static |
+Handle<Map> Map::CopyGeneralizeAllRepresentations(Handle<Map> map, |
+ int modify_index, |
+ StoreMode store_mode, |
+ const char* reason) { |
+ PropertyDetails details = |
+ map->instance_descriptors()->GetDetails(modify_index); |
+ return CopyGeneralizeAllRepresentations(map, modify_index, store_mode, |
+ details.attributes(), reason); |
+} |
+ |
+ |
void Map::DeprecateTransitionTree() { |
if (is_deprecated()) return; |
if (HasTransitionArray()) { |
@@ -2661,8 +2673,8 @@ Handle<Map> Map::GeneralizeRepresentation(Handle<Map> old_map, |
// Check the state of the root map. |
Handle<Map> root_map(old_map->FindRootMap(), isolate); |
if (!old_map->EquivalentToForTransition(*root_map)) { |
- return CopyGeneralizeAllRepresentations(old_map, modify_index, store_mode, |
- old_details.attributes(), "not equivalent"); |
+ return CopyGeneralizeAllRepresentations( |
+ old_map, modify_index, store_mode, "not equivalent"); |
} |
int root_nof = root_map->NumberOfOwnDescriptors(); |
if (modify_index < root_nof) { |
@@ -2671,8 +2683,8 @@ Handle<Map> Map::GeneralizeRepresentation(Handle<Map> old_map, |
(old_details.type() == FIELD && |
(!new_field_type->NowIs(old_descriptors->GetFieldType(modify_index)) || |
!new_representation.fits_into(old_details.representation())))) { |
- return CopyGeneralizeAllRepresentations(old_map, modify_index, store_mode, |
- old_details.attributes(), "root modification"); |
+ return CopyGeneralizeAllRepresentations( |
+ old_map, modify_index, store_mode, "root modification"); |
} |
} |
@@ -2694,8 +2706,7 @@ Handle<Map> Map::GeneralizeRepresentation(Handle<Map> old_map, |
(tmp_type != old_type || |
tmp_descriptors->GetValue(i) != old_descriptors->GetValue(i)))) { |
return CopyGeneralizeAllRepresentations( |
- old_map, modify_index, store_mode, |
- old_details.attributes(), "incompatible"); |
+ old_map, modify_index, store_mode, "incompatible"); |
} |
Representation old_representation = old_details.representation(); |
Representation tmp_representation = tmp_details.representation(); |
@@ -2759,8 +2770,7 @@ Handle<Map> Map::GeneralizeRepresentation(Handle<Map> old_map, |
(tmp_details.type() != old_details.type() || |
tmp_descriptors->GetValue(i) != old_descriptors->GetValue(i)))) { |
return CopyGeneralizeAllRepresentations( |
- old_map, modify_index, store_mode, |
- old_details.attributes(), "incompatible"); |
+ old_map, modify_index, store_mode, "incompatible"); |
} |
target_map = tmp_map; |
} |
@@ -2803,6 +2813,7 @@ Handle<Map> Map::GeneralizeRepresentation(Handle<Map> old_map, |
target_details = target_details.CopyWithRepresentation( |
new_representation.generalize(target_details.representation())); |
} |
+ ASSERT_EQ(old_details.attributes(), target_details.attributes()); |
if (old_details.type() == FIELD || |
target_details.type() == FIELD || |
(modify_index == i && store_mode == FORCE_FIELD) || |