| Index: src/objects.cc
|
| diff --git a/src/objects.cc b/src/objects.cc
|
| index c6d5daaa7d42e49a653f9861224aad0a0244b944..8a1b3c6a96117cca489cc042276fd01a9c4c0400 100644
|
| --- a/src/objects.cc
|
| +++ b/src/objects.cc
|
| @@ -2866,29 +2866,35 @@ MaybeHandle<Map> Map::TryUpdateInternal(Handle<Map> old_map) {
|
| DescriptorArray* new_descriptors = new_map->instance_descriptors();
|
|
|
| PropertyDetails new_details = new_descriptors->GetDetails(i);
|
| - if (old_details.attributes() != new_details.attributes() ||
|
| - !old_details.representation().fits_into(new_details.representation())) {
|
| + DCHECK_EQ(old_details.kind(), new_details.kind());
|
| + DCHECK_EQ(old_details.attributes(), new_details.attributes());
|
| + if (!old_details.representation().fits_into(new_details.representation())) {
|
| return MaybeHandle<Map>();
|
| }
|
| - PropertyType new_type = new_details.type();
|
| - PropertyType old_type = old_details.type();
|
| Object* new_value = new_descriptors->GetValue(i);
|
| Object* old_value = old_descriptors->GetValue(i);
|
| - switch (new_type) {
|
| - case FIELD:
|
| - if ((old_type == FIELD &&
|
| - !HeapType::cast(old_value)->NowIs(HeapType::cast(new_value))) ||
|
| - (old_type == CONSTANT &&
|
| - !HeapType::cast(new_value)->NowContains(old_value)) ||
|
| - (old_type == CALLBACKS &&
|
| - !HeapType::Any()->Is(HeapType::cast(new_value)))) {
|
| - return MaybeHandle<Map>();
|
| + switch (new_details.type()) {
|
| + case FIELD: {
|
| + PropertyType old_type = old_details.type();
|
| + if (old_type == FIELD) {
|
| + if (!HeapType::cast(old_value)->NowIs(HeapType::cast(new_value))) {
|
| + return MaybeHandle<Map>();
|
| + }
|
| + } else {
|
| + DCHECK(old_type == CONSTANT);
|
| + if (!HeapType::cast(new_value)->NowContains(old_value)) {
|
| + return MaybeHandle<Map>();
|
| + }
|
| }
|
| break;
|
| + }
|
| + case ACCESSOR_FIELD:
|
| + DCHECK(HeapType::Any()->Is(HeapType::cast(new_value)));
|
| + break;
|
|
|
| case CONSTANT:
|
| case CALLBACKS:
|
| - if (old_type != new_type || old_value != new_value) {
|
| + if (old_details.location() == IN_OBJECT || old_value != new_value) {
|
| return MaybeHandle<Map>();
|
| }
|
| break;
|
| @@ -4365,16 +4371,15 @@ void JSObject::MigrateFastToSlow(Handle<JSObject> object,
|
| Handle<DescriptorArray> descs(map->instance_descriptors());
|
| for (int i = 0; i < real_size; i++) {
|
| PropertyDetails details = descs->GetDetails(i);
|
| + Handle<Name> key(descs->GetKey(i));
|
| switch (details.type()) {
|
| case CONSTANT: {
|
| - Handle<Name> key(descs->GetKey(i));
|
| Handle<Object> value(descs->GetConstant(i), isolate);
|
| PropertyDetails d(details.attributes(), FIELD, i + 1);
|
| dictionary = NameDictionary::Add(dictionary, key, value, d);
|
| break;
|
| }
|
| case FIELD: {
|
| - Handle<Name> key(descs->GetKey(i));
|
| FieldIndex index = FieldIndex::ForDescriptor(*map, i);
|
| Handle<Object> value;
|
| if (object->IsUnboxedDoubleField(index)) {
|
| @@ -4392,8 +4397,14 @@ void JSObject::MigrateFastToSlow(Handle<JSObject> object,
|
| dictionary = NameDictionary::Add(dictionary, key, value, d);
|
| break;
|
| }
|
| + case ACCESSOR_FIELD: {
|
| + FieldIndex index = FieldIndex::ForDescriptor(*map, i);
|
| + Handle<Object> value(object->RawFastPropertyAt(index), isolate);
|
| + PropertyDetails d(details.attributes(), CALLBACKS, i + 1);
|
| + dictionary = NameDictionary::Add(dictionary, key, value, d);
|
| + break;
|
| + }
|
| case CALLBACKS: {
|
| - Handle<Name> key(descs->GetKey(i));
|
| Handle<Object> value(descs->GetCallbacksObject(i), isolate);
|
| PropertyDetails d(details.attributes(), CALLBACKS, i + 1);
|
| dictionary = NameDictionary::Add(dictionary, key, value, d);
|
| @@ -7064,6 +7075,7 @@ bool DescriptorArray::CanHoldValue(int descriptor, Object* value) {
|
| value->FitsRepresentation(details.representation()));
|
| return GetConstant(descriptor) == value;
|
|
|
| + case ACCESSOR_FIELD:
|
| case CALLBACKS:
|
| return false;
|
| }
|
| @@ -7189,7 +7201,7 @@ Handle<Map> Map::TransitionToAccessorProperty(Handle<Map> map,
|
| int descriptor = transition->LastAdded();
|
| DCHECK(descriptors->GetKey(descriptor)->Equals(*name));
|
|
|
| - DCHECK_EQ(CALLBACKS, descriptors->GetDetails(descriptor).type());
|
| + DCHECK_EQ(ACCESSOR, descriptors->GetDetails(descriptor).kind());
|
| DCHECK_EQ(attributes, descriptors->GetDetails(descriptor).attributes());
|
|
|
| Handle<Object> maybe_pair(descriptors->GetValue(descriptor), isolate);
|
|
|