| 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 |