| Index: src/objects.cc
|
| ===================================================================
|
| --- src/objects.cc (revision 1458)
|
| +++ src/objects.cc (working copy)
|
| @@ -2391,7 +2391,7 @@
|
| int Map::NumberOfDescribedProperties() {
|
| int result = 0;
|
| for (DescriptorReader r(instance_descriptors()); !r.eos(); r.advance()) {
|
| - if (!r.IsTransition()) result++;
|
| + if (r.IsProperty()) result++;
|
| }
|
| return result;
|
| }
|
| @@ -2399,7 +2399,7 @@
|
|
|
| int Map::PropertyIndexFor(String* name) {
|
| for (DescriptorReader r(instance_descriptors()); !r.eos(); r.advance()) {
|
| - if (r.Equals(name)) return r.GetFieldIndex();
|
| + if (r.Equals(name) && !r.IsNullDescriptor()) return r.GetFieldIndex();
|
| }
|
| return -1;
|
| }
|
| @@ -2933,6 +2933,7 @@
|
| int new_size = number_of_descriptors() - transitions - null_descriptors;
|
|
|
| // If key is in descriptor, we replace it in-place when filtering.
|
| + // Count a null descriptor for key as inserted, not replaced.
|
| int index = Search(descriptor->GetKey());
|
| const bool inserting = (index == kNotFound);
|
| const bool replacing = !inserting;
|
| @@ -2949,9 +2950,9 @@
|
| t == CALLBACKS ||
|
| t == INTERCEPTOR) {
|
| keep_enumeration_index = true;
|
| - } else if (t == NULL_DESCRIPTOR || remove_transitions) {
|
| - // Replaced descriptor has been counted as removed if it is null
|
| - // or a transition that will be replaced. Adjust count in this case.
|
| + } else if (remove_transitions) {
|
| + // Replaced descriptor has been counted as removed if it is
|
| + // a transition that will be replaced. Adjust count in this case.
|
| ++new_size;
|
| }
|
| }
|
| @@ -2990,7 +2991,9 @@
|
| ASSERT(r.GetKey() == descriptor->GetKey());
|
| r.advance();
|
| } else {
|
| - ASSERT(r.eos() || r.GetKey()->Hash() > descriptor_hash);
|
| + ASSERT(r.eos() ||
|
| + r.GetKey()->Hash() > descriptor_hash ||
|
| + r.IsNullDescriptor());
|
| }
|
| for (; !r.eos(); r.advance()) {
|
| if (r.IsNullDescriptor()) continue;
|
| @@ -3004,24 +3007,25 @@
|
|
|
|
|
| Object* DescriptorArray::RemoveTransitions() {
|
| - // Remove all transitions. Return a copy of the array with all transitions
|
| - // removed, or a Failure object if the new array could not be allocated.
|
| + // Remove all transitions and null descriptors. Return a copy of the array
|
| + // with all transitions removed, or a Failure object if the new array could
|
| + // not be allocated.
|
|
|
| // Compute the size of the map transition entries to be removed.
|
| - int count_transitions = 0;
|
| + int num_removed = 0;
|
| for (DescriptorReader r(this); !r.eos(); r.advance()) {
|
| - if (r.IsTransition()) count_transitions++;
|
| + if (!r.IsProperty()) num_removed++;
|
| }
|
|
|
| // Allocate the new descriptor array.
|
| - Object* result = Allocate(number_of_descriptors() - count_transitions);
|
| + Object* result = Allocate(number_of_descriptors() - num_removed);
|
| if (result->IsFailure()) return result;
|
| DescriptorArray* new_descriptors = DescriptorArray::cast(result);
|
|
|
| // Copy the content.
|
| DescriptorWriter w(new_descriptors);
|
| for (DescriptorReader r(this); !r.eos(); r.advance()) {
|
| - if (!r.IsTransition()) w.WriteFrom(&r);
|
| + if (r.IsProperty()) w.WriteFrom(&r);
|
| }
|
| ASSERT(w.eos());
|
|
|
| @@ -3097,10 +3101,10 @@
|
| ASSERT(hash == mid_hash);
|
| // There might be more, so we find the first one and
|
| // check them all to see if we have a match.
|
| - if (name == mid_name) return mid;
|
| + if (name == mid_name && !is_null_descriptor(mid)) return mid;
|
| while ((mid > low) && (GetKey(mid - 1)->Hash() == hash)) mid--;
|
| for (; (mid <= high) && (GetKey(mid)->Hash() == hash); mid++) {
|
| - if (GetKey(mid)->Equals(name)) return mid;
|
| + if (GetKey(mid)->Equals(name) && !is_null_descriptor(mid)) return mid;
|
| }
|
| break;
|
| }
|
| @@ -3110,7 +3114,9 @@
|
|
|
| int DescriptorArray::LinearSearch(String* name, int len) {
|
| for (int number = 0; number < len; number++) {
|
| - if (name->Equals(GetKey(number))) return number;
|
| + if (name->Equals(GetKey(number)) && !is_null_descriptor(number)) {
|
| + return number;
|
| + }
|
| }
|
| return kNotFound;
|
| }
|
| @@ -5643,7 +5649,8 @@
|
| !r.eos();
|
| r.advance()) {
|
| PropertyDetails details = r.GetDetails();
|
| - if (!details.IsTransition() && (details.attributes() & filter) == 0) {
|
| + if (details.IsProperty() &&
|
| + (details.attributes() & filter) == 0) {
|
| result++;
|
| }
|
| }
|
| @@ -5785,7 +5792,7 @@
|
| for (DescriptorReader r(map()->instance_descriptors());
|
| !r.eos();
|
| r.advance()) {
|
| - if (!r.IsTransition()) {
|
| + if (r.IsProperty()) {
|
| storage->set(index++, r.GetKey());
|
| }
|
| }
|
|
|