Reviewers: Yang,
Message:
Committed patchset #1 manually as r20961 (tree was closed).
Description:
Revert "HashTable::EnsureCapacity() handlified."
This reverts commit r20960 for breaking Windows build.
[email protected]
Committed: https://code.google.com/p/v8/source/detail?r=20961
Please review this at https://codereview.chromium.org/250893002/
SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge
Affected files (+49, -43 lines):
M src/objects.h
M src/objects.cc
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;
}
Index: src/objects.h
diff --git a/src/objects.h b/src/objects.h
index
3fd8d7b15a7e483c294b39a62512c59574518eb9..d926165c3e06e358ff595567f5ba58a175286743
100644
--- a/src/objects.h
+++ b/src/objects.h
@@ -3736,7 +3736,7 @@ class HashTable: public FixedArray {
PretenureFlag pretenure = NOT_TENURED);
// Returns a new HashTable object.
- MUST_USE_RESULT static Handle<Derived> New(
+ static Handle<Derived> New(
Isolate* isolate,
int at_least_space_for,
MinimumCapacity capacity_option = USE_DEFAULT_MINIMUM_CAPACITY,
@@ -3843,17 +3843,6 @@ class HashTable: public FixedArray {
return (last + number) & (size - 1);
}
- // Attempt to shrink hash table after removal of key.
- static Handle<Derived> Shrink(Handle<Derived> table, Key key);
-
- // Ensure enough space for n additional elements.
- MUST_USE_RESULT static Handle<Derived> EnsureCapacity(
- Handle<Derived> table,
- int n,
- Key key,
- 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_.
@@ -3862,7 +3851,21 @@ class HashTable: public FixedArray {
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);
+ void Rehash(Derived* new_table, Key key);
+
+ // Attempt to shrink hash table after removal of key.
+ static Handle<Derived> Shrink(Handle<Derived> table, Key key);
+
+ // Ensure enough space for n additional elements.
+ MUST_USE_RESULT MaybeObject* EnsureCapacity(
+ int n,
+ Key key,
+ PretenureFlag pretenure = NOT_TENURED);
+ static Handle<Derived> EnsureCapacity(
+ Handle<Derived> table,
+ int n,
+ Key key,
+ PretenureFlag pretenure = NOT_TENURED);
};
@@ -4105,15 +4108,6 @@ class Dictionary: public HashTable<Derived, Shape,
Key> {
static void GenerateNewEnumerationIndices(Handle<Derived> dictionary);
static const int kMaxNumberKeyIndex =
DerivedHashTable::kPrefixStartIndex;
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);
};
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.