Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index d4116b34c8547173c19ff95f990e655652f0619d..d0530d3ed63acb53deec81ea937e7032ee9eb4c7 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -692,13 +692,6 @@ void JSObject::SetNormalizedProperty(Handle<JSObject> object, |
} |
-// TODO(mstarzinger): Temporary wrapper until target is handlified. |
-Handle<NameDictionary> NameDictionaryShrink(Handle<NameDictionary> dict, |
- Handle<Name> name) { |
- CALL_HEAP_FUNCTION(dict->GetIsolate(), dict->Shrink(*name), NameDictionary); |
-} |
- |
- |
Handle<Object> JSObject::DeleteNormalizedProperty(Handle<JSObject> object, |
Handle<Name> name, |
DeleteMode mode) { |
@@ -728,7 +721,7 @@ Handle<Object> JSObject::DeleteNormalizedProperty(Handle<JSObject> object, |
Handle<Object> deleted(dictionary->DeleteProperty(entry, mode), isolate); |
if (*deleted == isolate->heap()->true_value()) { |
Handle<NameDictionary> new_properties = |
- NameDictionaryShrink(dictionary, name); |
+ NameDictionary::Shrink(dictionary, *name); |
object->set_properties(*new_properties); |
} |
return deleted; |
@@ -13172,12 +13165,12 @@ bool JSObject::ShouldConvertToFastDoubleElements( |
// together, so even though this function belongs in objects-debug.cc, |
// we keep it here instead to satisfy certain compilers. |
#ifdef OBJECT_PRINT |
-template<typename Shape, typename Key> |
-void Dictionary<Shape, Key>::Print(FILE* out) { |
- int capacity = HashTable<Shape, Key>::Capacity(); |
+template<typename Derived, typename Shape, typename Key> |
+void Dictionary<Derived, Shape, Key>::Print(FILE* out) { |
+ int capacity = DerivedHashTable::Capacity(); |
for (int i = 0; i < capacity; i++) { |
- Object* k = HashTable<Shape, Key>::KeyAt(i); |
- if (HashTable<Shape, Key>::IsKey(k)) { |
+ Object* k = DerivedHashTable::KeyAt(i); |
+ if (DerivedHashTable::IsKey(k)) { |
PrintF(out, " "); |
if (k->IsString()) { |
String::cast(k)->StringPrint(out); |
@@ -13193,15 +13186,15 @@ void Dictionary<Shape, Key>::Print(FILE* out) { |
#endif |
-template<typename Shape, typename Key> |
-void Dictionary<Shape, Key>::CopyValuesTo(FixedArray* elements) { |
+template<typename Derived, typename Shape, typename Key> |
+void Dictionary<Derived, Shape, Key>::CopyValuesTo(FixedArray* elements) { |
int pos = 0; |
- int capacity = HashTable<Shape, Key>::Capacity(); |
+ int capacity = DerivedHashTable::Capacity(); |
DisallowHeapAllocation no_gc; |
WriteBarrierMode mode = elements->GetWriteBarrierMode(no_gc); |
for (int i = 0; i < capacity; i++) { |
- Object* k = Dictionary<Shape, Key>::KeyAt(i); |
- if (Dictionary<Shape, Key>::IsKey(k)) { |
+ Object* k = Dictionary::KeyAt(i); |
+ if (Dictionary::IsKey(k)) { |
elements->set(pos++, ValueAt(i), mode); |
} |
} |
@@ -13908,25 +13901,26 @@ class InternalizedStringKey : public HashTableKey { |
}; |
-template<typename Shape, typename Key> |
-void HashTable<Shape, Key>::IteratePrefix(ObjectVisitor* v) { |
+template<typename Derived, typename Shape, typename Key> |
+void HashTable<Derived, Shape, Key>::IteratePrefix(ObjectVisitor* v) { |
IteratePointers(v, 0, kElementsStartOffset); |
} |
-template<typename Shape, typename Key> |
-void HashTable<Shape, Key>::IterateElements(ObjectVisitor* v) { |
+template<typename Derived, typename Shape, typename Key> |
+void HashTable<Derived, Shape, Key>::IterateElements(ObjectVisitor* v) { |
IteratePointers(v, |
kElementsStartOffset, |
kHeaderSize + length() * kPointerSize); |
} |
-template<typename Shape, typename Key> |
-MaybeObject* HashTable<Shape, Key>::Allocate(Heap* heap, |
- int at_least_space_for, |
- MinimumCapacity capacity_option, |
- PretenureFlag pretenure) { |
+template<typename Derived, typename Shape, typename Key> |
+MaybeObject* HashTable<Derived, Shape, Key>::Allocate( |
+ Heap* heap, |
+ int at_least_space_for, |
+ MinimumCapacity capacity_option, |
+ PretenureFlag pretenure) { |
ASSERT(!capacity_option || IsPowerOf2(at_least_space_for)); |
int capacity = (capacity_option == USE_CUSTOM_MINIMUM_CAPACITY) |
? at_least_space_for |
@@ -13947,10 +13941,23 @@ MaybeObject* HashTable<Shape, Key>::Allocate(Heap* heap, |
} |
+template<typename Derived, typename Shape, typename Key> |
+Handle<Derived> HashTable<Derived, Shape, Key>::New( |
+ Isolate* isolate, |
+ int at_least_space_for, |
+ MinimumCapacity capacity_option, |
+ PretenureFlag pretenure) { |
+ CALL_HEAP_FUNCTION( |
+ isolate, |
+ Allocate(isolate->heap(), at_least_space_for, capacity_option, pretenure), |
+ Derived); |
+} |
+ |
+ |
// Find entry for key otherwise return kNotFound. |
int NameDictionary::FindEntry(Name* key) { |
if (!key->IsUniqueName()) { |
- return HashTable<NameDictionaryShape, Name*>::FindEntry(key); |
+ return DerivedHashTable::FindEntry(key); |
} |
// Optimized for unique names. Knowledge of the key type allows: |
@@ -13987,8 +13994,8 @@ int NameDictionary::FindEntry(Name* key) { |
} |
-template<typename Shape, typename Key> |
-MaybeObject* HashTable<Shape, Key>::Rehash(HashTable* new_table, Key key) { |
+template<typename Derived, typename Shape, typename Key> |
+void HashTable<Derived, Shape, Key>::Rehash(Derived* new_table, Key key) { |
ASSERT(NumberOfElements() < new_table->Capacity()); |
DisallowHeapAllocation no_gc; |
@@ -14007,7 +14014,7 @@ MaybeObject* HashTable<Shape, Key>::Rehash(HashTable* new_table, Key key) { |
uint32_t from_index = EntryToIndex(i); |
Object* k = get(from_index); |
if (IsKey(k)) { |
- uint32_t hash = HashTable<Shape, Key>::HashForObject(key, k); |
+ uint32_t hash = HashTable::HashForObject(key, k); |
uint32_t insertion_index = |
EntryToIndex(new_table->FindInsertionEntry(hash)); |
for (int j = 0; j < Shape::kEntrySize; j++) { |
@@ -14017,16 +14024,16 @@ MaybeObject* HashTable<Shape, Key>::Rehash(HashTable* new_table, Key key) { |
} |
new_table->SetNumberOfElements(NumberOfElements()); |
new_table->SetNumberOfDeletedElements(0); |
- return new_table; |
} |
-template<typename Shape, typename Key> |
-uint32_t HashTable<Shape, Key>::EntryForProbe(Key key, |
- Object* k, |
- int probe, |
- uint32_t expected) { |
- uint32_t hash = HashTable<Shape, Key>::HashForObject(key, k); |
+template<typename Derived, typename Shape, typename Key> |
+uint32_t HashTable<Derived, Shape, Key>::EntryForProbe( |
+ Key key, |
+ Object* k, |
+ int probe, |
+ uint32_t expected) { |
+ uint32_t hash = HashTable::HashForObject(key, k); |
uint32_t capacity = Capacity(); |
uint32_t entry = FirstProbe(hash, capacity); |
for (int i = 1; i < probe; i++) { |
@@ -14037,10 +14044,10 @@ uint32_t HashTable<Shape, Key>::EntryForProbe(Key key, |
} |
-template<typename Shape, typename Key> |
-void HashTable<Shape, Key>::Swap(uint32_t entry1, |
- uint32_t entry2, |
- WriteBarrierMode mode) { |
+template<typename Derived, typename Shape, typename Key> |
+void HashTable<Derived, Shape, Key>::Swap(uint32_t entry1, |
+ uint32_t entry2, |
+ WriteBarrierMode mode) { |
int index1 = EntryToIndex(entry1); |
int index2 = EntryToIndex(entry2); |
Object* temp[Shape::kEntrySize]; |
@@ -14056,8 +14063,8 @@ void HashTable<Shape, Key>::Swap(uint32_t entry1, |
} |
-template<typename Shape, typename Key> |
-void HashTable<Shape, Key>::Rehash(Key key) { |
+template<typename Derived, typename Shape, typename Key> |
+void HashTable<Derived, Shape, Key>::Rehash(Key key) { |
DisallowHeapAllocation no_gc; |
WriteBarrierMode mode = GetWriteBarrierMode(no_gc); |
uint32_t capacity = Capacity(); |
@@ -14089,10 +14096,11 @@ void HashTable<Shape, Key>::Rehash(Key key) { |
} |
-template<typename Shape, typename Key> |
-MaybeObject* HashTable<Shape, Key>::EnsureCapacity(int n, |
- Key key, |
- PretenureFlag pretenure) { |
+template<typename Derived, typename Shape, typename Key> |
+MaybeObject* HashTable<Derived, Shape, Key>::EnsureCapacity( |
+ int n, |
+ Key key, |
+ PretenureFlag pretenure) { |
int capacity = Capacity(); |
int nof = NumberOfElements() + n; |
int nod = NumberOfDeletedElements(); |
@@ -14116,44 +14124,45 @@ MaybeObject* HashTable<Shape, Key>::EnsureCapacity(int n, |
if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
} |
- return Rehash(HashTable::cast(obj), key); |
+ Rehash(Derived::cast(obj), key); |
+ return Derived::cast(obj); |
} |
-template<typename Shape, typename Key> |
-MaybeObject* HashTable<Shape, Key>::Shrink(Key key) { |
- int capacity = Capacity(); |
- int nof = NumberOfElements(); |
+template<typename Derived, typename Shape, typename Key> |
+Handle<Derived> HashTable<Derived, Shape, Key>::Shrink(Handle<Derived> table, |
+ Key key) { |
+ int capacity = table->Capacity(); |
+ int nof = table->NumberOfElements(); |
// Shrink to fit the number of elements if only a quarter of the |
// capacity is filled with elements. |
- if (nof > (capacity >> 2)) return this; |
+ if (nof > (capacity >> 2)) return table; |
// Allocate a new dictionary with room for at least the current |
// number of elements. The allocation method will make sure that |
// there is extra room in the dictionary for additions. Don't go |
// lower than room for 16 elements. |
int at_least_room_for = nof; |
- if (at_least_room_for < 16) return this; |
+ if (at_least_room_for < 16) return table; |
+ Isolate* isolate = table->GetIsolate(); |
const int kMinCapacityForPretenure = 256; |
bool pretenure = |
(at_least_room_for > kMinCapacityForPretenure) && |
- !GetHeap()->InNewSpace(this); |
- Object* obj; |
- { MaybeObject* maybe_obj = |
- Allocate(GetHeap(), |
- at_least_room_for, |
- USE_DEFAULT_MINIMUM_CAPACITY, |
- pretenure ? TENURED : NOT_TENURED); |
- if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
- } |
+ !isolate->heap()->InNewSpace(*table); |
+ Handle<Derived> new_table = New( |
+ isolate, |
+ at_least_room_for, |
+ USE_DEFAULT_MINIMUM_CAPACITY, |
+ pretenure ? TENURED : NOT_TENURED); |
- return Rehash(HashTable::cast(obj), key); |
+ table->Rehash(*new_table, key); |
+ return new_table; |
} |
-template<typename Shape, typename Key> |
-uint32_t HashTable<Shape, Key>::FindInsertionEntry(uint32_t hash) { |
+template<typename Derived, typename Shape, typename Key> |
+uint32_t HashTable<Derived, Shape, Key>::FindInsertionEntry(uint32_t hash) { |
uint32_t capacity = Capacity(); |
uint32_t entry = FirstProbe(hash, capacity); |
uint32_t count = 1; |
@@ -14170,129 +14179,165 @@ uint32_t HashTable<Shape, Key>::FindInsertionEntry(uint32_t hash) { |
// Force instantiation of template instances class. |
// Please note this list is compiler dependent. |
-template class HashTable<StringTableShape, HashTableKey*>; |
+template class HashTable<StringTable, StringTableShape, HashTableKey*>; |
-template class HashTable<CompilationCacheShape, HashTableKey*>; |
+template class HashTable<CompilationCacheTable, |
+ CompilationCacheShape, |
+ HashTableKey*>; |
-template class HashTable<MapCacheShape, HashTableKey*>; |
+template class HashTable<MapCache, MapCacheShape, HashTableKey*>; |
-template class HashTable<ObjectHashTableShape, Object*>; |
+template class HashTable<ObjectHashTable, ObjectHashTableShape, Object*>; |
-template class HashTable<WeakHashTableShape<2>, Object*>; |
+template class HashTable<WeakHashTable, WeakHashTableShape<2>, Object*>; |
-template class Dictionary<NameDictionaryShape, Name*>; |
+template class Dictionary<NameDictionary, NameDictionaryShape, Name*>; |
-template class Dictionary<SeededNumberDictionaryShape, uint32_t>; |
+template class Dictionary<SeededNumberDictionary, |
+ SeededNumberDictionaryShape, |
+ uint32_t>; |
-template class Dictionary<UnseededNumberDictionaryShape, uint32_t>; |
+template class Dictionary<UnseededNumberDictionary, |
+ UnseededNumberDictionaryShape, |
+ uint32_t>; |
-template MaybeObject* Dictionary<SeededNumberDictionaryShape, uint32_t>:: |
+template MaybeObject* |
+Dictionary<SeededNumberDictionary, SeededNumberDictionaryShape, uint32_t>:: |
Allocate(Heap* heap, int at_least_space_for, PretenureFlag pretenure); |
-template MaybeObject* Dictionary<UnseededNumberDictionaryShape, uint32_t>:: |
+template MaybeObject* |
+Dictionary<UnseededNumberDictionary, UnseededNumberDictionaryShape, uint32_t>:: |
Allocate(Heap* heap, int at_least_space_for, PretenureFlag pretenure); |
-template MaybeObject* Dictionary<NameDictionaryShape, Name*>:: |
+template MaybeObject* Dictionary<NameDictionary, NameDictionaryShape, Name*>:: |
Allocate(Heap* heap, int n, PretenureFlag pretenure); |
-template MaybeObject* Dictionary<SeededNumberDictionaryShape, uint32_t>::AtPut( |
- uint32_t, Object*); |
+template MaybeObject* |
+Dictionary<SeededNumberDictionary, SeededNumberDictionaryShape, uint32_t>:: |
+ AtPut(uint32_t, Object*); |
-template MaybeObject* Dictionary<UnseededNumberDictionaryShape, uint32_t>:: |
+template MaybeObject* |
+Dictionary<UnseededNumberDictionary, UnseededNumberDictionaryShape, uint32_t>:: |
AtPut(uint32_t, Object*); |
-template Object* Dictionary<SeededNumberDictionaryShape, uint32_t>:: |
+template Object* |
+Dictionary<SeededNumberDictionary, SeededNumberDictionaryShape, uint32_t>:: |
SlowReverseLookup(Object* value); |
-template Object* Dictionary<UnseededNumberDictionaryShape, uint32_t>:: |
+template Object* |
+Dictionary<UnseededNumberDictionary, UnseededNumberDictionaryShape, uint32_t>:: |
SlowReverseLookup(Object* value); |
-template Object* Dictionary<NameDictionaryShape, Name*>::SlowReverseLookup( |
+template Object* |
+Dictionary<NameDictionary, NameDictionaryShape, Name*>::SlowReverseLookup( |
Object*); |
-template void Dictionary<SeededNumberDictionaryShape, uint32_t>::CopyKeysTo( |
- FixedArray*, |
- PropertyAttributes, |
- Dictionary<SeededNumberDictionaryShape, uint32_t>::SortMode); |
- |
-template Object* Dictionary<NameDictionaryShape, Name*>::DeleteProperty( |
+template void |
+Dictionary<SeededNumberDictionary, SeededNumberDictionaryShape, uint32_t>:: |
+ CopyKeysTo( |
+ FixedArray*, |
+ PropertyAttributes, |
+ Dictionary<SeededNumberDictionary, |
+ SeededNumberDictionaryShape, |
+ uint32_t>::SortMode); |
+ |
+template Object* |
+Dictionary<NameDictionary, NameDictionaryShape, Name*>::DeleteProperty( |
int, JSObject::DeleteMode); |
-template Handle<Object> Dictionary<NameDictionaryShape, Name*>::DeleteProperty( |
- Handle<Dictionary<NameDictionaryShape, Name*> >, |
+template Handle<Object> |
+Dictionary<NameDictionary, NameDictionaryShape, Name*>::DeleteProperty( |
+ Handle<Dictionary<NameDictionary, NameDictionaryShape, Name*> >, |
int, |
JSObject::DeleteMode); |
-template Object* Dictionary<SeededNumberDictionaryShape, uint32_t>:: |
+template Object* |
+Dictionary<SeededNumberDictionary, SeededNumberDictionaryShape, uint32_t>:: |
DeleteProperty(int, JSObject::DeleteMode); |
template Handle<Object> |
-Dictionary<SeededNumberDictionaryShape, uint32_t>::DeleteProperty( |
- Handle<Dictionary<SeededNumberDictionaryShape, uint32_t> >, |
- int, |
- JSObject::DeleteMode); |
- |
-template MaybeObject* Dictionary<NameDictionaryShape, Name*>::Shrink(Name* n); |
- |
-template MaybeObject* Dictionary<SeededNumberDictionaryShape, uint32_t>::Shrink( |
- uint32_t); |
-template Handle<FixedArray> |
-Dictionary<SeededNumberDictionaryShape, uint32_t>::Shrink( |
- Handle<Dictionary<SeededNumberDictionaryShape, uint32_t> >, |
- uint32_t); |
- |
-template void Dictionary<NameDictionaryShape, Name*>::CopyKeysTo( |
- FixedArray*, |
- int, |
- PropertyAttributes, |
- Dictionary<NameDictionaryShape, Name*>::SortMode); |
+Dictionary<SeededNumberDictionary, SeededNumberDictionaryShape, uint32_t>:: |
+ DeleteProperty( |
+ Handle<Dictionary<SeededNumberDictionary, |
+ SeededNumberDictionaryShape, |
+ uint32_t> >, |
+ int, |
+ JSObject::DeleteMode); |
+ |
+template Handle<NameDictionary> |
+HashTable<NameDictionary, NameDictionaryShape, Name*>:: |
+ Shrink(Handle<NameDictionary>, Name* n); |
+ |
+template Handle<SeededNumberDictionary> |
+HashTable<SeededNumberDictionary, SeededNumberDictionaryShape, uint32_t>:: |
+ Shrink(Handle<SeededNumberDictionary>, uint32_t); |
+ |
+template void Dictionary<NameDictionary, NameDictionaryShape, Name*>:: |
+ CopyKeysTo( |
+ FixedArray*, |
+ int, |
+ PropertyAttributes, |
+ Dictionary<NameDictionary, NameDictionaryShape, Name*>::SortMode); |
template int |
-Dictionary<NameDictionaryShape, Name*>::NumberOfElementsFilterAttributes( |
- PropertyAttributes); |
+Dictionary<NameDictionary, NameDictionaryShape, Name*>:: |
+ NumberOfElementsFilterAttributes(PropertyAttributes); |
-template MaybeObject* Dictionary<NameDictionaryShape, Name*>::Add( |
+template MaybeObject* |
+Dictionary<NameDictionary, NameDictionaryShape, Name*>::Add( |
Name*, Object*, PropertyDetails); |
template MaybeObject* |
-Dictionary<NameDictionaryShape, Name*>::GenerateNewEnumerationIndices(); |
+Dictionary<NameDictionary, NameDictionaryShape, Name*>:: |
+ GenerateNewEnumerationIndices(); |
template int |
-Dictionary<SeededNumberDictionaryShape, uint32_t>:: |
+Dictionary<SeededNumberDictionary, SeededNumberDictionaryShape, uint32_t>:: |
NumberOfElementsFilterAttributes(PropertyAttributes); |
-template MaybeObject* Dictionary<SeededNumberDictionaryShape, uint32_t>::Add( |
+template MaybeObject* |
+Dictionary<SeededNumberDictionary, SeededNumberDictionaryShape, uint32_t>::Add( |
uint32_t, Object*, PropertyDetails); |
-template MaybeObject* Dictionary<UnseededNumberDictionaryShape, uint32_t>::Add( |
- uint32_t, Object*, PropertyDetails); |
+template MaybeObject* |
+Dictionary<UnseededNumberDictionary, UnseededNumberDictionaryShape, uint32_t>:: |
+ Add(uint32_t, Object*, PropertyDetails); |
-template MaybeObject* Dictionary<SeededNumberDictionaryShape, uint32_t>:: |
+template MaybeObject* |
+Dictionary<SeededNumberDictionary, SeededNumberDictionaryShape, uint32_t>:: |
EnsureCapacity(int, uint32_t); |
-template MaybeObject* Dictionary<UnseededNumberDictionaryShape, uint32_t>:: |
+template MaybeObject* |
+Dictionary<UnseededNumberDictionary, UnseededNumberDictionaryShape, uint32_t>:: |
EnsureCapacity(int, uint32_t); |
-template MaybeObject* Dictionary<NameDictionaryShape, Name*>:: |
+template MaybeObject* |
+Dictionary<NameDictionary, NameDictionaryShape, Name*>:: |
EnsureCapacity(int, Name*); |
-template MaybeObject* Dictionary<SeededNumberDictionaryShape, uint32_t>:: |
+template MaybeObject* |
+Dictionary<SeededNumberDictionary, SeededNumberDictionaryShape, uint32_t>:: |
AddEntry(uint32_t, Object*, PropertyDetails, uint32_t); |
-template MaybeObject* Dictionary<UnseededNumberDictionaryShape, uint32_t>:: |
+template MaybeObject* |
+Dictionary<UnseededNumberDictionary, UnseededNumberDictionaryShape, uint32_t>:: |
AddEntry(uint32_t, Object*, PropertyDetails, uint32_t); |
-template MaybeObject* Dictionary<NameDictionaryShape, Name*>::AddEntry( |
+template MaybeObject* |
+Dictionary<NameDictionary, NameDictionaryShape, Name*>::AddEntry( |
Name*, Object*, PropertyDetails, uint32_t); |
template |
-int Dictionary<SeededNumberDictionaryShape, uint32_t>::NumberOfEnumElements(); |
+int Dictionary<SeededNumberDictionary, SeededNumberDictionaryShape, uint32_t>:: |
+ NumberOfEnumElements(); |
template |
-int Dictionary<NameDictionaryShape, Name*>::NumberOfEnumElements(); |
+int Dictionary<NameDictionary, NameDictionaryShape, Name*>:: |
+ NumberOfEnumElements(); |
template |
-int HashTable<SeededNumberDictionaryShape, uint32_t>::FindEntry(uint32_t); |
+int HashTable<SeededNumberDictionary, SeededNumberDictionaryShape, uint32_t>:: |
+ FindEntry(uint32_t); |
Handle<Object> JSObject::PrepareSlowElementsForSort( |
@@ -14909,6 +14954,7 @@ class TwoCharHashTableKey : public HashTableKey { |
bool StringTable::LookupStringIfExists(String* string, String** result) { |
+ SLOW_ASSERT(this == HeapObject::cast(this)->GetHeap()->string_table()); |
InternalizedStringKey key(string); |
int entry = FindEntry(&key); |
if (entry == kNotFound) { |
@@ -14924,6 +14970,7 @@ bool StringTable::LookupStringIfExists(String* string, String** result) { |
bool StringTable::LookupTwoCharsStringIfExists(uint16_t c1, |
uint16_t c2, |
String** result) { |
+ SLOW_ASSERT(this == HeapObject::cast(this)->GetHeap()->string_table()); |
TwoCharHashTableKey key(c1, c2, GetHeap()->HashSeed()); |
int entry = FindEntry(&key); |
if (entry == kNotFound) { |
@@ -14937,6 +14984,7 @@ bool StringTable::LookupTwoCharsStringIfExists(uint16_t c1, |
MaybeObject* StringTable::LookupKey(HashTableKey* key, Object** s) { |
+ SLOW_ASSERT(this == HeapObject::cast(this)->GetHeap()->string_table()); |
int entry = FindEntry(key); |
// String already in table. |
@@ -15138,13 +15186,14 @@ MaybeObject* MapCache::Put(FixedArray* array, Map* value) { |
} |
-template<typename Shape, typename Key> |
-MaybeObject* Dictionary<Shape, Key>::Allocate(Heap* heap, |
- int at_least_space_for, |
- PretenureFlag pretenure) { |
+template<typename Derived, typename Shape, typename Key> |
+MaybeObject* Dictionary<Derived, Shape, Key>::Allocate( |
+ Heap* heap, |
+ int at_least_space_for, |
+ PretenureFlag pretenure) { |
Object* obj; |
{ MaybeObject* maybe_obj = |
- HashTable<Shape, Key>::Allocate( |
+ DerivedHashTable::Allocate( |
heap, |
at_least_space_for, |
USE_DEFAULT_MINIMUM_CAPACITY, |
@@ -15152,7 +15201,7 @@ MaybeObject* Dictionary<Shape, Key>::Allocate(Heap* heap, |
if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
} |
// Initialize the next enumeration index. |
- Dictionary<Shape, Key>::cast(obj)-> |
+ Dictionary::cast(obj)-> |
SetNextEnumerationIndex(PropertyDetails::kInitialIndex); |
return obj; |
} |
@@ -15164,10 +15213,10 @@ void NameDictionary::DoGenerateNewEnumerationIndices( |
dictionary->GenerateNewEnumerationIndices()); |
} |
-template<typename Shape, typename Key> |
-MaybeObject* Dictionary<Shape, Key>::GenerateNewEnumerationIndices() { |
- Heap* heap = Dictionary<Shape, Key>::GetHeap(); |
- int length = HashTable<Shape, Key>::NumberOfElements(); |
+template<typename Derived, typename Shape, typename Key> |
+MaybeObject* Dictionary<Derived, Shape, Key>::GenerateNewEnumerationIndices() { |
+ Heap* heap = Dictionary::GetHeap(); |
+ int length = DerivedHashTable::NumberOfElements(); |
// Allocate and initialize iteration order array. |
Object* obj; |
@@ -15186,10 +15235,10 @@ MaybeObject* Dictionary<Shape, Key>::GenerateNewEnumerationIndices() { |
FixedArray* enumeration_order = FixedArray::cast(obj); |
// Fill the enumeration order array with property details. |
- int capacity = HashTable<Shape, Key>::Capacity(); |
+ int capacity = DerivedHashTable::Capacity(); |
int pos = 0; |
for (int i = 0; i < capacity; i++) { |
- if (Dictionary<Shape, Key>::IsKey(Dictionary<Shape, Key>::KeyAt(i))) { |
+ if (Dictionary::IsKey(Dictionary::KeyAt(i))) { |
int index = DetailsAt(i).dictionary_index(); |
enumeration_order->set(pos++, Smi::FromInt(index)); |
} |
@@ -15206,10 +15255,10 @@ MaybeObject* Dictionary<Shape, Key>::GenerateNewEnumerationIndices() { |
} |
// Update the dictionary with new indices. |
- capacity = HashTable<Shape, Key>::Capacity(); |
+ capacity = DerivedHashTable::Capacity(); |
pos = 0; |
for (int i = 0; i < capacity; i++) { |
- if (Dictionary<Shape, Key>::IsKey(Dictionary<Shape, Key>::KeyAt(i))) { |
+ if (Dictionary::IsKey(Dictionary::KeyAt(i))) { |
int enum_index = Smi::cast(enumeration_order->get(pos++))->value(); |
PropertyDetails details = DetailsAt(i); |
PropertyDetails new_details = PropertyDetails( |
@@ -15223,8 +15272,8 @@ MaybeObject* Dictionary<Shape, Key>::GenerateNewEnumerationIndices() { |
return this; |
} |
-template<typename Shape, typename Key> |
-MaybeObject* Dictionary<Shape, Key>::EnsureCapacity(int n, Key key) { |
+template<typename Derived, typename Shape, typename Key> |
+MaybeObject* Dictionary<Derived, Shape, Key>::EnsureCapacity(int n, Key key) { |
// Check whether there are enough enumeration indices to add n elements. |
if (Shape::kIsEnumerable && |
!PropertyDetails::IsValidIndex(NextEnumerationIndex() + n)) { |
@@ -15234,14 +15283,14 @@ MaybeObject* Dictionary<Shape, Key>::EnsureCapacity(int n, Key key) { |
if (!maybe_result->ToObject(&result)) return maybe_result; |
} |
} |
- return HashTable<Shape, Key>::EnsureCapacity(n, key); |
+ return DerivedHashTable::EnsureCapacity(n, key); |
} |
// TODO(ishell): Temporary wrapper until handlified. |
-template<typename Shape, typename Key> |
-Handle<Object> Dictionary<Shape, Key>::DeleteProperty( |
- Handle<Dictionary<Shape, Key> > dictionary, |
+template<typename Derived, typename Shape, typename Key> |
+Handle<Object> Dictionary<Derived, Shape, Key>::DeleteProperty( |
+ Handle<Dictionary<Derived, Shape, Key> > dictionary, |
int entry, |
JSObject::DeleteMode mode) { |
CALL_HEAP_FUNCTION(dictionary->GetIsolate(), |
@@ -15250,44 +15299,28 @@ Handle<Object> Dictionary<Shape, Key>::DeleteProperty( |
} |
-template<typename Shape, typename Key> |
-Object* Dictionary<Shape, Key>::DeleteProperty(int entry, |
- JSReceiver::DeleteMode mode) { |
- Heap* heap = Dictionary<Shape, Key>::GetHeap(); |
+template<typename Derived, typename Shape, typename Key> |
+Object* Dictionary<Derived, Shape, Key>::DeleteProperty( |
+ int entry, |
+ JSReceiver::DeleteMode mode) { |
+ Heap* heap = Dictionary::GetHeap(); |
PropertyDetails details = DetailsAt(entry); |
// Ignore attributes if forcing a deletion. |
if (details.IsDontDelete() && mode != JSReceiver::FORCE_DELETION) { |
return heap->false_value(); |
} |
SetEntry(entry, heap->the_hole_value(), heap->the_hole_value()); |
- HashTable<Shape, Key>::ElementRemoved(); |
+ DerivedHashTable::ElementRemoved(); |
return heap->true_value(); |
} |
-// TODO(ishell): Temporary wrapper until handlified. |
-template<typename Shape, typename Key> |
-Handle<FixedArray> Dictionary<Shape, Key>::Shrink( |
- Handle<Dictionary<Shape, Key> > dictionary, |
- Key key) { |
- CALL_HEAP_FUNCTION(dictionary->GetIsolate(), |
- dictionary->Shrink(key), |
- FixedArray); |
-} |
- |
- |
-template<typename Shape, typename Key> |
-MaybeObject* Dictionary<Shape, Key>::Shrink(Key key) { |
- return HashTable<Shape, Key>::Shrink(key); |
-} |
- |
- |
-template<typename Shape, typename Key> |
-MaybeObject* Dictionary<Shape, Key>::AtPut(Key key, Object* value) { |
+template<typename Derived, typename Shape, typename Key> |
+MaybeObject* Dictionary<Derived, Shape, Key>::AtPut(Key key, Object* value) { |
int entry = this->FindEntry(key); |
// If the entry is present set the value; |
- if (entry != Dictionary<Shape, Key>::kNotFound) { |
+ if (entry != Dictionary::kNotFound) { |
ValueAtPut(entry, value); |
return this; |
} |
@@ -15304,41 +15337,43 @@ MaybeObject* Dictionary<Shape, Key>::AtPut(Key key, Object* value) { |
} |
PropertyDetails details = PropertyDetails(NONE, NORMAL, 0); |
- return Dictionary<Shape, Key>::cast(obj)->AddEntry(key, value, details, |
- Dictionary<Shape, Key>::Hash(key)); |
+ return Dictionary::cast(obj)->AddEntry( |
+ key, value, details, Dictionary::Hash(key)); |
} |
-template<typename Shape, typename Key> |
-MaybeObject* Dictionary<Shape, Key>::Add(Key key, |
- Object* value, |
- PropertyDetails details) { |
+template<typename Derived, typename Shape, typename Key> |
+MaybeObject* Dictionary<Derived, Shape, Key>::Add( |
+ Key key, |
+ Object* value, |
+ PropertyDetails details) { |
// Valdate key is absent. |
- SLOW_ASSERT((this->FindEntry(key) == Dictionary<Shape, Key>::kNotFound)); |
+ SLOW_ASSERT((this->FindEntry(key) == Dictionary::kNotFound)); |
// Check whether the dictionary should be extended. |
Object* obj; |
{ MaybeObject* maybe_obj = EnsureCapacity(1, key); |
if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
} |
- return Dictionary<Shape, Key>::cast(obj)->AddEntry(key, value, details, |
- Dictionary<Shape, Key>::Hash(key)); |
+ return Dictionary::cast(obj)->AddEntry( |
+ key, value, details, Dictionary::Hash(key)); |
} |
// Add a key, value pair to the dictionary. |
-template<typename Shape, typename Key> |
-MaybeObject* Dictionary<Shape, Key>::AddEntry(Key key, |
- Object* value, |
- PropertyDetails details, |
- uint32_t hash) { |
+template<typename Derived, typename Shape, typename Key> |
+MaybeObject* Dictionary<Derived, Shape, Key>::AddEntry( |
+ Key key, |
+ Object* value, |
+ PropertyDetails details, |
+ uint32_t hash) { |
// Compute the key object. |
Object* k; |
{ MaybeObject* maybe_k = Shape::AsObject(this->GetHeap(), key); |
if (!maybe_k->ToObject(&k)) return maybe_k; |
} |
- uint32_t entry = Dictionary<Shape, Key>::FindInsertionEntry(hash); |
+ uint32_t entry = Dictionary::FindInsertionEntry(hash); |
// Insert element at empty or deleted entry |
if (!details.IsDeleted() && |
details.dictionary_index() == 0 && |
@@ -15350,9 +15385,9 @@ MaybeObject* Dictionary<Shape, Key>::AddEntry(Key key, |
SetNextEnumerationIndex(index + 1); |
} |
SetEntry(entry, k, value, details); |
- ASSERT((Dictionary<Shape, Key>::KeyAt(entry)->IsNumber() || |
- Dictionary<Shape, Key>::KeyAt(entry)->IsName())); |
- HashTable<Shape, Key>::ElementAdded(); |
+ ASSERT((Dictionary::KeyAt(entry)->IsNumber() || |
+ Dictionary::KeyAt(entry)->IsName())); |
+ DerivedHashTable::ElementAdded(); |
return this; |
} |
@@ -15466,14 +15501,14 @@ MaybeObject* UnseededNumberDictionary::Set(uint32_t key, |
-template<typename Shape, typename Key> |
-int Dictionary<Shape, Key>::NumberOfElementsFilterAttributes( |
+template<typename Derived, typename Shape, typename Key> |
+int Dictionary<Derived, Shape, Key>::NumberOfElementsFilterAttributes( |
PropertyAttributes filter) { |
- int capacity = HashTable<Shape, Key>::Capacity(); |
+ int capacity = DerivedHashTable::Capacity(); |
int result = 0; |
for (int i = 0; i < capacity; i++) { |
- Object* k = HashTable<Shape, Key>::KeyAt(i); |
- if (HashTable<Shape, Key>::IsKey(k) && !FilterKey(k, filter)) { |
+ Object* k = DerivedHashTable::KeyAt(i); |
+ if (DerivedHashTable::IsKey(k) && !FilterKey(k, filter)) { |
PropertyDetails details = DetailsAt(i); |
if (details.IsDeleted()) continue; |
PropertyAttributes attr = details.attributes(); |
@@ -15484,31 +15519,31 @@ int Dictionary<Shape, Key>::NumberOfElementsFilterAttributes( |
} |
-template<typename Shape, typename Key> |
-int Dictionary<Shape, Key>::NumberOfEnumElements() { |
+template<typename Derived, typename Shape, typename Key> |
+int Dictionary<Derived, Shape, Key>::NumberOfEnumElements() { |
return NumberOfElementsFilterAttributes( |
static_cast<PropertyAttributes>(DONT_ENUM | SYMBOLIC)); |
} |
-template<typename Shape, typename Key> |
-void Dictionary<Shape, Key>::CopyKeysTo( |
+template<typename Derived, typename Shape, typename Key> |
+void Dictionary<Derived, Shape, Key>::CopyKeysTo( |
FixedArray* storage, |
PropertyAttributes filter, |
- typename Dictionary<Shape, Key>::SortMode sort_mode) { |
+ typename Dictionary<Derived, Shape, Key>::SortMode sort_mode) { |
ASSERT(storage->length() >= NumberOfElementsFilterAttributes(filter)); |
- int capacity = HashTable<Shape, Key>::Capacity(); |
+ int capacity = DerivedHashTable::Capacity(); |
int index = 0; |
for (int i = 0; i < capacity; i++) { |
- Object* k = HashTable<Shape, Key>::KeyAt(i); |
- if (HashTable<Shape, Key>::IsKey(k) && !FilterKey(k, filter)) { |
+ Object* k = DerivedHashTable::KeyAt(i); |
+ if (DerivedHashTable::IsKey(k) && !FilterKey(k, filter)) { |
PropertyDetails details = DetailsAt(i); |
if (details.IsDeleted()) continue; |
PropertyAttributes attr = details.attributes(); |
if ((attr & filter) == 0) storage->set(index++, k); |
} |
} |
- if (sort_mode == Dictionary<Shape, Key>::SORTED) { |
+ if (sort_mode == Dictionary::SORTED) { |
storage->SortPairs(storage, index); |
} |
ASSERT(storage->length() >= index); |
@@ -15550,24 +15585,24 @@ void NameDictionary::CopyEnumKeysTo(FixedArray* storage) { |
} |
-template<typename Shape, typename Key> |
-void Dictionary<Shape, Key>::CopyKeysTo( |
+template<typename Derived, typename Shape, typename Key> |
+void Dictionary<Derived, Shape, Key>::CopyKeysTo( |
FixedArray* storage, |
int index, |
PropertyAttributes filter, |
- typename Dictionary<Shape, Key>::SortMode sort_mode) { |
+ typename Dictionary<Derived, Shape, Key>::SortMode sort_mode) { |
ASSERT(storage->length() >= NumberOfElementsFilterAttributes(filter)); |
- int capacity = HashTable<Shape, Key>::Capacity(); |
+ int capacity = DerivedHashTable::Capacity(); |
for (int i = 0; i < capacity; i++) { |
- Object* k = HashTable<Shape, Key>::KeyAt(i); |
- if (HashTable<Shape, Key>::IsKey(k) && !FilterKey(k, filter)) { |
+ Object* k = DerivedHashTable::KeyAt(i); |
+ if (DerivedHashTable::IsKey(k) && !FilterKey(k, filter)) { |
PropertyDetails details = DetailsAt(i); |
if (details.IsDeleted()) continue; |
PropertyAttributes attr = details.attributes(); |
if ((attr & filter) == 0) storage->set(index++, k); |
} |
} |
- if (sort_mode == Dictionary<Shape, Key>::SORTED) { |
+ if (sort_mode == Dictionary::SORTED) { |
storage->SortPairs(storage, index); |
} |
ASSERT(storage->length() >= index); |
@@ -15575,12 +15610,12 @@ void Dictionary<Shape, Key>::CopyKeysTo( |
// Backwards lookup (slow). |
-template<typename Shape, typename Key> |
-Object* Dictionary<Shape, Key>::SlowReverseLookup(Object* value) { |
- int capacity = HashTable<Shape, Key>::Capacity(); |
+template<typename Derived, typename Shape, typename Key> |
+Object* Dictionary<Derived, Shape, Key>::SlowReverseLookup(Object* value) { |
+ int capacity = DerivedHashTable::Capacity(); |
for (int i = 0; i < capacity; i++) { |
- Object* k = HashTable<Shape, Key>::KeyAt(i); |
- if (Dictionary<Shape, Key>::IsKey(k)) { |
+ Object* k = DerivedHashTable::KeyAt(i); |
+ if (Dictionary::IsKey(k)) { |
Object* e = ValueAt(i); |
if (e->IsPropertyCell()) { |
e = PropertyCell::cast(e)->value(); |
@@ -15588,7 +15623,7 @@ Object* Dictionary<Shape, Key>::SlowReverseLookup(Object* value) { |
if (e == value) return k; |
} |
} |
- Heap* heap = Dictionary<Shape, Key>::GetHeap(); |
+ Heap* heap = Dictionary::GetHeap(); |
return heap->undefined_value(); |
} |
@@ -15598,22 +15633,15 @@ Handle<ObjectHashTable> ObjectHashTable::EnsureCapacity( |
int n, |
Handle<Object> key, |
PretenureFlag pretenure) { |
- Handle<HashTable<ObjectHashTableShape, Object*> > table_base = table; |
+ Handle<HashTable<ObjectHashTable, |
+ ObjectHashTableShape, |
+ Object*> > table_base = table; |
CALL_HEAP_FUNCTION(table_base->GetIsolate(), |
table_base->EnsureCapacity(n, *key, pretenure), |
ObjectHashTable); |
} |
-Handle<ObjectHashTable> ObjectHashTable::Shrink( |
- Handle<ObjectHashTable> table, Handle<Object> key) { |
- Handle<HashTable<ObjectHashTableShape, Object*> > table_base = table; |
- CALL_HEAP_FUNCTION(table_base->GetIsolate(), |
- table_base->Shrink(*key), |
- ObjectHashTable); |
-} |
- |
- |
Object* ObjectHashTable::Lookup(Object* key) { |
ASSERT(IsKey(key)); |