| Index: src/objects.cc
|
| diff --git a/src/objects.cc b/src/objects.cc
|
| index 775a66479bff7cd527592cacadfb79f491610a47..d745d60ad990650f66f3ff9a18dd6385c0941757 100644
|
| --- a/src/objects.cc
|
| +++ b/src/objects.cc
|
| @@ -2243,7 +2243,7 @@ Map* Map::FindLastMatchMap(int verbatim,
|
| DisallowHeapAllocation no_allocation;
|
|
|
| // This can only be called on roots of transition trees.
|
| - DCHECK(GetBackPointer()->IsUndefined());
|
| + DCHECK_EQ(verbatim, NumberOfOwnDescriptors());
|
|
|
| Map* current = this;
|
|
|
| @@ -2492,6 +2492,16 @@ Handle<Map> Map::ReconfigureProperty(Handle<Map> old_map, int modify_index,
|
| new_kind, new_attributes,
|
| "GenAll_NotEquivalent");
|
| }
|
| +
|
| + ElementsKind from_kind = root_map->elements_kind();
|
| + ElementsKind to_kind = old_map->elements_kind();
|
| + if (from_kind != to_kind &&
|
| + !(IsTransitionableFastElementsKind(from_kind) &&
|
| + IsMoreGeneralElementsKindTransition(from_kind, to_kind))) {
|
| + return CopyGeneralizeAllRepresentations(old_map, modify_index, store_mode,
|
| + new_kind, new_attributes,
|
| + "GenAll_InvalidElementsTransition");
|
| + }
|
| int root_nof = root_map->NumberOfOwnDescriptors();
|
| if (modify_index >= 0 && modify_index < root_nof) {
|
| PropertyDetails old_details = old_descriptors->GetDetails(modify_index);
|
| @@ -2511,6 +2521,11 @@ Handle<Map> Map::ReconfigureProperty(Handle<Map> old_map, int modify_index,
|
| }
|
| }
|
|
|
| + // From here on, use the map with correct elements kind as root map.
|
| + if (from_kind != to_kind) {
|
| + root_map = Map::AsElementsKind(root_map, to_kind);
|
| + }
|
| +
|
| Handle<Map> target_map = root_map;
|
| for (int i = root_nof; i < old_nof; ++i) {
|
| PropertyDetails old_details = old_descriptors->GetDetails(i);
|
| @@ -9666,13 +9681,13 @@ int Map::Hash() {
|
|
|
|
|
| static bool CheckEquivalent(Map* first, Map* second) {
|
| - return
|
| - first->constructor() == second->constructor() &&
|
| - first->prototype() == second->prototype() &&
|
| - first->instance_type() == second->instance_type() &&
|
| - first->bit_field() == second->bit_field() &&
|
| - first->bit_field2() == second->bit_field2() &&
|
| - first->has_instance_call_handler() == second->has_instance_call_handler();
|
| + return first->constructor() == second->constructor() &&
|
| + first->prototype() == second->prototype() &&
|
| + first->instance_type() == second->instance_type() &&
|
| + first->bit_field() == second->bit_field() &&
|
| + first->is_extensible() == second->is_extensible() &&
|
| + first->has_instance_call_handler() ==
|
| + second->has_instance_call_handler();
|
| }
|
|
|
|
|
| @@ -9685,7 +9700,8 @@ bool Map::EquivalentToForNormalization(Map* other,
|
| PropertyNormalizationMode mode) {
|
| int properties = mode == CLEAR_INOBJECT_PROPERTIES
|
| ? 0 : other->inobject_properties();
|
| - return CheckEquivalent(this, other) && inobject_properties() == properties;
|
| + return CheckEquivalent(this, other) && bit_field2() == other->bit_field2() &&
|
| + inobject_properties() == properties;
|
| }
|
|
|
|
|
|
|