Reverting temporary reverts 3586 and 3588 back.
TBR=kasperl@chromium.org git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@3589 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
fada07aecc
commit
4377037336
@ -6845,6 +6845,7 @@ Object* HashTable<Shape, Key>::Allocate(int at_least_space_for) {
|
||||
Object* obj = Heap::AllocateHashTable(EntryToIndex(capacity));
|
||||
if (!obj->IsFailure()) {
|
||||
HashTable::cast(obj)->SetNumberOfElements(0);
|
||||
HashTable::cast(obj)->SetNumberOfDeletedElements(0);
|
||||
HashTable::cast(obj)->SetCapacity(capacity);
|
||||
}
|
||||
return obj;
|
||||
@ -6872,8 +6873,12 @@ template<typename Shape, typename Key>
|
||||
Object* HashTable<Shape, Key>::EnsureCapacity(int n, Key key) {
|
||||
int capacity = Capacity();
|
||||
int nof = NumberOfElements() + n;
|
||||
// Make sure 50% is free
|
||||
if (nof + (nof >> 1) <= capacity) return this;
|
||||
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 ((nof + (nof >> 1) <= capacity) &&
|
||||
(nod <= (capacity - nof) >> 1)) return this;
|
||||
|
||||
Object* obj = Allocate(nof * 2);
|
||||
if (obj->IsFailure()) return obj;
|
||||
@ -6900,6 +6905,7 @@ Object* HashTable<Shape, Key>::EnsureCapacity(int n, Key key) {
|
||||
}
|
||||
}
|
||||
table->SetNumberOfElements(NumberOfElements());
|
||||
table->SetNumberOfDeletedElements(0);
|
||||
return table;
|
||||
}
|
||||
|
||||
@ -7700,7 +7706,7 @@ void NumberDictionary::RemoveNumberEntries(uint32_t from, uint32_t to) {
|
||||
}
|
||||
|
||||
// Update the number of elements.
|
||||
SetNumberOfElements(NumberOfElements() - removed_entries);
|
||||
ElementsRemoved(removed_entries);
|
||||
}
|
||||
|
||||
|
||||
|
@ -1897,6 +1897,11 @@ class HashTable: public FixedArray {
|
||||
return Smi::cast(get(kNumberOfElementsIndex))->value();
|
||||
}
|
||||
|
||||
// Returns the number of deleted elements in the hash table.
|
||||
int NumberOfDeletedElements() {
|
||||
return Smi::cast(get(kNumberOfDeletedElementsIndex))->value();
|
||||
}
|
||||
|
||||
// Returns the capacity of the hash table.
|
||||
int Capacity() {
|
||||
return Smi::cast(get(kCapacityIndex))->value();
|
||||
@ -1908,8 +1913,14 @@ class HashTable: public FixedArray {
|
||||
|
||||
// ElementRemoved should be called whenever an element is removed from
|
||||
// a hash table.
|
||||
void ElementRemoved() { SetNumberOfElements(NumberOfElements() - 1); }
|
||||
void ElementsRemoved(int n) { SetNumberOfElements(NumberOfElements() - n); }
|
||||
void ElementRemoved() {
|
||||
SetNumberOfElements(NumberOfElements() - 1);
|
||||
SetNumberOfDeletedElements(NumberOfDeletedElements() + 1);
|
||||
}
|
||||
void ElementsRemoved(int n) {
|
||||
SetNumberOfElements(NumberOfElements() - n);
|
||||
SetNumberOfDeletedElements(NumberOfDeletedElements() + n);
|
||||
}
|
||||
|
||||
// Returns a new HashTable object. Might return Failure.
|
||||
static Object* Allocate(int at_least_space_for);
|
||||
@ -1936,12 +1947,13 @@ class HashTable: public FixedArray {
|
||||
}
|
||||
|
||||
static const int kNumberOfElementsIndex = 0;
|
||||
static const int kCapacityIndex = 1;
|
||||
static const int kPrefixStartIndex = 2;
|
||||
static const int kElementsStartIndex =
|
||||
static const int kNumberOfDeletedElementsIndex = 1;
|
||||
static const int kCapacityIndex = 2;
|
||||
static const int kPrefixStartIndex = 3;
|
||||
static const int kElementsStartIndex =
|
||||
kPrefixStartIndex + Shape::kPrefixSize;
|
||||
static const int kEntrySize = Shape::kEntrySize;
|
||||
static const int kElementsStartOffset =
|
||||
static const int kEntrySize = Shape::kEntrySize;
|
||||
static const int kElementsStartOffset =
|
||||
kHeaderSize + kElementsStartIndex * kPointerSize;
|
||||
|
||||
// Constant used for denoting a absent entry.
|
||||
@ -1972,6 +1984,11 @@ class HashTable: public FixedArray {
|
||||
fast_set(this, kNumberOfElementsIndex, Smi::FromInt(nof));
|
||||
}
|
||||
|
||||
// Update the number of deleted elements in the hash table.
|
||||
void SetNumberOfDeletedElements(int nod) {
|
||||
fast_set(this, kNumberOfDeletedElementsIndex, Smi::FromInt(nod));
|
||||
}
|
||||
|
||||
// Sets the capacity of the hash table.
|
||||
void SetCapacity(int capacity) {
|
||||
// To scale a computed hash code to fit within the hash table, we
|
||||
|
@ -5416,6 +5416,8 @@ class ArrayConcatVisitor {
|
||||
}
|
||||
}
|
||||
|
||||
Handle<FixedArray> storage() { return storage_; }
|
||||
|
||||
private:
|
||||
Handle<FixedArray> storage_;
|
||||
// Limit on the accepted indices. Elements with indices larger than the
|
||||
@ -5756,7 +5758,8 @@ static Object* Runtime_ArrayConcat(Arguments args) {
|
||||
IterateArguments(arguments, &visitor);
|
||||
|
||||
result->set_length(*len);
|
||||
result->set_elements(*storage);
|
||||
// Please note the storage might have changed in the visitor.
|
||||
result->set_elements(*visitor.storage());
|
||||
|
||||
return *result;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user