OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <iomanip> | 5 #include <iomanip> |
6 #include <sstream> | 6 #include <sstream> |
7 | 7 |
8 #include "src/v8.h" | 8 #include "src/v8.h" |
9 | 9 |
10 #include "src/accessors.h" | 10 #include "src/accessors.h" |
(...skipping 785 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
796 return context->symbol_function()->initial_map(); | 796 return context->symbol_function()->initial_map(); |
797 } | 797 } |
798 if (heap_object->IsBoolean()) { | 798 if (heap_object->IsBoolean()) { |
799 return context->boolean_function()->initial_map(); | 799 return context->boolean_function()->initial_map(); |
800 } | 800 } |
801 return isolate->heap()->null_value()->map(); | 801 return isolate->heap()->null_value()->map(); |
802 } | 802 } |
803 | 803 |
804 | 804 |
805 Object* Object::GetHash() { | 805 Object* Object::GetHash() { |
806 // The object is either a number, a name, an odd-ball, | 806 // The object is either a Smi, a HeapNumber, a name, an odd-ball, |
807 // a real JS object, or a Harmony proxy. | 807 // a real JS object, or a Harmony proxy. |
808 if (IsSmi()) { | 808 if (IsSmi()) { |
809 int num = Smi::cast(this)->value(); | 809 uint32_t hash = ComputeIntegerHash(Smi::cast(this)->value(), kZeroHashSeed); |
810 uint32_t hash = ComputeLongHash(double_to_uint64(static_cast<double>(num))); | |
811 return Smi::FromInt(hash & Smi::kMaxValue); | 810 return Smi::FromInt(hash & Smi::kMaxValue); |
812 } | 811 } |
813 if (IsHeapNumber()) { | 812 if (IsHeapNumber()) { |
814 double num = HeapNumber::cast(this)->value(); | 813 double num = HeapNumber::cast(this)->value(); |
815 if (std::isnan(num)) return Smi::FromInt(Smi::kMaxValue); | 814 if (std::isnan(num)) return Smi::FromInt(Smi::kMaxValue); |
816 if (i::IsMinusZero(num)) num = 0; | 815 if (i::IsMinusZero(num)) num = 0; |
| 816 if (IsSmiDouble(num)) { |
| 817 return Smi::FromInt(FastD2I(num))->GetHash(); |
| 818 } |
817 uint32_t hash = ComputeLongHash(double_to_uint64(num)); | 819 uint32_t hash = ComputeLongHash(double_to_uint64(num)); |
818 return Smi::FromInt(hash & Smi::kMaxValue); | 820 return Smi::FromInt(hash & Smi::kMaxValue); |
819 } | 821 } |
820 if (IsName()) { | 822 if (IsName()) { |
821 uint32_t hash = Name::cast(this)->Hash(); | 823 uint32_t hash = Name::cast(this)->Hash(); |
822 return Smi::FromInt(hash); | 824 return Smi::FromInt(hash); |
823 } | 825 } |
824 if (IsOddball()) { | 826 if (IsOddball()) { |
825 uint32_t hash = Oddball::cast(this)->to_string()->Hash(); | 827 uint32_t hash = Oddball::cast(this)->to_string()->Hash(); |
826 return Smi::FromInt(hash); | 828 return Smi::FromInt(hash); |
(...skipping 15378 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
16205 table->GetHeap()->InNewSpace(*table) ? NOT_TENURED : TENURED); | 16207 table->GetHeap()->InNewSpace(*table) ? NOT_TENURED : TENURED); |
16206 | 16208 |
16207 table->SetNextTable(*new_table); | 16209 table->SetNextTable(*new_table); |
16208 table->SetNumberOfDeletedElements(kClearedTableSentinel); | 16210 table->SetNumberOfDeletedElements(kClearedTableSentinel); |
16209 | 16211 |
16210 return new_table; | 16212 return new_table; |
16211 } | 16213 } |
16212 | 16214 |
16213 | 16215 |
16214 template<class Derived, class Iterator, int entrysize> | 16216 template<class Derived, class Iterator, int entrysize> |
16215 Handle<Derived> OrderedHashTable<Derived, Iterator, entrysize>::Remove( | |
16216 Handle<Derived> table, Handle<Object> key, bool* was_present) { | |
16217 int entry = table->FindEntry(key); | |
16218 if (entry == kNotFound) { | |
16219 *was_present = false; | |
16220 return table; | |
16221 } | |
16222 *was_present = true; | |
16223 table->RemoveEntry(entry); | |
16224 return Shrink(table); | |
16225 } | |
16226 | |
16227 | |
16228 template<class Derived, class Iterator, int entrysize> | |
16229 Handle<Derived> OrderedHashTable<Derived, Iterator, entrysize>::Rehash( | 16217 Handle<Derived> OrderedHashTable<Derived, Iterator, entrysize>::Rehash( |
16230 Handle<Derived> table, int new_capacity) { | 16218 Handle<Derived> table, int new_capacity) { |
16231 DCHECK(!table->IsObsolete()); | 16219 DCHECK(!table->IsObsolete()); |
16232 | 16220 |
16233 Handle<Derived> new_table = | 16221 Handle<Derived> new_table = |
16234 Allocate(table->GetIsolate(), | 16222 Allocate(table->GetIsolate(), |
16235 new_capacity, | 16223 new_capacity, |
16236 table->GetHeap()->InNewSpace(*table) ? NOT_TENURED : TENURED); | 16224 table->GetHeap()->InNewSpace(*table) ? NOT_TENURED : TENURED); |
16237 int nof = table->NumberOfElements(); | 16225 int nof = table->NumberOfElements(); |
16238 int nod = table->NumberOfDeletedElements(); | 16226 int nod = table->NumberOfDeletedElements(); |
(...skipping 24 matching lines...) Expand all Loading... |
16263 | 16251 |
16264 DCHECK_EQ(nod, removed_holes_index); | 16252 DCHECK_EQ(nod, removed_holes_index); |
16265 | 16253 |
16266 new_table->SetNumberOfElements(nof); | 16254 new_table->SetNumberOfElements(nof); |
16267 table->SetNextTable(*new_table); | 16255 table->SetNextTable(*new_table); |
16268 | 16256 |
16269 return new_table; | 16257 return new_table; |
16270 } | 16258 } |
16271 | 16259 |
16272 | 16260 |
16273 template <class Derived, class Iterator, int entrysize> | |
16274 int OrderedHashTable<Derived, Iterator, entrysize>::FindEntry( | |
16275 Handle<Object> key, int hash) { | |
16276 DCHECK(!IsObsolete()); | |
16277 | |
16278 DisallowHeapAllocation no_gc; | |
16279 DCHECK(!key->IsTheHole()); | |
16280 for (int entry = HashToEntry(hash); entry != kNotFound; | |
16281 entry = ChainAt(entry)) { | |
16282 Object* candidate = KeyAt(entry); | |
16283 if (candidate->SameValueZero(*key)) | |
16284 return entry; | |
16285 } | |
16286 return kNotFound; | |
16287 } | |
16288 | |
16289 | |
16290 template <class Derived, class Iterator, int entrysize> | |
16291 int OrderedHashTable<Derived, Iterator, entrysize>::FindEntry( | |
16292 Handle<Object> key) { | |
16293 DisallowHeapAllocation no_gc; | |
16294 Object* hash = key->GetHash(); | |
16295 if (!hash->IsSmi()) return kNotFound; | |
16296 return FindEntry(key, Smi::cast(hash)->value()); | |
16297 } | |
16298 | |
16299 | |
16300 template <class Derived, class Iterator, int entrysize> | |
16301 int OrderedHashTable<Derived, Iterator, entrysize>::AddEntry(int hash) { | |
16302 DCHECK(!IsObsolete()); | |
16303 | |
16304 int entry = UsedCapacity(); | |
16305 int bucket = HashToBucket(hash); | |
16306 int index = EntryToIndex(entry); | |
16307 Object* chain_entry = get(kHashTableStartIndex + bucket); | |
16308 set(kHashTableStartIndex + bucket, Smi::FromInt(entry)); | |
16309 set(index + kChainOffset, chain_entry); | |
16310 SetNumberOfElements(NumberOfElements() + 1); | |
16311 return index; | |
16312 } | |
16313 | |
16314 | |
16315 template<class Derived, class Iterator, int entrysize> | |
16316 void OrderedHashTable<Derived, Iterator, entrysize>::RemoveEntry(int entry) { | |
16317 DCHECK(!IsObsolete()); | |
16318 | |
16319 int index = EntryToIndex(entry); | |
16320 for (int i = 0; i < entrysize; ++i) { | |
16321 set_the_hole(index + i); | |
16322 } | |
16323 SetNumberOfElements(NumberOfElements() - 1); | |
16324 SetNumberOfDeletedElements(NumberOfDeletedElements() + 1); | |
16325 } | |
16326 | |
16327 | |
16328 template Handle<OrderedHashSet> | 16261 template Handle<OrderedHashSet> |
16329 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::Allocate( | 16262 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::Allocate( |
16330 Isolate* isolate, int capacity, PretenureFlag pretenure); | 16263 Isolate* isolate, int capacity, PretenureFlag pretenure); |
16331 | 16264 |
16332 template Handle<OrderedHashSet> | 16265 template Handle<OrderedHashSet> |
16333 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::EnsureGrowable( | 16266 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::EnsureGrowable( |
16334 Handle<OrderedHashSet> table); | 16267 Handle<OrderedHashSet> table); |
16335 | 16268 |
16336 template Handle<OrderedHashSet> | 16269 template Handle<OrderedHashSet> |
16337 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::Shrink( | 16270 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::Shrink( |
16338 Handle<OrderedHashSet> table); | 16271 Handle<OrderedHashSet> table); |
16339 | 16272 |
16340 template Handle<OrderedHashSet> | 16273 template Handle<OrderedHashSet> |
16341 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::Clear( | 16274 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::Clear( |
16342 Handle<OrderedHashSet> table); | 16275 Handle<OrderedHashSet> table); |
16343 | 16276 |
16344 template Handle<OrderedHashSet> | |
16345 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::Remove( | |
16346 Handle<OrderedHashSet> table, Handle<Object> key, bool* was_present); | |
16347 | |
16348 template int OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::FindEntry( | |
16349 Handle<Object> key, int hash); | |
16350 template int OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::FindEntry( | |
16351 Handle<Object> key); | |
16352 | |
16353 template int | |
16354 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::AddEntry(int hash); | |
16355 | |
16356 template void | |
16357 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::RemoveEntry(int entry); | |
16358 | |
16359 | 16277 |
16360 template Handle<OrderedHashMap> | 16278 template Handle<OrderedHashMap> |
16361 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::Allocate( | 16279 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::Allocate( |
16362 Isolate* isolate, int capacity, PretenureFlag pretenure); | 16280 Isolate* isolate, int capacity, PretenureFlag pretenure); |
16363 | 16281 |
16364 template Handle<OrderedHashMap> | 16282 template Handle<OrderedHashMap> |
16365 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::EnsureGrowable( | 16283 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::EnsureGrowable( |
16366 Handle<OrderedHashMap> table); | 16284 Handle<OrderedHashMap> table); |
16367 | 16285 |
16368 template Handle<OrderedHashMap> | 16286 template Handle<OrderedHashMap> |
16369 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::Shrink( | 16287 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::Shrink( |
16370 Handle<OrderedHashMap> table); | 16288 Handle<OrderedHashMap> table); |
16371 | 16289 |
16372 template Handle<OrderedHashMap> | 16290 template Handle<OrderedHashMap> |
16373 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::Clear( | 16291 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::Clear( |
16374 Handle<OrderedHashMap> table); | 16292 Handle<OrderedHashMap> table); |
16375 | 16293 |
16376 template Handle<OrderedHashMap> | |
16377 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::Remove( | |
16378 Handle<OrderedHashMap> table, Handle<Object> key, bool* was_present); | |
16379 | |
16380 template int OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::FindEntry( | |
16381 Handle<Object> key, int hash); | |
16382 template int OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::FindEntry( | |
16383 Handle<Object> key); | |
16384 | |
16385 template int | |
16386 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::AddEntry(int hash); | |
16387 | |
16388 template void | |
16389 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::RemoveEntry(int entry); | |
16390 | |
16391 | |
16392 bool OrderedHashSet::Contains(Handle<Object> key) { | |
16393 return FindEntry(key) != kNotFound; | |
16394 } | |
16395 | |
16396 | |
16397 Handle<OrderedHashSet> OrderedHashSet::Add(Handle<OrderedHashSet> table, | |
16398 Handle<Object> key) { | |
16399 int hash = GetOrCreateHash(table->GetIsolate(), key)->value(); | |
16400 if (table->FindEntry(key, hash) != kNotFound) return table; | |
16401 | |
16402 table = EnsureGrowable(table); | |
16403 | |
16404 int index = table->AddEntry(hash); | |
16405 table->set(index, *key); | |
16406 return table; | |
16407 } | |
16408 | |
16409 | |
16410 Object* OrderedHashMap::Lookup(Handle<Object> key) { | |
16411 DisallowHeapAllocation no_gc; | |
16412 int entry = FindEntry(key); | |
16413 if (entry == kNotFound) return GetHeap()->the_hole_value(); | |
16414 return ValueAt(entry); | |
16415 } | |
16416 | |
16417 | |
16418 Handle<OrderedHashMap> OrderedHashMap::Put(Handle<OrderedHashMap> table, | |
16419 Handle<Object> key, | |
16420 Handle<Object> value) { | |
16421 DCHECK(!key->IsTheHole()); | |
16422 | |
16423 int hash = GetOrCreateHash(table->GetIsolate(), key)->value(); | |
16424 int entry = table->FindEntry(key, hash); | |
16425 | |
16426 if (entry != kNotFound) { | |
16427 table->set(table->EntryToIndex(entry) + kValueOffset, *value); | |
16428 return table; | |
16429 } | |
16430 | |
16431 table = EnsureGrowable(table); | |
16432 | |
16433 int index = table->AddEntry(hash); | |
16434 table->set(index, *key); | |
16435 table->set(index + kValueOffset, *value); | |
16436 return table; | |
16437 } | |
16438 | |
16439 | 16294 |
16440 template<class Derived, class TableType> | 16295 template<class Derived, class TableType> |
16441 void OrderedHashTableIterator<Derived, TableType>::Transition() { | 16296 void OrderedHashTableIterator<Derived, TableType>::Transition() { |
16442 DisallowHeapAllocation no_allocation; | 16297 DisallowHeapAllocation no_allocation; |
16443 TableType* table = TableType::cast(this->table()); | 16298 TableType* table = TableType::cast(this->table()); |
16444 if (!table->IsObsolete()) return; | 16299 if (!table->IsObsolete()) return; |
16445 | 16300 |
16446 int index = Smi::cast(this->index())->value(); | 16301 int index = Smi::cast(this->index())->value(); |
16447 while (table->IsObsolete()) { | 16302 while (table->IsObsolete()) { |
16448 TableType* next_table = table->NextTable(); | 16303 TableType* next_table = table->NextTable(); |
(...skipping 631 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
17080 CompilationInfo* info) { | 16935 CompilationInfo* info) { |
17081 Handle<DependentCode> codes = DependentCode::InsertCompilationInfo( | 16936 Handle<DependentCode> codes = DependentCode::InsertCompilationInfo( |
17082 handle(cell->dependent_code(), info->isolate()), | 16937 handle(cell->dependent_code(), info->isolate()), |
17083 DependentCode::kPropertyCellChangedGroup, info->object_wrapper()); | 16938 DependentCode::kPropertyCellChangedGroup, info->object_wrapper()); |
17084 if (*codes != cell->dependent_code()) cell->set_dependent_code(*codes); | 16939 if (*codes != cell->dependent_code()) cell->set_dependent_code(*codes); |
17085 info->dependencies(DependentCode::kPropertyCellChangedGroup)->Add( | 16940 info->dependencies(DependentCode::kPropertyCellChangedGroup)->Add( |
17086 cell, info->zone()); | 16941 cell, info->zone()); |
17087 } | 16942 } |
17088 | 16943 |
17089 } } // namespace v8::internal | 16944 } } // namespace v8::internal |
OLD | NEW |