Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index 65b1524b981933a6a829a4fe084918bddd0e16ff..3173b3b390dbc10ee2e2b1bf57c9242966d44f10 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -3046,7 +3046,7 @@ void Map::UpdateFieldType(int descriptor, Handle<Name> name, |
} |
-bool FieldTypeIsCleared(Representation rep, Handle<HeapType> type) { |
+bool FieldTypeIsCleared(Representation rep, HeapType* type) { |
return type->Is(HeapType::None()) && rep.IsHeapObject(); |
} |
@@ -3060,7 +3060,7 @@ Handle<HeapType> Map::GeneralizeFieldType(Representation rep1, |
// Cleared field types need special treatment. They represent lost knowledge, |
// so we must be conservative, so their generalization with any other type |
// is "Any". |
- if (FieldTypeIsCleared(rep1, type1) || FieldTypeIsCleared(rep2, type2)) { |
+ if (FieldTypeIsCleared(rep1, *type1) || FieldTypeIsCleared(rep2, *type2)) { |
return HeapType::Any(isolate); |
} |
if (type1->NowIs(type2)) return type2; |
@@ -3083,7 +3083,7 @@ void Map::GeneralizeFieldType(Handle<Map> map, int modify_index, |
isolate); |
if (old_representation.Equals(new_representation) && |
- !FieldTypeIsCleared(new_representation, new_field_type) && |
+ !FieldTypeIsCleared(new_representation, *new_field_type) && |
// Checking old_field_type for being cleared is not necessary because |
// the NowIs check below would fail anyway in that case. |
new_field_type->NowIs(old_field_type)) { |
@@ -3735,10 +3735,16 @@ MaybeHandle<Map> Map::TryUpdate(Handle<Map> old_map) { |
switch (new_details.type()) { |
case DATA: { |
HeapType* new_type = new_descriptors->GetFieldType(i); |
+ // Cleared field types need special treatment. They represent lost |
+ // knowledge, so we must first generalize the old_type to "Any". |
+ if (!FieldTypeIsCleared(new_details.representation(), new_type)) { |
+ return MaybeHandle<Map>(); |
+ } |
PropertyType old_property_type = old_details.type(); |
if (old_property_type == DATA) { |
HeapType* old_type = old_descriptors->GetFieldType(i); |
- if (!old_type->NowIs(new_type)) { |
+ if (FieldTypeIsCleared(old_details.representation(), old_type) || |
+ !old_type->NowIs(new_type)) { |
return MaybeHandle<Map>(); |
} |
} else { |