| Index: src/objects.cc
|
| diff --git a/src/objects.cc b/src/objects.cc
|
| index f5fa70948e9ac3a7a9836ba1c5f0c26d5ee1987c..d12eceda219fd3cbf91b1d4d13ee337b521a326e 100644
|
| --- a/src/objects.cc
|
| +++ b/src/objects.cc
|
| @@ -2771,9 +2771,9 @@ MaybeObject* JSObject::SetPropertyForResult(LookupResult* result,
|
| strict_mode);
|
| case TRANSITION: {
|
| Map* transition_map = result->GetTransitionTarget();
|
| + int descriptor = transition_map->LastAdded();
|
|
|
| DescriptorArray* descriptors = transition_map->instance_descriptors();
|
| - int descriptor = descriptors->LastAdded();
|
| PropertyDetails details = descriptors->GetDetails(descriptor);
|
|
|
| if (details.type() == FIELD) {
|
| @@ -2892,9 +2892,9 @@ MaybeObject* JSObject::SetLocalPropertyIgnoreAttributes(
|
| return ConvertDescriptorToField(name, value, attributes);
|
| case TRANSITION: {
|
| Map* transition_map = result.GetTransitionTarget();
|
| + int descriptor = transition_map->LastAdded();
|
|
|
| DescriptorArray* descriptors = transition_map->instance_descriptors();
|
| - int descriptor = descriptors->LastAdded();
|
| PropertyDetails details = descriptors->GetDetails(descriptor);
|
|
|
| if (details.type() == FIELD) {
|
| @@ -3080,17 +3080,16 @@ MaybeObject* NormalizedMapCache::Get(JSObject* obj,
|
| // except for the code cache, which can contain some ics which can be
|
| // applied to the shared map.
|
| Object* fresh;
|
| - { MaybeObject* maybe_fresh =
|
| - fast->CopyNormalized(mode, SHARED_NORMALIZED_MAP);
|
| - if (maybe_fresh->ToObject(&fresh)) {
|
| - ASSERT(memcmp(Map::cast(fresh)->address(),
|
| - Map::cast(result)->address(),
|
| - Map::kCodeCacheOffset) == 0);
|
| - int offset = Map::kCodeCacheOffset + kPointerSize;
|
| - ASSERT(memcmp(Map::cast(fresh)->address() + offset,
|
| - Map::cast(result)->address() + offset,
|
| - Map::kSize - offset) == 0);
|
| - }
|
| + MaybeObject* maybe_fresh =
|
| + fast->CopyNormalized(mode, SHARED_NORMALIZED_MAP);
|
| + if (maybe_fresh->ToObject(&fresh)) {
|
| + ASSERT(memcmp(Map::cast(fresh)->address(),
|
| + Map::cast(result)->address(),
|
| + Map::kCodeCacheOffset) == 0);
|
| + int offset = Map::kCodeCacheOffset + kPointerSize;
|
| + ASSERT(memcmp(Map::cast(fresh)->address() + offset,
|
| + Map::cast(result)->address() + offset,
|
| + Map::kSize - offset) == 0);
|
| }
|
| }
|
| #endif
|
| @@ -4496,7 +4495,7 @@ MaybeObject* JSObject::DefineFastAccessor(String* name,
|
| // If there is a transition, try to follow it.
|
| if (result.IsFound()) {
|
| Map* target = result.GetTransitionTarget();
|
| - int descriptor_number = target->instance_descriptors()->LastAdded();
|
| + int descriptor_number = target->LastAdded();
|
| ASSERT(target->instance_descriptors()->GetKey(descriptor_number) == name);
|
| return TryAccessorTransition(
|
| this, target, descriptor_number, component, accessor, attributes);
|
| @@ -4711,14 +4710,14 @@ MaybeObject* Map::CopyNormalized(PropertyNormalizationMode mode,
|
| }
|
|
|
| Map* result;
|
| - { MaybeObject* maybe_result = RawCopy(new_instance_size);
|
| - if (!maybe_result->To(&result)) return maybe_result;
|
| - }
|
| + MaybeObject* maybe_result = RawCopy(new_instance_size);
|
| + if (!maybe_result->To(&result)) return maybe_result;
|
|
|
| if (mode != CLEAR_INOBJECT_PROPERTIES) {
|
| result->set_inobject_properties(inobject_properties());
|
| }
|
|
|
| + result->SetLastAdded(kNoneAdded);
|
| result->set_code_cache(code_cache());
|
| result->set_is_shared(sharing == SHARED_NORMALIZED_MAP);
|
|
|
| @@ -4756,15 +4755,15 @@ MaybeObject* Map::CopyReplaceDescriptors(DescriptorArray* descriptors,
|
| MaybeObject* maybe_result = CopyDropDescriptors();
|
| if (!maybe_result->To(&result)) return maybe_result;
|
|
|
| - if (last_added == DescriptorArray::kNoneAdded) {
|
| + if (last_added == kNoneAdded) {
|
| ASSERT(descriptors->IsEmpty());
|
| - ASSERT(flag == OMIT_TRANSITION);
|
| - return result;
|
| + } else {
|
| + ASSERT(descriptors->GetDetails(last_added).index() ==
|
| + descriptors->number_of_descriptors());
|
| + result->set_instance_descriptors(descriptors);
|
| + result->SetLastAdded(last_added);
|
| }
|
|
|
| - descriptors->SetLastAdded(last_added);
|
| - result->set_instance_descriptors(descriptors);
|
| -
|
| if (flag == INSERT_TRANSITION) {
|
| TransitionArray* transitions;
|
| MaybeObject* maybe_transitions = AddTransition(name, result);
|
| @@ -4823,8 +4822,8 @@ MaybeObject* Map::CopyWithPreallocatedFieldDescriptors() {
|
| if (!maybe_descriptors->To(&descriptors)) return maybe_descriptors;
|
|
|
| int last_added = initial_descriptors->IsEmpty()
|
| - ? DescriptorArray::kNoneAdded
|
| - : initial_descriptors->LastAdded();
|
| + ? kNoneAdded
|
| + : initial_map->LastAdded();
|
|
|
| return CopyReplaceDescriptors(descriptors, NULL, last_added, OMIT_TRANSITION);
|
| }
|
| @@ -4836,9 +4835,7 @@ MaybeObject* Map::Copy(DescriptorArray::SharedMode shared_mode) {
|
| MaybeObject* maybe_descriptors = source_descriptors->Copy(shared_mode);
|
| if (!maybe_descriptors->To(&descriptors)) return maybe_descriptors;
|
|
|
| - int last_added = source_descriptors->IsEmpty()
|
| - ? DescriptorArray::kNoneAdded
|
| - : source_descriptors->LastAdded();
|
| + int last_added = source_descriptors->IsEmpty() ? kNoneAdded : LastAdded();
|
|
|
| return CopyReplaceDescriptors(descriptors, NULL, last_added, OMIT_TRANSITION);
|
| }
|
| @@ -4944,8 +4941,7 @@ MaybeObject* Map::CopyReplaceDescriptor(Descriptor* descriptor,
|
|
|
| SLOW_ASSERT(new_descriptors->IsSortedNoDuplicates());
|
|
|
| - return CopyReplaceDescriptors(
|
| - new_descriptors, key, descriptors->LastAdded(), flag);
|
| + return CopyReplaceDescriptors(new_descriptors, key, LastAdded(), flag);
|
| }
|
|
|
|
|
| @@ -5732,7 +5728,7 @@ MaybeObject* DescriptorArray::Allocate(int number_of_descriptors,
|
| if (!maybe_array->To(&result)) return maybe_array;
|
| }
|
|
|
| - result->set(kLastAddedIndex, Smi::FromInt(kNoneAdded));
|
| + result->set(kEnumCacheIndex, Smi::FromInt(Map::kNoneAdded));
|
| result->set(kTransitionsIndex, Smi::FromInt(0));
|
| return result;
|
| }
|
| @@ -5744,9 +5740,9 @@ void DescriptorArray::SetEnumCache(FixedArray* bridge_storage,
|
| ASSERT(bridge_storage->length() >= kEnumCacheBridgeLength);
|
| ASSERT(new_index_cache->IsSmi() || new_index_cache->IsFixedArray());
|
| if (HasEnumCache()) {
|
| - FixedArray::cast(get(kLastAddedIndex))->
|
| + FixedArray::cast(get(kEnumCacheIndex))->
|
| set(kEnumCacheBridgeCacheIndex, new_cache);
|
| - FixedArray::cast(get(kLastAddedIndex))->
|
| + FixedArray::cast(get(kEnumCacheIndex))->
|
| set(kEnumCacheBridgeIndicesCacheIndex, new_index_cache);
|
| } else {
|
| if (IsEmpty()) return; // Do nothing for empty descriptor array.
|
| @@ -5756,8 +5752,8 @@ void DescriptorArray::SetEnumCache(FixedArray* bridge_storage,
|
| set(kEnumCacheBridgeIndicesCacheIndex, new_index_cache);
|
| NoWriteBarrierSet(FixedArray::cast(bridge_storage),
|
| kEnumCacheBridgeLastAdded,
|
| - get(kLastAddedIndex));
|
| - set(kLastAddedIndex, bridge_storage);
|
| + get(kEnumCacheIndex));
|
| + set(kEnumCacheIndex, bridge_storage);
|
| }
|
| }
|
|
|
| @@ -7226,8 +7222,10 @@ bool Map::EquivalentToForNormalization(Map* other,
|
| instance_type() == other->instance_type() &&
|
| bit_field() == other->bit_field() &&
|
| bit_field2() == other->bit_field2() &&
|
| - (bit_field3() & ~(1<<Map::kIsShared)) ==
|
| - (other->bit_field3() & ~(1<<Map::kIsShared));
|
| + static_cast<uint32_t>(bit_field3()) ==
|
| + LastAddedBits::update(
|
| + IsShared::update(other->bit_field3(), true),
|
| + kNoneAdded);
|
| }
|
|
|
|
|
|
|