| Index: src/objects.cc
|
| diff --git a/src/objects.cc b/src/objects.cc
|
| index 2a7252ca13825355cb715eb2bb5b543e16db838d..fcaa25aabdf10a8220944c733566d79dacd4c68e 100644
|
| --- a/src/objects.cc
|
| +++ b/src/objects.cc
|
| @@ -14677,7 +14677,9 @@ int NameDictionary::FindEntry(Handle<Name> key) {
|
|
|
|
|
| template<typename Derived, typename Shape, typename Key>
|
| -void HashTable<Derived, Shape, Key>::Rehash(Derived* new_table, Key key) {
|
| +void HashTable<Derived, Shape, Key>::Rehash(
|
| + Handle<Derived> new_table,
|
| + Key key) {
|
| ASSERT(NumberOfElements() < new_table->Capacity());
|
|
|
| DisallowHeapAllocation no_gc;
|
| @@ -14779,49 +14781,35 @@ void HashTable<Derived, Shape, Key>::Rehash(Key key) {
|
|
|
|
|
| template<typename Derived, typename Shape, typename Key>
|
| -MaybeObject* HashTable<Derived, Shape, Key>::EnsureCapacity(
|
| +Handle<Derived> HashTable<Derived, Shape, Key>::EnsureCapacity(
|
| + Handle<Derived> table,
|
| int n,
|
| Key key,
|
| PretenureFlag pretenure) {
|
| - int capacity = Capacity();
|
| - int nof = NumberOfElements() + n;
|
| - int nod = NumberOfDeletedElements();
|
| + Isolate* isolate = table->GetIsolate();
|
| + int capacity = table->Capacity();
|
| + int nof = table->NumberOfElements() + n;
|
| + int nod = table->NumberOfDeletedElements();
|
| // Return if:
|
| // 50% is still free after adding n elements and
|
| // at most 50% of the free elements are deleted elements.
|
| if (nod <= (capacity - nof) >> 1) {
|
| int needed_free = nof >> 1;
|
| - if (nof + needed_free <= capacity) return this;
|
| + if (nof + needed_free <= capacity) return table;
|
| }
|
|
|
| const int kMinCapacityForPretenure = 256;
|
| bool should_pretenure = pretenure == TENURED ||
|
| - ((capacity > kMinCapacityForPretenure) && !GetHeap()->InNewSpace(this));
|
| - Object* obj;
|
| - { MaybeObject* maybe_obj =
|
| - Allocate(GetHeap(),
|
| - nof * 2,
|
| - USE_DEFAULT_MINIMUM_CAPACITY,
|
| - should_pretenure ? TENURED : NOT_TENURED);
|
| - if (!maybe_obj->ToObject(&obj)) return maybe_obj;
|
| - }
|
| -
|
| - Rehash(Derived::cast(obj), key);
|
| - return Derived::cast(obj);
|
| -}
|
| -
|
| -
|
| -template<typename Derived, typename Shape, typename Key>
|
| -Handle<Derived> HashTable<Derived, Shape, Key>::EnsureCapacity(
|
| - Handle<Derived> table,
|
| - int n,
|
| - Key key,
|
| - PretenureFlag pretenure) {
|
| - Isolate* isolate = table->GetIsolate();
|
| - CALL_HEAP_FUNCTION(
|
| + ((capacity > kMinCapacityForPretenure) &&
|
| + !isolate->heap()->InNewSpace(*table));
|
| + Handle<Derived> new_table = HashTable::New(
|
| isolate,
|
| - static_cast<HashTable*>(*table)->EnsureCapacity(n, key, pretenure),
|
| - Derived);
|
| + nof * 2,
|
| + USE_DEFAULT_MINIMUM_CAPACITY,
|
| + should_pretenure ? TENURED : NOT_TENURED);
|
| +
|
| + table->Rehash(new_table, key);
|
| + return new_table;
|
| }
|
|
|
|
|
| @@ -14846,13 +14834,13 @@ Handle<Derived> HashTable<Derived, Shape, Key>::Shrink(Handle<Derived> table,
|
| bool pretenure =
|
| (at_least_room_for > kMinCapacityForPretenure) &&
|
| !isolate->heap()->InNewSpace(*table);
|
| - Handle<Derived> new_table = New(
|
| + Handle<Derived> new_table = HashTable::New(
|
| isolate,
|
| at_least_room_for,
|
| USE_DEFAULT_MINIMUM_CAPACITY,
|
| pretenure ? TENURED : NOT_TENURED);
|
|
|
| - table->Rehash(*new_table, key);
|
| + table->Rehash(new_table, key);
|
| return new_table;
|
| }
|
|
|
|
|