Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index 4ddbdd8a5f9ff91329614d660006beb861c5b18a..f7a614affdc0add4f15525900fc1d5007d08dd4d 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -3368,8 +3368,8 @@ MaybeHandle<Map> Map::CopyWithField(Handle<Map> map, Handle<Name> name, |
Handle<Object> wrapped_type(WrapFieldType(type)); |
- Descriptor d = Descriptor::DataField(name, index, wrapped_type, attributes, |
- representation); |
+ Descriptor d = Descriptor::DataField(name, index, attributes, kMutable, |
+ representation, wrapped_type); |
Handle<Map> new_map = Map::CopyAddDescriptor(map, &d, flag); |
int unused_property_fields = new_map->unused_property_fields() - 1; |
if (unused_property_fields < 0) { |
@@ -4070,8 +4070,8 @@ void Map::UpdateFieldType(int descriptor, Handle<Name> name, |
// Skip if already updated the shared descriptor. |
if (descriptors->GetValue(descriptor) != *new_wrapped_type) { |
Descriptor d = Descriptor::DataField( |
- name, descriptors->GetFieldIndex(descriptor), new_wrapped_type, |
- details.attributes(), new_representation); |
+ name, descriptors->GetFieldIndex(descriptor), details.attributes(), |
+ kMutable, new_representation, new_wrapped_type); |
descriptors->Replace(descriptor, &d); |
} |
} |
@@ -4238,6 +4238,10 @@ Map* Map::TryReplayPropertyTransitions(Map* old_map) { |
PropertyDetails new_details = new_descriptors->GetDetails(i); |
DCHECK_EQ(old_details.kind(), new_details.kind()); |
DCHECK_EQ(old_details.attributes(), new_details.attributes()); |
+ if (!IsGeneralizableTo(old_details.constness(), new_details.constness())) { |
+ return nullptr; |
+ } |
+ DCHECK(IsGeneralizableTo(old_details.location(), new_details.location())); |
if (!old_details.representation().fits_into(new_details.representation())) { |
return nullptr; |
} |
@@ -5755,6 +5759,8 @@ void JSObject::MigrateSlowToFast(Handle<JSObject> object, |
Object* value = dictionary->ValueAt(index); |
PropertyDetails details = dictionary->DetailsAt(index); |
+ DCHECK_EQ(kField, details.location()); |
+ DCHECK_EQ(kMutable, details.constness()); |
int enumeration_index = details.dictionary_index(); |
Descriptor d; |
@@ -9133,6 +9139,7 @@ namespace { |
bool CanHoldValue(DescriptorArray* descriptors, int descriptor, Object* value) { |
PropertyDetails details = descriptors->GetDetails(descriptor); |
if (details.location() == kField) { |
+ DCHECK_EQ(kMutable, details.constness()); |
if (details.kind() == kData) { |
return value->FitsRepresentation(details.representation()) && |
descriptors->GetFieldType(descriptor)->NowContains(value); |
@@ -9144,6 +9151,7 @@ bool CanHoldValue(DescriptorArray* descriptors, int descriptor, Object* value) { |
} else { |
DCHECK_EQ(kDescriptor, details.location()); |
+ DCHECK_EQ(kConst, details.constness()); |
if (details.kind() == kData) { |
DCHECK(descriptors->GetValue(descriptor) != value || |
value->FitsRepresentation(details.representation())); |