| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/objects.h" | 5 #include "src/objects.h" |
| 6 | 6 |
| 7 #include <cmath> | 7 #include <cmath> |
| 8 #include <iomanip> | 8 #include <iomanip> |
| 9 #include <sstream> | 9 #include <sstream> |
| 10 | 10 |
| (...skipping 16259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 16270 template<typename Derived, typename Shape, typename Key> | 16270 template<typename Derived, typename Shape, typename Key> |
| 16271 Handle<Derived> HashTable<Derived, Shape, Key>::EnsureCapacity( | 16271 Handle<Derived> HashTable<Derived, Shape, Key>::EnsureCapacity( |
| 16272 Handle<Derived> table, | 16272 Handle<Derived> table, |
| 16273 int n, | 16273 int n, |
| 16274 Key key, | 16274 Key key, |
| 16275 PretenureFlag pretenure) { | 16275 PretenureFlag pretenure) { |
| 16276 Isolate* isolate = table->GetIsolate(); | 16276 Isolate* isolate = table->GetIsolate(); |
| 16277 int capacity = table->Capacity(); | 16277 int capacity = table->Capacity(); |
| 16278 int nof = table->NumberOfElements() + n; | 16278 int nof = table->NumberOfElements() + n; |
| 16279 | 16279 |
| 16280 if (table->HasSufficientCapacity(n)) return table; | 16280 if (table->HasSufficientCapacityToAdd(n)) return table; |
| 16281 | 16281 |
| 16282 const int kMinCapacityForPretenure = 256; | 16282 const int kMinCapacityForPretenure = 256; |
| 16283 bool should_pretenure = pretenure == TENURED || | 16283 bool should_pretenure = pretenure == TENURED || |
| 16284 ((capacity > kMinCapacityForPretenure) && | 16284 ((capacity > kMinCapacityForPretenure) && |
| 16285 !isolate->heap()->InNewSpace(*table)); | 16285 !isolate->heap()->InNewSpace(*table)); |
| 16286 Handle<Derived> new_table = HashTable::New( | 16286 Handle<Derived> new_table = HashTable::New( |
| 16287 isolate, | 16287 isolate, |
| 16288 nof * 2, | 16288 nof * 2, |
| 16289 USE_DEFAULT_MINIMUM_CAPACITY, | 16289 USE_DEFAULT_MINIMUM_CAPACITY, |
| 16290 should_pretenure ? TENURED : NOT_TENURED); | 16290 should_pretenure ? TENURED : NOT_TENURED); |
| 16291 | 16291 |
| 16292 table->Rehash(new_table, key); | 16292 table->Rehash(new_table, key); |
| 16293 return new_table; | 16293 return new_table; |
| 16294 } | 16294 } |
| 16295 | 16295 |
| 16296 | |
| 16297 template <typename Derived, typename Shape, typename Key> | 16296 template <typename Derived, typename Shape, typename Key> |
| 16298 bool HashTable<Derived, Shape, Key>::HasSufficientCapacity(int n) { | 16297 bool HashTable<Derived, Shape, Key>::HasSufficientCapacityToAdd( |
| 16298 int number_of_additional_elements) { |
| 16299 int capacity = Capacity(); | 16299 int capacity = Capacity(); |
| 16300 int nof = NumberOfElements() + n; | 16300 int nof = NumberOfElements() + number_of_additional_elements; |
| 16301 int nod = NumberOfDeletedElements(); | 16301 int nod = NumberOfDeletedElements(); |
| 16302 // Return true if: | 16302 // Return true if: |
| 16303 // 50% is still free after adding n elements and | 16303 // 50% is still free after adding number_of_additional_elements elements and |
| 16304 // at most 50% of the free elements are deleted elements. | 16304 // at most 50% of the free elements are deleted elements. |
| 16305 if (nod <= (capacity - nof) >> 1) { | 16305 if ((nof < capacity) && ((nod <= (capacity - nof) >> 1))) { |
| 16306 int needed_free = nof >> 1; | 16306 int needed_free = nof >> 1; |
| 16307 if (nof + needed_free <= capacity) return true; | 16307 if (nof + needed_free <= capacity) return true; |
| 16308 } | 16308 } |
| 16309 return false; | 16309 return false; |
| 16310 } | 16310 } |
| 16311 | 16311 |
| 16312 | 16312 |
| 16313 template<typename Derived, typename Shape, typename Key> | 16313 template<typename Derived, typename Shape, typename Key> |
| 16314 Handle<Derived> HashTable<Derived, Shape, Key>::Shrink(Handle<Derived> table, | 16314 Handle<Derived> HashTable<Derived, Shape, Key>::Shrink(Handle<Derived> table, |
| 16315 Key key) { | 16315 Key key) { |
| (...skipping 951 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 17267 return iteration_order; | 17267 return iteration_order; |
| 17268 } | 17268 } |
| 17269 | 17269 |
| 17270 | 17270 |
| 17271 template <typename Derived, typename Shape, typename Key> | 17271 template <typename Derived, typename Shape, typename Key> |
| 17272 void Dictionary<Derived, Shape, Key>::SetRequiresCopyOnCapacityChange() { | 17272 void Dictionary<Derived, Shape, Key>::SetRequiresCopyOnCapacityChange() { |
| 17273 DCHECK_EQ(0, DerivedHashTable::NumberOfElements()); | 17273 DCHECK_EQ(0, DerivedHashTable::NumberOfElements()); |
| 17274 DCHECK_EQ(0, DerivedHashTable::NumberOfDeletedElements()); | 17274 DCHECK_EQ(0, DerivedHashTable::NumberOfDeletedElements()); |
| 17275 // Make sure that HashTable::EnsureCapacity will create a copy. | 17275 // Make sure that HashTable::EnsureCapacity will create a copy. |
| 17276 DerivedHashTable::SetNumberOfDeletedElements(DerivedHashTable::Capacity()); | 17276 DerivedHashTable::SetNumberOfDeletedElements(DerivedHashTable::Capacity()); |
| 17277 DCHECK(!DerivedHashTable::HasSufficientCapacity(1)); | 17277 DCHECK(!DerivedHashTable::HasSufficientCapacityToAdd(1)); |
| 17278 } | 17278 } |
| 17279 | 17279 |
| 17280 | 17280 |
| 17281 template <typename Derived, typename Shape, typename Key> | 17281 template <typename Derived, typename Shape, typename Key> |
| 17282 Handle<Derived> Dictionary<Derived, Shape, Key>::EnsureCapacity( | 17282 Handle<Derived> Dictionary<Derived, Shape, Key>::EnsureCapacity( |
| 17283 Handle<Derived> dictionary, int n, Key key) { | 17283 Handle<Derived> dictionary, int n, Key key) { |
| 17284 // Check whether there are enough enumeration indices to add n elements. | 17284 // Check whether there are enough enumeration indices to add n elements. |
| 17285 if (Shape::kIsEnumerable && | 17285 if (Shape::kIsEnumerable && |
| 17286 !PropertyDetails::IsValidIndex(dictionary->NextEnumerationIndex() + n)) { | 17286 !PropertyDetails::IsValidIndex(dictionary->NextEnumerationIndex() + n)) { |
| 17287 // If not, we generate new indices for the properties. | 17287 // If not, we generate new indices for the properties. |
| (...skipping 399 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 17687 return table; | 17687 return table; |
| 17688 } | 17688 } |
| 17689 | 17689 |
| 17690 // Rehash if more than 33% of the entries are deleted entries. | 17690 // Rehash if more than 33% of the entries are deleted entries. |
| 17691 // TODO(jochen): Consider to shrink the fixed array in place. | 17691 // TODO(jochen): Consider to shrink the fixed array in place. |
| 17692 if ((table->NumberOfDeletedElements() << 1) > table->NumberOfElements()) { | 17692 if ((table->NumberOfDeletedElements() << 1) > table->NumberOfElements()) { |
| 17693 table->Rehash(isolate->factory()->undefined_value()); | 17693 table->Rehash(isolate->factory()->undefined_value()); |
| 17694 } | 17694 } |
| 17695 // If we're out of luck, we didn't get a GC recently, and so rehashing | 17695 // If we're out of luck, we didn't get a GC recently, and so rehashing |
| 17696 // isn't enough to avoid a crash. | 17696 // isn't enough to avoid a crash. |
| 17697 int nof = table->NumberOfElements() + 1; | 17697 if (!table->HasSufficientCapacityToAdd(1)) { |
| 17698 if (!table->HasSufficientCapacity(nof)) { | 17698 int nof = table->NumberOfElements() + 1; |
| 17699 int capacity = ObjectHashTable::ComputeCapacity(nof * 2); | 17699 int capacity = ObjectHashTable::ComputeCapacity(nof * 2); |
| 17700 if (capacity > ObjectHashTable::kMaxCapacity) { | 17700 if (capacity > ObjectHashTable::kMaxCapacity) { |
| 17701 for (size_t i = 0; i < 2; ++i) { | 17701 for (size_t i = 0; i < 2; ++i) { |
| 17702 isolate->heap()->CollectAllGarbage( | 17702 isolate->heap()->CollectAllGarbage( |
| 17703 Heap::kFinalizeIncrementalMarkingMask, "full object hash table"); | 17703 Heap::kFinalizeIncrementalMarkingMask, "full object hash table"); |
| 17704 } | 17704 } |
| 17705 table->Rehash(isolate->factory()->undefined_value()); | 17705 table->Rehash(isolate->factory()->undefined_value()); |
| 17706 } | 17706 } |
| 17707 } | 17707 } |
| 17708 | 17708 |
| (...skipping 1225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 18934 | 18934 |
| 18935 Object* data_obj = | 18935 Object* data_obj = |
| 18936 constructor->shared()->get_api_func_data()->access_check_info(); | 18936 constructor->shared()->get_api_func_data()->access_check_info(); |
| 18937 if (data_obj->IsUndefined(isolate)) return nullptr; | 18937 if (data_obj->IsUndefined(isolate)) return nullptr; |
| 18938 | 18938 |
| 18939 return AccessCheckInfo::cast(data_obj); | 18939 return AccessCheckInfo::cast(data_obj); |
| 18940 } | 18940 } |
| 18941 | 18941 |
| 18942 } // namespace internal | 18942 } // namespace internal |
| 18943 } // namespace v8 | 18943 } // namespace v8 |
| OLD | NEW |