OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 5712 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5723 FixedArray::cast(bridge_storage)-> | 5723 FixedArray::cast(bridge_storage)-> |
5724 set(kEnumCacheBridgeCacheIndex, new_cache); | 5724 set(kEnumCacheBridgeCacheIndex, new_cache); |
5725 NoWriteBarrierSet(FixedArray::cast(bridge_storage), | 5725 NoWriteBarrierSet(FixedArray::cast(bridge_storage), |
5726 kEnumCacheBridgeEnumIndex, | 5726 kEnumCacheBridgeEnumIndex, |
5727 get(kEnumerationIndexIndex)); | 5727 get(kEnumerationIndexIndex)); |
5728 set(kEnumerationIndexIndex, bridge_storage); | 5728 set(kEnumerationIndexIndex, bridge_storage); |
5729 } | 5729 } |
5730 } | 5730 } |
5731 | 5731 |
5732 | 5732 |
| 5733 static bool InsertionPointFound(String* key1, String* key2) { |
| 5734 return key1->Hash() > key2->Hash() || key1 == key2; |
| 5735 } |
| 5736 |
| 5737 |
5733 MaybeObject* DescriptorArray::CopyInsert(Descriptor* descriptor, | 5738 MaybeObject* DescriptorArray::CopyInsert(Descriptor* descriptor, |
5734 TransitionFlag transition_flag) { | 5739 TransitionFlag transition_flag) { |
5735 // Transitions are only kept when inserting another transition. | 5740 // Transitions are only kept when inserting another transition. |
5736 // This precondition is not required by this function's implementation, but | 5741 // This precondition is not required by this function's implementation, but |
5737 // is currently required by the semantics of maps, so we check it. | 5742 // is currently required by the semantics of maps, so we check it. |
5738 // Conversely, we filter after replacing, so replacing a transition and | 5743 // Conversely, we filter after replacing, so replacing a transition and |
5739 // removing all other transitions is not supported. | 5744 // removing all other transitions is not supported. |
5740 bool remove_transitions = transition_flag == REMOVE_TRANSITIONS; | 5745 bool remove_transitions = transition_flag == REMOVE_TRANSITIONS; |
5741 ASSERT(remove_transitions == !descriptor->ContainsTransition()); | 5746 ASSERT(remove_transitions == !descriptor->ContainsTransition()); |
5742 ASSERT(descriptor->GetDetails().type() != NULL_DESCRIPTOR); | 5747 ASSERT(descriptor->GetDetails().type() != NULL_DESCRIPTOR); |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5795 PropertyDetails(GetDetails(index)).index()); | 5800 PropertyDetails(GetDetails(index)).index()); |
5796 } else { | 5801 } else { |
5797 descriptor->SetEnumerationIndex(enumeration_index); | 5802 descriptor->SetEnumerationIndex(enumeration_index); |
5798 ++enumeration_index; | 5803 ++enumeration_index; |
5799 } | 5804 } |
5800 } | 5805 } |
5801 new_descriptors->SetNextEnumerationIndex(enumeration_index); | 5806 new_descriptors->SetNextEnumerationIndex(enumeration_index); |
5802 | 5807 |
5803 // Copy the descriptors, filtering out transitions and null descriptors, | 5808 // Copy the descriptors, filtering out transitions and null descriptors, |
5804 // and inserting or replacing a descriptor. | 5809 // and inserting or replacing a descriptor. |
5805 uint32_t descriptor_hash = descriptor->GetKey()->Hash(); | 5810 int to_index = 0; |
| 5811 int insertion_index = -1; |
5806 int from_index = 0; | 5812 int from_index = 0; |
5807 int to_index = 0; | 5813 while (from_index < number_of_descriptors()) { |
5808 | 5814 if (insertion_index < 0 && |
5809 for (; from_index < number_of_descriptors(); from_index++) { | 5815 InsertionPointFound(GetKey(from_index), descriptor->GetKey())) { |
5810 String* key = GetKey(from_index); | 5816 insertion_index = to_index++; |
5811 if (key->Hash() > descriptor_hash || key == descriptor->GetKey()) { | 5817 if (replacing) from_index++; |
5812 break; | 5818 } else { |
| 5819 if (!(IsNullDescriptor(from_index) || |
| 5820 (remove_transitions && IsTransitionOnly(from_index)))) { |
| 5821 new_descriptors->CopyFrom(to_index++, this, from_index, witness); |
| 5822 } |
| 5823 from_index++; |
5813 } | 5824 } |
5814 if (IsNullDescriptor(from_index)) continue; | |
5815 if (remove_transitions && IsTransitionOnly(from_index)) continue; | |
5816 new_descriptors->CopyFrom(to_index++, this, from_index, witness); | |
5817 } | 5825 } |
5818 | 5826 if (insertion_index < 0) insertion_index = to_index++; |
5819 new_descriptors->Set(to_index++, descriptor, witness); | 5827 new_descriptors->Set(insertion_index, descriptor, witness); |
5820 if (replacing) from_index++; | |
5821 | |
5822 for (; from_index < number_of_descriptors(); from_index++) { | |
5823 if (IsNullDescriptor(from_index)) continue; | |
5824 if (remove_transitions && IsTransitionOnly(from_index)) continue; | |
5825 new_descriptors->CopyFrom(to_index++, this, from_index, witness); | |
5826 } | |
5827 | 5828 |
5828 ASSERT(to_index == new_descriptors->number_of_descriptors()); | 5829 ASSERT(to_index == new_descriptors->number_of_descriptors()); |
5829 SLOW_ASSERT(new_descriptors->IsSortedNoDuplicates()); | 5830 SLOW_ASSERT(new_descriptors->IsSortedNoDuplicates()); |
5830 | 5831 |
5831 return new_descriptors; | 5832 return new_descriptors; |
5832 } | 5833 } |
5833 | 5834 |
5834 | 5835 |
5835 MaybeObject* DescriptorArray::RemoveTransitions() { | 5836 MaybeObject* DescriptorArray::RemoveTransitions() { |
5836 // Remove all transitions and null descriptors. Return a copy of the array | 5837 // Remove all transitions and null descriptors. Return a copy of the array |
(...skipping 7196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13033 if (break_point_objects()->IsUndefined()) return 0; | 13034 if (break_point_objects()->IsUndefined()) return 0; |
13034 // Single break point. | 13035 // Single break point. |
13035 if (!break_point_objects()->IsFixedArray()) return 1; | 13036 if (!break_point_objects()->IsFixedArray()) return 1; |
13036 // Multiple break points. | 13037 // Multiple break points. |
13037 return FixedArray::cast(break_point_objects())->length(); | 13038 return FixedArray::cast(break_point_objects())->length(); |
13038 } | 13039 } |
13039 #endif // ENABLE_DEBUGGER_SUPPORT | 13040 #endif // ENABLE_DEBUGGER_SUPPORT |
13040 | 13041 |
13041 | 13042 |
13042 } } // namespace v8::internal | 13043 } } // namespace v8::internal |
OLD | NEW |