| Index: src/objects.cc
|
| diff --git a/src/objects.cc b/src/objects.cc
|
| index ba7cdb10f5a3ebd4e06ca10831f8da04d0cedc42..ee0ff5123ab7839fced082347435621321d15f9d 100644
|
| --- a/src/objects.cc
|
| +++ b/src/objects.cc
|
| @@ -2437,6 +2437,7 @@ Map* Map::FindRootMap() {
|
| }
|
|
|
|
|
| +// Returns NULL if the updated map is incompatible.
|
| Map* Map::FindUpdatedMap(int verbatim,
|
| int length,
|
| DescriptorArray* descriptors) {
|
| @@ -2452,6 +2453,17 @@ Map* Map::FindUpdatedMap(int verbatim,
|
| int transition = transitions->Search(name);
|
| if (transition == TransitionArray::kNotFound) break;
|
| current = transitions->GetTarget(transition);
|
| + PropertyDetails details = descriptors->GetDetails(i);
|
| + PropertyDetails target_details =
|
| + current->instance_descriptors()->GetDetails(i);
|
| + if (details.attributes() != target_details.attributes()) return NULL;
|
| + if (details.type() == CALLBACKS) {
|
| + if (target_details.type() != CALLBACKS) return NULL;
|
| + if (descriptors->GetValue(i) !=
|
| + current->instance_descriptors()->GetValue(i)) {
|
| + return NULL;
|
| + }
|
| + }
|
| }
|
|
|
| return current;
|
| @@ -2534,6 +2546,8 @@ MaybeObject* Map::GeneralizeRepresentation(int modify_index,
|
|
|
| Map* updated = root_map->FindUpdatedMap(
|
| verbatim, descriptors, old_descriptors);
|
| + if (updated == NULL) return CopyGeneralizeAllRepresentations();
|
| +
|
| // Check the state of the root map.
|
| DescriptorArray* updated_descriptors = updated->instance_descriptors();
|
|
|
| @@ -7509,19 +7523,13 @@ bool DescriptorArray::IsMoreGeneralThan(int verbatim,
|
| for (int descriptor = verbatim; descriptor < valid; descriptor++) {
|
| PropertyDetails details = GetDetails(descriptor);
|
| PropertyDetails other_details = other->GetDetails(descriptor);
|
| - if (details.type() != other_details.type()) {
|
| - if (details.type() != FIELD ||
|
| - other_details.type() != CONSTANT_FUNCTION) {
|
| - return false;
|
| - }
|
| - } else if (details.type() == CONSTANT_FUNCTION) {
|
| - if (GetValue(descriptor) != other->GetValue(descriptor)) {
|
| - return false;
|
| - }
|
| - } else if (!other_details.representation().fits_into(
|
| - details.representation())) {
|
| + if (!other_details.representation().fits_into(details.representation())) {
|
| return false;
|
| }
|
| + if (details.type() == CONSTANT_FUNCTION) {
|
| + if (other_details.type() != CONSTANT_FUNCTION) return false;
|
| + if (GetValue(descriptor) != other->GetValue(descriptor)) return false;
|
| + }
|
| }
|
|
|
| return true;
|
|
|