| Index: src/objects.cc
|
| diff --git a/src/objects.cc b/src/objects.cc
|
| index fcaa25aabdf10a8220944c733566d79dacd4c68e..2a7252ca13825355cb715eb2bb5b543e16db838d 100644
|
| --- a/src/objects.cc
|
| +++ b/src/objects.cc
|
| @@ -14677,9 +14677,7 @@ int NameDictionary::FindEntry(Handle<Name> key) {
|
|
|
|
|
| template<typename Derived, typename Shape, typename Key>
|
| -void HashTable<Derived, Shape, Key>::Rehash(
|
| - Handle<Derived> new_table,
|
| - Key key) {
|
| +void HashTable<Derived, Shape, Key>::Rehash(Derived* new_table, Key key) {
|
| ASSERT(NumberOfElements() < new_table->Capacity());
|
|
|
| DisallowHeapAllocation no_gc;
|
| @@ -14781,35 +14779,49 @@ void HashTable<Derived, Shape, Key>::Rehash(Key key) {
|
|
|
|
|
| template<typename Derived, typename Shape, typename Key>
|
| -Handle<Derived> HashTable<Derived, Shape, Key>::EnsureCapacity(
|
| - Handle<Derived> table,
|
| +MaybeObject* HashTable<Derived, Shape, Key>::EnsureCapacity(
|
| int n,
|
| Key key,
|
| PretenureFlag pretenure) {
|
| - Isolate* isolate = table->GetIsolate();
|
| - int capacity = table->Capacity();
|
| - int nof = table->NumberOfElements() + n;
|
| - int nod = table->NumberOfDeletedElements();
|
| + int capacity = Capacity();
|
| + int nof = NumberOfElements() + n;
|
| + int nod = 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 table;
|
| + if (nof + needed_free <= capacity) return this;
|
| }
|
|
|
| const int kMinCapacityForPretenure = 256;
|
| bool should_pretenure = pretenure == TENURED ||
|
| - ((capacity > kMinCapacityForPretenure) &&
|
| - !isolate->heap()->InNewSpace(*table));
|
| - Handle<Derived> new_table = HashTable::New(
|
| - isolate,
|
| - nof * 2,
|
| - USE_DEFAULT_MINIMUM_CAPACITY,
|
| - should_pretenure ? TENURED : NOT_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;
|
| + }
|
|
|
| - table->Rehash(new_table, key);
|
| - return new_table;
|
| + 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(
|
| + isolate,
|
| + static_cast<HashTable*>(*table)->EnsureCapacity(n, key, pretenure),
|
| + Derived);
|
| }
|
|
|
|
|
| @@ -14834,13 +14846,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 = HashTable::New(
|
| + Handle<Derived> new_table = 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;
|
| }
|
|
|
|
|