Commit 43770373 authored by antonm@chromium.org's avatar antonm@chromium.org

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
parent fada07ae
......@@ -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;
}
......
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