| 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) ||
|
|
|