| 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 5783 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5794 FixedArray* result; | 5794 FixedArray* result; |
| 5795 if (number_of_descriptors == 0 && shared_mode == MAY_BE_SHARED) { | 5795 if (number_of_descriptors == 0 && shared_mode == MAY_BE_SHARED) { |
| 5796 return heap->empty_descriptor_array(); | 5796 return heap->empty_descriptor_array(); |
| 5797 } | 5797 } |
| 5798 // Allocate the array of keys. | 5798 // Allocate the array of keys. |
| 5799 { MaybeObject* maybe_array = | 5799 { MaybeObject* maybe_array = |
| 5800 heap->AllocateFixedArray(ToKeyIndex(number_of_descriptors)); | 5800 heap->AllocateFixedArray(ToKeyIndex(number_of_descriptors)); |
| 5801 if (!maybe_array->To(&result)) return maybe_array; | 5801 if (!maybe_array->To(&result)) return maybe_array; |
| 5802 } | 5802 } |
| 5803 | 5803 |
| 5804 result->set(kLastAddedIndex, Smi::FromInt(-1)); | 5804 result->set(kLastAddedIndex, Smi::FromInt(kNoneAdded)); |
| 5805 result->set(kTransitionsIndex, Smi::FromInt(0)); | 5805 result->set(kTransitionsIndex, Smi::FromInt(0)); |
| 5806 return result; | 5806 return result; |
| 5807 } | 5807 } |
| 5808 | 5808 |
| 5809 | 5809 |
| 5810 void DescriptorArray::SetEnumCache(FixedArray* bridge_storage, | 5810 void DescriptorArray::SetEnumCache(FixedArray* bridge_storage, |
| 5811 FixedArray* new_cache, | 5811 FixedArray* new_cache, |
| 5812 Object* new_index_cache) { | 5812 Object* new_index_cache) { |
| 5813 ASSERT(bridge_storage->length() >= kEnumCacheBridgeLength); | 5813 ASSERT(bridge_storage->length() >= kEnumCacheBridgeLength); |
| 5814 ASSERT(new_index_cache->IsSmi() || new_index_cache->IsFixedArray()); | 5814 ASSERT(new_index_cache->IsSmi() || new_index_cache->IsFixedArray()); |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5921 | 5921 |
| 5922 int new_size = number_of_descriptors() + 1; | 5922 int new_size = number_of_descriptors() + 1; |
| 5923 | 5923 |
| 5924 DescriptorArray* new_descriptors; | 5924 DescriptorArray* new_descriptors; |
| 5925 { MaybeObject* maybe_result = Allocate(new_size, MAY_BE_SHARED); | 5925 { MaybeObject* maybe_result = Allocate(new_size, MAY_BE_SHARED); |
| 5926 if (!maybe_result->To(&new_descriptors)) return maybe_result; | 5926 if (!maybe_result->To(&new_descriptors)) return maybe_result; |
| 5927 } | 5927 } |
| 5928 | 5928 |
| 5929 FixedArray::WhitenessWitness witness(new_descriptors); | 5929 FixedArray::WhitenessWitness witness(new_descriptors); |
| 5930 | 5930 |
| 5931 descriptor->SetEnumerationIndex(NextEnumerationIndex()); | 5931 ASSERT(new_size == NextEnumerationIndex()); |
| 5932 descriptor->SetEnumerationIndex(new_size); |
| 5932 | 5933 |
| 5933 // Copy the descriptors, inserting or replacing a descriptor. | 5934 // Copy the descriptors, inserting or replacing a descriptor. |
| 5934 int insertion_index = -1; | 5935 int insertion_index = -1; |
| 5935 int to = 0; | 5936 int to = 0; |
| 5936 for (int from = 0; from < number_of_descriptors(); ++from) { | 5937 for (int from = 0; from < number_of_descriptors(); ++from) { |
| 5937 if (insertion_index < 0 && InsertionPointFound(GetKey(from), key)) { | 5938 if (insertion_index < 0 && InsertionPointFound(GetKey(from), key)) { |
| 5938 insertion_index = to++; | 5939 insertion_index = to++; |
| 5939 } | 5940 } |
| 5940 MaybeObject* copy_result = | 5941 MaybeObject* copy_result = |
| 5941 new_descriptors->CopyFrom(to++, this, from, witness); | 5942 new_descriptors->CopyFrom(to++, this, from, witness); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5981 // We need the whiteness witness since sort will reshuffle the entries in the | 5982 // We need the whiteness witness since sort will reshuffle the entries in the |
| 5982 // descriptor array. If the descriptor array were to be black, the shuffling | 5983 // descriptor array. If the descriptor array were to be black, the shuffling |
| 5983 // would move a slot that was already recorded as pointing into an evacuation | 5984 // would move a slot that was already recorded as pointing into an evacuation |
| 5984 // candidate. This would result in missing updates upon evacuation. | 5985 // candidate. This would result in missing updates upon evacuation. |
| 5985 void DescriptorArray::SortUnchecked(const WhitenessWitness& witness) { | 5986 void DescriptorArray::SortUnchecked(const WhitenessWitness& witness) { |
| 5986 // In-place heap sort. | 5987 // In-place heap sort. |
| 5987 int len = number_of_descriptors(); | 5988 int len = number_of_descriptors(); |
| 5988 // Nothing to sort. | 5989 // Nothing to sort. |
| 5989 if (len == 0) return; | 5990 if (len == 0) return; |
| 5990 | 5991 |
| 5992 ASSERT(LastAdded() == kNoneAdded || |
| 5993 GetDetails(LastAdded()).index() == number_of_descriptors()); |
| 5994 |
| 5991 // Bottom-up max-heap construction. | 5995 // Bottom-up max-heap construction. |
| 5992 // Index of the last node with children | 5996 // Index of the last node with children |
| 5993 const int max_parent_index = (len / 2) - 1; | 5997 const int max_parent_index = (len / 2) - 1; |
| 5994 for (int i = max_parent_index; i >= 0; --i) { | 5998 for (int i = max_parent_index; i >= 0; --i) { |
| 5995 int parent_index = i; | 5999 int parent_index = i; |
| 5996 const uint32_t parent_hash = GetKey(i)->Hash(); | 6000 const uint32_t parent_hash = GetKey(i)->Hash(); |
| 5997 while (parent_index <= max_parent_index) { | 6001 while (parent_index <= max_parent_index) { |
| 5998 int child_index = 2 * parent_index + 1; | 6002 int child_index = 2 * parent_index + 1; |
| 5999 uint32_t child_hash = GetKey(child_index)->Hash(); | 6003 uint32_t child_hash = GetKey(child_index)->Hash(); |
| 6000 if (child_index + 1 < len) { | 6004 if (child_index + 1 < len) { |
| (...skipping 27 matching lines...) Expand all Loading... |
| 6028 child_index++; | 6032 child_index++; |
| 6029 child_hash = right_child_hash; | 6033 child_hash = right_child_hash; |
| 6030 } | 6034 } |
| 6031 } | 6035 } |
| 6032 if (child_hash <= parent_hash) break; | 6036 if (child_hash <= parent_hash) break; |
| 6033 NoIncrementalWriteBarrierSwapDescriptors(parent_index, child_index); | 6037 NoIncrementalWriteBarrierSwapDescriptors(parent_index, child_index); |
| 6034 parent_index = child_index; | 6038 parent_index = child_index; |
| 6035 } | 6039 } |
| 6036 } | 6040 } |
| 6037 | 6041 |
| 6038 int last_enum_index = -1; | 6042 #ifdef DEBUG |
| 6039 int last_added = -1; | 6043 // Ensure that all enumeration indexes between 1 and length occur uniquely in |
| 6040 for (int i = 0; i < len; ++i) { | 6044 // the descriptor array. |
| 6041 int current_enum = GetDetails(i).index(); | 6045 for (int i = 1; i <= len; ++i) { |
| 6042 if (current_enum > last_enum_index) { | 6046 int j; |
| 6043 last_added = i; | 6047 for (j = 0; j < len; ++j) { |
| 6044 last_enum_index = current_enum; | 6048 if (GetDetails(j).index() == i) break; |
| 6049 } |
| 6050 ASSERT(j != len); |
| 6051 for (j++; j < len; ++j) { |
| 6052 ASSERT(GetDetails(j).index() != i); |
| 6045 } | 6053 } |
| 6046 } | 6054 } |
| 6047 SetLastAdded(last_added); | 6055 #endif |
| 6048 | 6056 |
| 6049 ASSERT(LastAdded() != -1); | 6057 for (int i = 0; i < len; ++i) { |
| 6058 if (GetDetails(i).index() == len) { |
| 6059 SetLastAdded(i); |
| 6060 return; |
| 6061 } |
| 6062 } |
| 6063 |
| 6064 UNREACHABLE(); |
| 6050 } | 6065 } |
| 6051 | 6066 |
| 6052 | 6067 |
| 6053 void DescriptorArray::Sort(const WhitenessWitness& witness) { | 6068 void DescriptorArray::Sort(const WhitenessWitness& witness) { |
| 6054 SortUnchecked(witness); | 6069 SortUnchecked(witness); |
| 6055 SLOW_ASSERT(IsSortedNoDuplicates()); | 6070 SLOW_ASSERT(IsSortedNoDuplicates()); |
| 6056 } | 6071 } |
| 6057 | 6072 |
| 6058 | 6073 |
| 6059 MaybeObject* AccessorPair::CopyWithoutTransitions() { | 6074 MaybeObject* AccessorPair::CopyWithoutTransitions() { |
| (...skipping 7238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13298 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); | 13313 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); |
| 13299 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); | 13314 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); |
| 13300 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); | 13315 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); |
| 13301 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); | 13316 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); |
| 13302 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); | 13317 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); |
| 13303 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); | 13318 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); |
| 13304 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); | 13319 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); |
| 13305 } | 13320 } |
| 13306 | 13321 |
| 13307 } } // namespace v8::internal | 13322 } } // namespace v8::internal |
| OLD | NEW |