| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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 14659 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 14670 return entry; | 14670 return entry; |
| 14671 } | 14671 } |
| 14672 ASSERT(element->IsTheHole() || !Name::cast(element)->Equals(*key)); | 14672 ASSERT(element->IsTheHole() || !Name::cast(element)->Equals(*key)); |
| 14673 entry = NextProbe(entry, count++, capacity); | 14673 entry = NextProbe(entry, count++, capacity); |
| 14674 } | 14674 } |
| 14675 return kNotFound; | 14675 return kNotFound; |
| 14676 } | 14676 } |
| 14677 | 14677 |
| 14678 | 14678 |
| 14679 template<typename Derived, typename Shape, typename Key> | 14679 template<typename Derived, typename Shape, typename Key> |
| 14680 void HashTable<Derived, Shape, Key>::Rehash(Derived* new_table, Key key) { | 14680 void HashTable<Derived, Shape, Key>::Rehash( |
| 14681 Handle<Derived> new_table, |
| 14682 Key key) { |
| 14681 ASSERT(NumberOfElements() < new_table->Capacity()); | 14683 ASSERT(NumberOfElements() < new_table->Capacity()); |
| 14682 | 14684 |
| 14683 DisallowHeapAllocation no_gc; | 14685 DisallowHeapAllocation no_gc; |
| 14684 WriteBarrierMode mode = new_table->GetWriteBarrierMode(no_gc); | 14686 WriteBarrierMode mode = new_table->GetWriteBarrierMode(no_gc); |
| 14685 | 14687 |
| 14686 // Copy prefix to new array. | 14688 // Copy prefix to new array. |
| 14687 for (int i = kPrefixStartIndex; | 14689 for (int i = kPrefixStartIndex; |
| 14688 i < kPrefixStartIndex + Shape::kPrefixSize; | 14690 i < kPrefixStartIndex + Shape::kPrefixSize; |
| 14689 i++) { | 14691 i++) { |
| 14690 new_table->set(i, get(i), mode); | 14692 new_table->set(i, get(i), mode); |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 14772 // for the next probe. | 14774 // for the next probe. |
| 14773 done = false; | 14775 done = false; |
| 14774 } | 14776 } |
| 14775 } | 14777 } |
| 14776 } | 14778 } |
| 14777 } | 14779 } |
| 14778 } | 14780 } |
| 14779 | 14781 |
| 14780 | 14782 |
| 14781 template<typename Derived, typename Shape, typename Key> | 14783 template<typename Derived, typename Shape, typename Key> |
| 14782 MaybeObject* HashTable<Derived, Shape, Key>::EnsureCapacity( | |
| 14783 int n, | |
| 14784 Key key, | |
| 14785 PretenureFlag pretenure) { | |
| 14786 int capacity = Capacity(); | |
| 14787 int nof = NumberOfElements() + n; | |
| 14788 int nod = NumberOfDeletedElements(); | |
| 14789 // Return if: | |
| 14790 // 50% is still free after adding n elements and | |
| 14791 // at most 50% of the free elements are deleted elements. | |
| 14792 if (nod <= (capacity - nof) >> 1) { | |
| 14793 int needed_free = nof >> 1; | |
| 14794 if (nof + needed_free <= capacity) return this; | |
| 14795 } | |
| 14796 | |
| 14797 const int kMinCapacityForPretenure = 256; | |
| 14798 bool should_pretenure = pretenure == TENURED || | |
| 14799 ((capacity > kMinCapacityForPretenure) && !GetHeap()->InNewSpace(this)); | |
| 14800 Object* obj; | |
| 14801 { MaybeObject* maybe_obj = | |
| 14802 Allocate(GetHeap(), | |
| 14803 nof * 2, | |
| 14804 USE_DEFAULT_MINIMUM_CAPACITY, | |
| 14805 should_pretenure ? TENURED : NOT_TENURED); | |
| 14806 if (!maybe_obj->ToObject(&obj)) return maybe_obj; | |
| 14807 } | |
| 14808 | |
| 14809 Rehash(Derived::cast(obj), key); | |
| 14810 return Derived::cast(obj); | |
| 14811 } | |
| 14812 | |
| 14813 | |
| 14814 template<typename Derived, typename Shape, typename Key> | |
| 14815 Handle<Derived> HashTable<Derived, Shape, Key>::EnsureCapacity( | 14784 Handle<Derived> HashTable<Derived, Shape, Key>::EnsureCapacity( |
| 14816 Handle<Derived> table, | 14785 Handle<Derived> table, |
| 14817 int n, | 14786 int n, |
| 14818 Key key, | 14787 Key key, |
| 14819 PretenureFlag pretenure) { | 14788 PretenureFlag pretenure) { |
| 14820 Isolate* isolate = table->GetIsolate(); | 14789 Isolate* isolate = table->GetIsolate(); |
| 14821 CALL_HEAP_FUNCTION( | 14790 int capacity = table->Capacity(); |
| 14791 int nof = table->NumberOfElements() + n; |
| 14792 int nod = table->NumberOfDeletedElements(); |
| 14793 // Return if: |
| 14794 // 50% is still free after adding n elements and |
| 14795 // at most 50% of the free elements are deleted elements. |
| 14796 if (nod <= (capacity - nof) >> 1) { |
| 14797 int needed_free = nof >> 1; |
| 14798 if (nof + needed_free <= capacity) return table; |
| 14799 } |
| 14800 |
| 14801 const int kMinCapacityForPretenure = 256; |
| 14802 bool should_pretenure = pretenure == TENURED || |
| 14803 ((capacity > kMinCapacityForPretenure) && |
| 14804 !isolate->heap()->InNewSpace(*table)); |
| 14805 Handle<Derived> new_table = HashTable::New( |
| 14822 isolate, | 14806 isolate, |
| 14823 static_cast<HashTable*>(*table)->EnsureCapacity(n, key, pretenure), | 14807 nof * 2, |
| 14824 Derived); | 14808 USE_DEFAULT_MINIMUM_CAPACITY, |
| 14809 should_pretenure ? TENURED : NOT_TENURED); |
| 14810 |
| 14811 table->Rehash(new_table, key); |
| 14812 return new_table; |
| 14825 } | 14813 } |
| 14826 | 14814 |
| 14827 | 14815 |
| 14828 template<typename Derived, typename Shape, typename Key> | 14816 template<typename Derived, typename Shape, typename Key> |
| 14829 Handle<Derived> HashTable<Derived, Shape, Key>::Shrink(Handle<Derived> table, | 14817 Handle<Derived> HashTable<Derived, Shape, Key>::Shrink(Handle<Derived> table, |
| 14830 Key key) { | 14818 Key key) { |
| 14831 int capacity = table->Capacity(); | 14819 int capacity = table->Capacity(); |
| 14832 int nof = table->NumberOfElements(); | 14820 int nof = table->NumberOfElements(); |
| 14833 | 14821 |
| 14834 // Shrink to fit the number of elements if only a quarter of the | 14822 // Shrink to fit the number of elements if only a quarter of the |
| 14835 // capacity is filled with elements. | 14823 // capacity is filled with elements. |
| 14836 if (nof > (capacity >> 2)) return table; | 14824 if (nof > (capacity >> 2)) return table; |
| 14837 // Allocate a new dictionary with room for at least the current | 14825 // Allocate a new dictionary with room for at least the current |
| 14838 // number of elements. The allocation method will make sure that | 14826 // number of elements. The allocation method will make sure that |
| 14839 // there is extra room in the dictionary for additions. Don't go | 14827 // there is extra room in the dictionary for additions. Don't go |
| 14840 // lower than room for 16 elements. | 14828 // lower than room for 16 elements. |
| 14841 int at_least_room_for = nof; | 14829 int at_least_room_for = nof; |
| 14842 if (at_least_room_for < 16) return table; | 14830 if (at_least_room_for < 16) return table; |
| 14843 | 14831 |
| 14844 Isolate* isolate = table->GetIsolate(); | 14832 Isolate* isolate = table->GetIsolate(); |
| 14845 const int kMinCapacityForPretenure = 256; | 14833 const int kMinCapacityForPretenure = 256; |
| 14846 bool pretenure = | 14834 bool pretenure = |
| 14847 (at_least_room_for > kMinCapacityForPretenure) && | 14835 (at_least_room_for > kMinCapacityForPretenure) && |
| 14848 !isolate->heap()->InNewSpace(*table); | 14836 !isolate->heap()->InNewSpace(*table); |
| 14849 Handle<Derived> new_table = New( | 14837 Handle<Derived> new_table = HashTable::New( |
| 14850 isolate, | 14838 isolate, |
| 14851 at_least_room_for, | 14839 at_least_room_for, |
| 14852 USE_DEFAULT_MINIMUM_CAPACITY, | 14840 USE_DEFAULT_MINIMUM_CAPACITY, |
| 14853 pretenure ? TENURED : NOT_TENURED); | 14841 pretenure ? TENURED : NOT_TENURED); |
| 14854 | 14842 |
| 14855 table->Rehash(*new_table, key); | 14843 table->Rehash(new_table, key); |
| 14856 return new_table; | 14844 return new_table; |
| 14857 } | 14845 } |
| 14858 | 14846 |
| 14859 | 14847 |
| 14860 template<typename Derived, typename Shape, typename Key> | 14848 template<typename Derived, typename Shape, typename Key> |
| 14861 uint32_t HashTable<Derived, Shape, Key>::FindInsertionEntry(uint32_t hash) { | 14849 uint32_t HashTable<Derived, Shape, Key>::FindInsertionEntry(uint32_t hash) { |
| 14862 uint32_t capacity = Capacity(); | 14850 uint32_t capacity = Capacity(); |
| 14863 uint32_t entry = FirstProbe(hash, capacity); | 14851 uint32_t entry = FirstProbe(hash, capacity); |
| 14864 uint32_t count = 1; | 14852 uint32_t count = 1; |
| 14865 // EnsureCapacity will guarantee the hash table is never full. | 14853 // EnsureCapacity will guarantee the hash table is never full. |
| (...skipping 2489 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 17355 #define ERROR_MESSAGES_TEXTS(C, T) T, | 17343 #define ERROR_MESSAGES_TEXTS(C, T) T, |
| 17356 static const char* error_messages_[] = { | 17344 static const char* error_messages_[] = { |
| 17357 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) | 17345 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) |
| 17358 }; | 17346 }; |
| 17359 #undef ERROR_MESSAGES_TEXTS | 17347 #undef ERROR_MESSAGES_TEXTS |
| 17360 return error_messages_[reason]; | 17348 return error_messages_[reason]; |
| 17361 } | 17349 } |
| 17362 | 17350 |
| 17363 | 17351 |
| 17364 } } // namespace v8::internal | 17352 } } // namespace v8::internal |
| OLD | NEW |