Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(192)

Side by Side Diff: src/objects.cc

Issue 225183009: Use OrderedHashTables as the backing store of JSSet and JSMap (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Get rid of IsOrderedHashSet/Map methods Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/objects.h ('k') | src/objects-debug.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 14152 matching lines...) Expand 10 before | Expand all | Expand 10 after
14163 14163
14164 // Force instantiation of template instances class. 14164 // Force instantiation of template instances class.
14165 // Please note this list is compiler dependent. 14165 // Please note this list is compiler dependent.
14166 14166
14167 template class HashTable<StringTableShape, HashTableKey*>; 14167 template class HashTable<StringTableShape, HashTableKey*>;
14168 14168
14169 template class HashTable<CompilationCacheShape, HashTableKey*>; 14169 template class HashTable<CompilationCacheShape, HashTableKey*>;
14170 14170
14171 template class HashTable<MapCacheShape, HashTableKey*>; 14171 template class HashTable<MapCacheShape, HashTableKey*>;
14172 14172
14173 template class HashTable<ObjectHashTableShape<1>, Object*>; 14173 template class HashTable<ObjectHashTableShape, Object*>;
14174
14175 template class HashTable<ObjectHashTableShape<2>, Object*>;
14176 14174
14177 template class HashTable<WeakHashTableShape<2>, Object*>; 14175 template class HashTable<WeakHashTableShape<2>, Object*>;
14178 14176
14179 template class Dictionary<NameDictionaryShape, Name*>; 14177 template class Dictionary<NameDictionaryShape, Name*>;
14180 14178
14181 template class Dictionary<SeededNumberDictionaryShape, uint32_t>; 14179 template class Dictionary<SeededNumberDictionaryShape, uint32_t>;
14182 14180
14183 template class Dictionary<UnseededNumberDictionaryShape, uint32_t>; 14181 template class Dictionary<UnseededNumberDictionaryShape, uint32_t>;
14184 14182
14185 template MaybeObject* Dictionary<SeededNumberDictionaryShape, uint32_t>:: 14183 template MaybeObject* Dictionary<SeededNumberDictionaryShape, uint32_t>::
(...skipping 1516 matching lines...) Expand 10 before | Expand all | Expand 10 after
15702 obj->set_properties(fields); 15700 obj->set_properties(fields);
15703 ASSERT(obj->IsJSObject()); 15701 ASSERT(obj->IsJSObject());
15704 15702
15705 // Check that it really works. 15703 // Check that it really works.
15706 ASSERT(obj->HasFastProperties()); 15704 ASSERT(obj->HasFastProperties());
15707 15705
15708 return obj; 15706 return obj;
15709 } 15707 }
15710 15708
15711 15709
15712 Handle<ObjectHashSet> ObjectHashSet::EnsureCapacity(
15713 Handle<ObjectHashSet> table,
15714 int n,
15715 Handle<Object> key,
15716 PretenureFlag pretenure) {
15717 Handle<HashTable<ObjectHashTableShape<1>, Object*> > table_base = table;
15718 CALL_HEAP_FUNCTION(table_base->GetIsolate(),
15719 table_base->EnsureCapacity(n, *key, pretenure),
15720 ObjectHashSet);
15721 }
15722
15723
15724 Handle<ObjectHashSet> ObjectHashSet::Shrink(Handle<ObjectHashSet> table,
15725 Handle<Object> key) {
15726 Handle<HashTable<ObjectHashTableShape<1>, Object*> > table_base = table;
15727 CALL_HEAP_FUNCTION(table_base->GetIsolate(),
15728 table_base->Shrink(*key),
15729 ObjectHashSet);
15730 }
15731
15732
15733 bool ObjectHashSet::Contains(Object* key) {
15734 ASSERT(IsKey(key));
15735
15736 // If the object does not have an identity hash, it was never used as a key.
15737 Object* hash = key->GetHash();
15738 if (hash->IsUndefined()) return false;
15739
15740 return (FindEntry(key) != kNotFound);
15741 }
15742
15743
15744 Handle<ObjectHashSet> ObjectHashSet::Add(Handle<ObjectHashSet> table,
15745 Handle<Object> key) {
15746 ASSERT(table->IsKey(*key));
15747
15748 // Make sure the key object has an identity hash code.
15749 Handle<Object> object_hash = Object::GetOrCreateHash(key,
15750 table->GetIsolate());
15751
15752 int entry = table->FindEntry(*key);
15753
15754 // Check whether key is already present.
15755 if (entry != kNotFound) return table;
15756
15757 // Check whether the hash set should be extended and add entry.
15758 Handle<ObjectHashSet> new_table =
15759 ObjectHashSet::EnsureCapacity(table, 1, key);
15760 entry = new_table->FindInsertionEntry(Smi::cast(*object_hash)->value());
15761 new_table->set(EntryToIndex(entry), *key);
15762 new_table->ElementAdded();
15763 return new_table;
15764 }
15765
15766
15767 Handle<ObjectHashSet> ObjectHashSet::Remove(Handle<ObjectHashSet> table,
15768 Handle<Object> key) {
15769 ASSERT(table->IsKey(*key));
15770
15771 // If the object does not have an identity hash, it was never used as a key.
15772 if (key->GetHash()->IsUndefined()) return table;
15773
15774 int entry = table->FindEntry(*key);
15775
15776 // Check whether key is actually present.
15777 if (entry == kNotFound) return table;
15778
15779 // Remove entry and try to shrink this hash set.
15780 table->set_the_hole(EntryToIndex(entry));
15781 table->ElementRemoved();
15782
15783 return ObjectHashSet::Shrink(table, key);
15784 }
15785
15786
15787 Handle<ObjectHashTable> ObjectHashTable::EnsureCapacity( 15710 Handle<ObjectHashTable> ObjectHashTable::EnsureCapacity(
15788 Handle<ObjectHashTable> table, 15711 Handle<ObjectHashTable> table,
15789 int n, 15712 int n,
15790 Handle<Object> key, 15713 Handle<Object> key,
15791 PretenureFlag pretenure) { 15714 PretenureFlag pretenure) {
15792 Handle<HashTable<ObjectHashTableShape<2>, Object*> > table_base = table; 15715 Handle<HashTable<ObjectHashTableShape, Object*> > table_base = table;
15793 CALL_HEAP_FUNCTION(table_base->GetIsolate(), 15716 CALL_HEAP_FUNCTION(table_base->GetIsolate(),
15794 table_base->EnsureCapacity(n, *key, pretenure), 15717 table_base->EnsureCapacity(n, *key, pretenure),
15795 ObjectHashTable); 15718 ObjectHashTable);
15796 } 15719 }
15797 15720
15798 15721
15799 Handle<ObjectHashTable> ObjectHashTable::Shrink( 15722 Handle<ObjectHashTable> ObjectHashTable::Shrink(
15800 Handle<ObjectHashTable> table, Handle<Object> key) { 15723 Handle<ObjectHashTable> table, Handle<Object> key) {
15801 Handle<HashTable<ObjectHashTableShape<2>, Object*> > table_base = table; 15724 Handle<HashTable<ObjectHashTableShape, Object*> > table_base = table;
15802 CALL_HEAP_FUNCTION(table_base->GetIsolate(), 15725 CALL_HEAP_FUNCTION(table_base->GetIsolate(),
15803 table_base->Shrink(*key), 15726 table_base->Shrink(*key),
15804 ObjectHashTable); 15727 ObjectHashTable);
15805 } 15728 }
15806 15729
15807 15730
15808 Object* ObjectHashTable::Lookup(Object* key) { 15731 Object* ObjectHashTable::Lookup(Object* key) {
15809 ASSERT(IsKey(key)); 15732 ASSERT(IsKey(key));
15810 15733
15811 // If the object does not have an identity hash, it was never used as a key. 15734 // If the object does not have an identity hash, it was never used as a key.
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
15909 // to divide and multiple by 2 (kLoadFactor) to derive capacity 15832 // to divide and multiple by 2 (kLoadFactor) to derive capacity
15910 // from number of buckets. If we decide to change kLoadFactor 15833 // from number of buckets. If we decide to change kLoadFactor
15911 // to something other than 2, capacity should be stored as another 15834 // to something other than 2, capacity should be stored as another
15912 // field of this object. 15835 // field of this object.
15913 const int kMinCapacity = 4; 15836 const int kMinCapacity = 4;
15914 capacity = RoundUpToPowerOf2(Max(kMinCapacity, capacity)); 15837 capacity = RoundUpToPowerOf2(Max(kMinCapacity, capacity));
15915 if (capacity > kMaxCapacity) { 15838 if (capacity > kMaxCapacity) {
15916 v8::internal::Heap::FatalProcessOutOfMemory("invalid table size", true); 15839 v8::internal::Heap::FatalProcessOutOfMemory("invalid table size", true);
15917 } 15840 }
15918 int num_buckets = capacity / kLoadFactor; 15841 int num_buckets = capacity / kLoadFactor;
15919 Handle<Derived> table = 15842 Handle<FixedArray> backing_store = isolate->factory()->NewFixedArray(
15920 Handle<Derived>::cast( 15843 kHashTableStartIndex + num_buckets + (capacity * kEntrySize), pretenure);
15921 isolate->factory()->NewFixedArray( 15844 backing_store->set_map_no_write_barrier(
15922 kHashTableStartIndex + num_buckets + (capacity * kEntrySize), 15845 isolate->heap()->ordered_hash_table_map());
15923 pretenure)); 15846 Handle<Derived> table = Handle<Derived>::cast(backing_store);
15924 for (int i = 0; i < num_buckets; ++i) { 15847 for (int i = 0; i < num_buckets; ++i) {
15925 table->set(kHashTableStartIndex + i, Smi::FromInt(kNotFound)); 15848 table->set(kHashTableStartIndex + i, Smi::FromInt(kNotFound));
15926 } 15849 }
15927 table->SetNumberOfBuckets(num_buckets); 15850 table->SetNumberOfBuckets(num_buckets);
15928 table->SetNumberOfElements(0); 15851 table->SetNumberOfElements(0);
15929 table->SetNumberOfDeletedElements(0); 15852 table->SetNumberOfDeletedElements(0);
15930 return table; 15853 return table;
15931 } 15854 }
15932 15855
15933 15856
(...skipping 743 matching lines...) Expand 10 before | Expand all | Expand 10 after
16677 #define ERROR_MESSAGES_TEXTS(C, T) T, 16600 #define ERROR_MESSAGES_TEXTS(C, T) T,
16678 static const char* error_messages_[] = { 16601 static const char* error_messages_[] = {
16679 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) 16602 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS)
16680 }; 16603 };
16681 #undef ERROR_MESSAGES_TEXTS 16604 #undef ERROR_MESSAGES_TEXTS
16682 return error_messages_[reason]; 16605 return error_messages_[reason];
16683 } 16606 }
16684 16607
16685 16608
16686 } } // namespace v8::internal 16609 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/objects.h ('k') | src/objects-debug.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698