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

Dictionary::GenerateNewEnumerationIndices() and Dictionary::EnsureCapacity() handlified.

R=yangguo@chromium.org

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

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@20950 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent a55821ee
......@@ -6679,6 +6679,12 @@ Handle<Object> NameDictionaryShape::AsHandle(Isolate* isolate,
}
void NameDictionary::DoGenerateNewEnumerationIndices(
Handle<NameDictionary> dictionary) {
DerivedDictionary::GenerateNewEnumerationIndices(dictionary);
}
bool ObjectHashTableShape::IsMatch(Object* key, Object* other) {
return key->SameValue(other);
}
......
......@@ -14818,9 +14818,10 @@ Handle<Derived> HashTable<Derived, Shape, Key>::EnsureCapacity(
Key key,
PretenureFlag pretenure) {
Isolate* isolate = table->GetIsolate();
CALL_HEAP_FUNCTION(isolate,
table->EnsureCapacity(n, key, pretenure),
Derived);
CALL_HEAP_FUNCTION(
isolate,
static_cast<HashTable*>(*table)->EnsureCapacity(n, key, pretenure),
Derived);
}
......@@ -14992,9 +14993,9 @@ template Handle<NameDictionary>
Dictionary<NameDictionary, NameDictionaryShape, Handle<Name> >::Add(
Handle<NameDictionary>, Handle<Name>, Handle<Object>, PropertyDetails);
template MaybeObject*
template void
Dictionary<NameDictionary, NameDictionaryShape, Handle<Name> >::
GenerateNewEnumerationIndices();
GenerateNewEnumerationIndices(Handle<NameDictionary>);
template int
Dictionary<SeededNumberDictionary, SeededNumberDictionaryShape, uint32_t>::
......@@ -15014,17 +15015,17 @@ Dictionary<UnseededNumberDictionary, UnseededNumberDictionaryShape, uint32_t>::
Handle<Object>,
PropertyDetails);
template MaybeObject*
template Handle<SeededNumberDictionary>
Dictionary<SeededNumberDictionary, SeededNumberDictionaryShape, uint32_t>::
EnsureCapacity(int, uint32_t);
EnsureCapacity(Handle<SeededNumberDictionary>, int, uint32_t);
template MaybeObject*
template Handle<UnseededNumberDictionary>
Dictionary<UnseededNumberDictionary, UnseededNumberDictionaryShape, uint32_t>::
EnsureCapacity(int, uint32_t);
EnsureCapacity(Handle<UnseededNumberDictionary>, int, uint32_t);
template MaybeObject*
template Handle<NameDictionary>
Dictionary<NameDictionary, NameDictionaryShape, Handle<Name> >::
EnsureCapacity(int, Handle<Name>);
EnsureCapacity(Handle<NameDictionary>, int, Handle<Name>);
template MaybeObject*
Dictionary<SeededNumberDictionary, SeededNumberDictionaryShape, uint32_t>::
......@@ -15829,46 +15830,33 @@ Handle<Derived> Dictionary<Derived, Shape, Key>::New(
}
void NameDictionary::DoGenerateNewEnumerationIndices(
Handle<NameDictionary> dictionary) {
CALL_HEAP_FUNCTION_VOID(dictionary->GetIsolate(),
dictionary->GenerateNewEnumerationIndices());
}
template<typename Derived, typename Shape, typename Key>
MaybeObject* Dictionary<Derived, Shape, Key>::GenerateNewEnumerationIndices() {
Heap* heap = Dictionary::GetHeap();
int length = DerivedHashTable::NumberOfElements();
void Dictionary<Derived, Shape, Key>::GenerateNewEnumerationIndices(
Handle<Derived> dictionary) {
Factory* factory = dictionary->GetIsolate()->factory();
int length = dictionary->NumberOfElements();
// Allocate and initialize iteration order array.
Object* obj;
{ MaybeObject* maybe_obj = heap->AllocateFixedArray(length);
if (!maybe_obj->ToObject(&obj)) return maybe_obj;
}
FixedArray* iteration_order = FixedArray::cast(obj);
Handle<FixedArray> iteration_order = factory->NewFixedArray(length);
for (int i = 0; i < length; i++) {
iteration_order->set(i, Smi::FromInt(i));
}
// Allocate array with enumeration order.
{ MaybeObject* maybe_obj = heap->AllocateFixedArray(length);
if (!maybe_obj->ToObject(&obj)) return maybe_obj;
}
FixedArray* enumeration_order = FixedArray::cast(obj);
Handle<FixedArray> enumeration_order = factory->NewFixedArray(length);
// Fill the enumeration order array with property details.
int capacity = DerivedHashTable::Capacity();
int capacity = dictionary->Capacity();
int pos = 0;
for (int i = 0; i < capacity; i++) {
if (Dictionary::IsKey(Dictionary::KeyAt(i))) {
int index = DetailsAt(i).dictionary_index();
if (dictionary->IsKey(dictionary->KeyAt(i))) {
int index = dictionary->DetailsAt(i).dictionary_index();
enumeration_order->set(pos++, Smi::FromInt(index));
}
}
// Sort the arrays wrt. enumeration order.
iteration_order->SortPairs(enumeration_order, enumeration_order->length());
iteration_order->SortPairs(*enumeration_order, enumeration_order->length());
// Overwrite the enumeration_order with the enumeration indices.
for (int i = 0; i < length; i++) {
......@@ -15878,46 +15866,33 @@ MaybeObject* Dictionary<Derived, Shape, Key>::GenerateNewEnumerationIndices() {
}
// Update the dictionary with new indices.
capacity = DerivedHashTable::Capacity();
capacity = dictionary->Capacity();
pos = 0;
for (int i = 0; i < capacity; i++) {
if (Dictionary::IsKey(Dictionary::KeyAt(i))) {
if (dictionary->IsKey(dictionary->KeyAt(i))) {
int enum_index = Smi::cast(enumeration_order->get(pos++))->value();
PropertyDetails details = DetailsAt(i);
PropertyDetails details = dictionary->DetailsAt(i);
PropertyDetails new_details = PropertyDetails(
details.attributes(), details.type(), enum_index);
DetailsAtPut(i, new_details);
dictionary->DetailsAtPut(i, new_details);
}
}
// Set the next enumeration index.
SetNextEnumerationIndex(PropertyDetails::kInitialIndex+length);
return this;
dictionary->SetNextEnumerationIndex(PropertyDetails::kInitialIndex+length);
}
template<typename Derived, typename Shape, typename Key>
MaybeObject* Dictionary<Derived, Shape, Key>::EnsureCapacity(int n, Key key) {
Handle<Derived> Dictionary<Derived, Shape, Key>::EnsureCapacity(
Handle<Derived> dictionary, int n, Key key) {
// Check whether there are enough enumeration indices to add n elements.
if (Shape::kIsEnumerable &&
!PropertyDetails::IsValidIndex(NextEnumerationIndex() + n)) {
!PropertyDetails::IsValidIndex(dictionary->NextEnumerationIndex() + n)) {
// If not, we generate new indices for the properties.
Object* result;
{ MaybeObject* maybe_result = GenerateNewEnumerationIndices();
if (!maybe_result->ToObject(&result)) return maybe_result;
}
GenerateNewEnumerationIndices(dictionary);
}
return DerivedHashTable::EnsureCapacity(n, key);
}
template<typename Derived, typename Shape, typename Key>
Handle<Derived> Dictionary<Derived, Shape, Key>::EnsureCapacity(
Handle<Derived> obj, int n, Key key) {
Isolate* isolate = obj->GetIsolate();
CALL_HEAP_FUNCTION(isolate,
obj->EnsureCapacity(n, key),
Derived);
return DerivedHashTable::EnsureCapacity(dictionary, n, key);
}
......
......@@ -4070,8 +4070,6 @@ class Dictionary: public HashTable<Derived, Shape, Key> {
PretenureFlag pretenure = NOT_TENURED);
// Ensure enough space for n additional elements.
MUST_USE_RESULT MaybeObject* EnsureCapacity(int n, Key key);
static Handle<Derived> EnsureCapacity(Handle<Derived> obj, int n, Key key);
#ifdef OBJECT_PRINT
......@@ -4115,7 +4113,7 @@ class Dictionary: public HashTable<Derived, Shape, Key> {
uint32_t hash);
// Generate new enumeration indices to avoid enumeration index overflow.
MUST_USE_RESULT MaybeObject* GenerateNewEnumerationIndices();
static void GenerateNewEnumerationIndices(Handle<Derived> dictionary);
static const int kMaxNumberKeyIndex = DerivedHashTable::kPrefixStartIndex;
static const int kNextEnumerationIndexIndex = kMaxNumberKeyIndex + 1;
};
......@@ -4138,6 +4136,9 @@ class NameDictionaryShape : public BaseShape<Handle<Name> > {
class NameDictionary: public Dictionary<NameDictionary,
NameDictionaryShape,
Handle<Name> > {
typedef Dictionary<
NameDictionary, NameDictionaryShape, Handle<Name> > DerivedDictionary;
public:
static inline NameDictionary* cast(Object* obj) {
ASSERT(obj->IsDictionary());
......@@ -4146,7 +4147,7 @@ class NameDictionary: public Dictionary<NameDictionary,
// Copies enumerable keys to preallocated fixed array.
void CopyEnumKeysTo(FixedArray* storage);
static void DoGenerateNewEnumerationIndices(
inline static void DoGenerateNewEnumerationIndices(
Handle<NameDictionary> dictionary);
// Find entry for key, otherwise return kNotFound. Optimized version of
......
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