Commit b1a7ae6b authored by ishell@chromium.org's avatar ishell@chromium.org

HashTable::EnsureCapacity() handlified.

R=yangguo@chromium.org

Review URL: https://codereview.chromium.org/250643002

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@20960 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 96e5434b
...@@ -14677,7 +14677,9 @@ int NameDictionary::FindEntry(Handle<Name> key) { ...@@ -14677,7 +14677,9 @@ int NameDictionary::FindEntry(Handle<Name> key) {
template<typename Derived, typename Shape, typename 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()); ASSERT(NumberOfElements() < new_table->Capacity());
DisallowHeapAllocation no_gc; DisallowHeapAllocation no_gc;
...@@ -14779,49 +14781,35 @@ void HashTable<Derived, Shape, Key>::Rehash(Key key) { ...@@ -14779,49 +14781,35 @@ void HashTable<Derived, Shape, Key>::Rehash(Key key) {
template<typename Derived, typename Shape, typename 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, int n,
Key key, Key key,
PretenureFlag pretenure) { PretenureFlag pretenure) {
int capacity = Capacity(); Isolate* isolate = table->GetIsolate();
int nof = NumberOfElements() + n; int capacity = table->Capacity();
int nod = NumberOfDeletedElements(); int nof = table->NumberOfElements() + n;
int nod = table->NumberOfDeletedElements();
// Return if: // Return if:
// 50% is still free after adding n elements and // 50% is still free after adding n elements and
// at most 50% of the free elements are deleted elements. // at most 50% of the free elements are deleted elements.
if (nod <= (capacity - nof) >> 1) { if (nod <= (capacity - nof) >> 1) {
int needed_free = 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; const int kMinCapacityForPretenure = 256;
bool should_pretenure = pretenure == TENURED || bool should_pretenure = pretenure == TENURED ||
((capacity > kMinCapacityForPretenure) && !GetHeap()->InNewSpace(this)); ((capacity > kMinCapacityForPretenure) &&
Object* obj; !isolate->heap()->InNewSpace(*table));
{ MaybeObject* maybe_obj = Handle<Derived> new_table = HashTable::New(
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(
isolate, isolate,
static_cast<HashTable*>(*table)->EnsureCapacity(n, key, pretenure), nof * 2,
Derived); 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, ...@@ -14846,13 +14834,13 @@ Handle<Derived> HashTable<Derived, Shape, Key>::Shrink(Handle<Derived> table,
bool pretenure = bool pretenure =
(at_least_room_for > kMinCapacityForPretenure) && (at_least_room_for > kMinCapacityForPretenure) &&
!isolate->heap()->InNewSpace(*table); !isolate->heap()->InNewSpace(*table);
Handle<Derived> new_table = New( Handle<Derived> new_table = HashTable::New(
isolate, isolate,
at_least_room_for, at_least_room_for,
USE_DEFAULT_MINIMUM_CAPACITY, USE_DEFAULT_MINIMUM_CAPACITY,
pretenure ? TENURED : NOT_TENURED); pretenure ? TENURED : NOT_TENURED);
table->Rehash(*new_table, key); table->Rehash(new_table, key);
return new_table; return new_table;
} }
......
...@@ -3736,7 +3736,7 @@ class HashTable: public FixedArray { ...@@ -3736,7 +3736,7 @@ class HashTable: public FixedArray {
PretenureFlag pretenure = NOT_TENURED); PretenureFlag pretenure = NOT_TENURED);
// Returns a new HashTable object. // Returns a new HashTable object.
static Handle<Derived> New( MUST_USE_RESULT static Handle<Derived> New(
Isolate* isolate, Isolate* isolate,
int at_least_space_for, int at_least_space_for,
MinimumCapacity capacity_option = USE_DEFAULT_MINIMUM_CAPACITY, MinimumCapacity capacity_option = USE_DEFAULT_MINIMUM_CAPACITY,
...@@ -3843,29 +3843,26 @@ class HashTable: public FixedArray { ...@@ -3843,29 +3843,26 @@ class HashTable: public FixedArray {
return (last + number) & (size - 1); return (last + number) & (size - 1);
} }
// Returns _expected_ if one of entries given by the first _probe_ probes is
// equal to _expected_. Otherwise, returns the entry given by the probe
// number _probe_.
uint32_t EntryForProbe(Key key, Object* k, int probe, uint32_t expected);
void Swap(uint32_t entry1, uint32_t entry2, WriteBarrierMode mode);
// Rehashes this hash-table into the new table.
void Rehash(Derived* new_table, Key key);
// Attempt to shrink hash table after removal of key. // Attempt to shrink hash table after removal of key.
static Handle<Derived> Shrink(Handle<Derived> table, Key key); static Handle<Derived> Shrink(Handle<Derived> table, Key key);
// Ensure enough space for n additional elements. // Ensure enough space for n additional elements.
MUST_USE_RESULT MaybeObject* EnsureCapacity( MUST_USE_RESULT static Handle<Derived> EnsureCapacity(
int n,
Key key,
PretenureFlag pretenure = NOT_TENURED);
static Handle<Derived> EnsureCapacity(
Handle<Derived> table, Handle<Derived> table,
int n, int n,
Key key, Key key,
PretenureFlag pretenure = NOT_TENURED); PretenureFlag pretenure = NOT_TENURED);
private:
// Returns _expected_ if one of entries given by the first _probe_ probes is
// equal to _expected_. Otherwise, returns the entry given by the probe
// number _probe_.
uint32_t EntryForProbe(Key key, Object* k, int probe, uint32_t expected);
void Swap(uint32_t entry1, uint32_t entry2, WriteBarrierMode mode);
// Rehashes this hash-table into the new table.
void Rehash(Handle<Derived> new_table, Key key);
}; };
...@@ -4108,6 +4105,15 @@ class Dictionary: public HashTable<Derived, Shape, Key> { ...@@ -4108,6 +4105,15 @@ class Dictionary: public HashTable<Derived, Shape, Key> {
static void GenerateNewEnumerationIndices(Handle<Derived> dictionary); static void GenerateNewEnumerationIndices(Handle<Derived> dictionary);
static const int kMaxNumberKeyIndex = DerivedHashTable::kPrefixStartIndex; static const int kMaxNumberKeyIndex = DerivedHashTable::kPrefixStartIndex;
static const int kNextEnumerationIndexIndex = kMaxNumberKeyIndex + 1; static const int kNextEnumerationIndexIndex = kMaxNumberKeyIndex + 1;
private:
// This is to hide HashTable::New() which could clash with Dictionary::New().
// The latter one must be used for creating Dictionary and successors.
MUST_USE_RESULT static Handle<Derived> New(
Isolate* isolate,
int at_least_space_for,
MinimumCapacity capacity_option,
PretenureFlag pretenure);
}; };
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment