| OLD | NEW | 
|      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  Loading... | 
|  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  Loading... | 
|  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  Loading... | 
|  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  Loading... | 
|  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 | 
| OLD | NEW |