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 "v8.h" | 5 #include "v8.h" |
6 | 6 |
7 #include "accessors.h" | 7 #include "accessors.h" |
8 #include "allocation-site-scopes.h" | 8 #include "allocation-site-scopes.h" |
9 #include "api.h" | 9 #include "api.h" |
10 #include "arguments.h" | 10 #include "arguments.h" |
(...skipping 16283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
16294 object = Iterator::cast(object)->next_iterator()) { | 16294 object = Iterator::cast(object)->next_iterator()) { |
16295 Iterator::cast(object)->TableCompacted(); | 16295 Iterator::cast(object)->TableCompacted(); |
16296 Iterator::cast(object)->set_table(*new_table); | 16296 Iterator::cast(object)->set_table(*new_table); |
16297 } | 16297 } |
16298 | 16298 |
16299 return new_table; | 16299 return new_table; |
16300 } | 16300 } |
16301 | 16301 |
16302 | 16302 |
16303 template<class Derived, class Iterator, int entrysize> | 16303 template<class Derived, class Iterator, int entrysize> |
16304 int OrderedHashTable<Derived, Iterator, entrysize>::FindEntry(Object* key) { | 16304 int OrderedHashTable<Derived, Iterator, entrysize>::FindEntry( |
| 16305 Handle<Object> key) { |
| 16306 DisallowHeapAllocation no_gc; |
16305 ASSERT(!key->IsTheHole()); | 16307 ASSERT(!key->IsTheHole()); |
16306 Object* hash = key->GetHash(); | 16308 Object* hash = key->GetHash(); |
16307 if (hash->IsUndefined()) return kNotFound; | 16309 if (hash->IsUndefined()) return kNotFound; |
16308 for (int entry = HashToEntry(Smi::cast(hash)->value()); | 16310 for (int entry = HashToEntry(Smi::cast(hash)->value()); |
16309 entry != kNotFound; | 16311 entry != kNotFound; |
16310 entry = ChainAt(entry)) { | 16312 entry = ChainAt(entry)) { |
16311 Object* candidate = KeyAt(entry); | 16313 Object* candidate = KeyAt(entry); |
16312 if (candidate->SameValue(key)) | 16314 if (candidate->SameValue(*key)) |
16313 return entry; | 16315 return entry; |
16314 } | 16316 } |
16315 return kNotFound; | 16317 return kNotFound; |
16316 } | 16318 } |
16317 | 16319 |
16318 | 16320 |
16319 template<class Derived, class Iterator, int entrysize> | 16321 template<class Derived, class Iterator, int entrysize> |
16320 int OrderedHashTable<Derived, Iterator, entrysize>::AddEntry(int hash) { | 16322 int OrderedHashTable<Derived, Iterator, entrysize>::AddEntry(int hash) { |
16321 int entry = UsedCapacity(); | 16323 int entry = UsedCapacity(); |
16322 int bucket = HashToBucket(hash); | 16324 int bucket = HashToBucket(hash); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
16357 | 16359 |
16358 template Handle<OrderedHashSet> | 16360 template Handle<OrderedHashSet> |
16359 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::Shrink( | 16361 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::Shrink( |
16360 Handle<OrderedHashSet> table); | 16362 Handle<OrderedHashSet> table); |
16361 | 16363 |
16362 template Handle<OrderedHashSet> | 16364 template Handle<OrderedHashSet> |
16363 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::Clear( | 16365 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::Clear( |
16364 Handle<OrderedHashSet> table); | 16366 Handle<OrderedHashSet> table); |
16365 | 16367 |
16366 template int | 16368 template int |
16367 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::FindEntry(Object* key); | 16369 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::FindEntry( |
| 16370 Handle<Object> key); |
16368 | 16371 |
16369 template int | 16372 template int |
16370 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::AddEntry(int hash); | 16373 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::AddEntry(int hash); |
16371 | 16374 |
16372 template void | 16375 template void |
16373 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::RemoveEntry(int entry); | 16376 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::RemoveEntry(int entry); |
16374 | 16377 |
16375 | 16378 |
16376 template Handle<OrderedHashMap> | 16379 template Handle<OrderedHashMap> |
16377 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::Allocate( | 16380 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::Allocate( |
16378 Isolate* isolate, int capacity, PretenureFlag pretenure); | 16381 Isolate* isolate, int capacity, PretenureFlag pretenure); |
16379 | 16382 |
16380 template Handle<OrderedHashMap> | 16383 template Handle<OrderedHashMap> |
16381 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::EnsureGrowable( | 16384 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::EnsureGrowable( |
16382 Handle<OrderedHashMap> table); | 16385 Handle<OrderedHashMap> table); |
16383 | 16386 |
16384 template Handle<OrderedHashMap> | 16387 template Handle<OrderedHashMap> |
16385 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::Shrink( | 16388 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::Shrink( |
16386 Handle<OrderedHashMap> table); | 16389 Handle<OrderedHashMap> table); |
16387 | 16390 |
16388 template Handle<OrderedHashMap> | 16391 template Handle<OrderedHashMap> |
16389 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::Clear( | 16392 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::Clear( |
16390 Handle<OrderedHashMap> table); | 16393 Handle<OrderedHashMap> table); |
16391 | 16394 |
16392 template int | 16395 template int |
16393 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::FindEntry(Object* key); | 16396 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::FindEntry( |
| 16397 Handle<Object> key); |
16394 | 16398 |
16395 template int | 16399 template int |
16396 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::AddEntry(int hash); | 16400 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::AddEntry(int hash); |
16397 | 16401 |
16398 template void | 16402 template void |
16399 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::RemoveEntry(int entry); | 16403 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::RemoveEntry(int entry); |
16400 | 16404 |
16401 | 16405 |
16402 bool OrderedHashSet::Contains(Object* key) { | 16406 bool OrderedHashSet::Contains(Handle<Object> key) { |
16403 return FindEntry(key) != kNotFound; | 16407 return FindEntry(key) != kNotFound; |
16404 } | 16408 } |
16405 | 16409 |
16406 | 16410 |
16407 Handle<OrderedHashSet> OrderedHashSet::Add(Handle<OrderedHashSet> table, | 16411 Handle<OrderedHashSet> OrderedHashSet::Add(Handle<OrderedHashSet> table, |
16408 Handle<Object> key) { | 16412 Handle<Object> key) { |
16409 if (table->FindEntry(*key) != kNotFound) return table; | 16413 if (table->FindEntry(key) != kNotFound) return table; |
16410 | 16414 |
16411 table = EnsureGrowable(table); | 16415 table = EnsureGrowable(table); |
16412 | 16416 |
16413 Handle<Object> hash = GetOrCreateHash(key, table->GetIsolate()); | 16417 Handle<Object> hash = GetOrCreateHash(key, table->GetIsolate()); |
16414 int index = table->AddEntry(Smi::cast(*hash)->value()); | 16418 int index = table->AddEntry(Smi::cast(*hash)->value()); |
16415 table->set(index, *key); | 16419 table->set(index, *key); |
16416 return table; | 16420 return table; |
16417 } | 16421 } |
16418 | 16422 |
16419 | 16423 |
16420 Handle<OrderedHashSet> OrderedHashSet::Remove(Handle<OrderedHashSet> table, | 16424 Handle<OrderedHashSet> OrderedHashSet::Remove(Handle<OrderedHashSet> table, |
16421 Handle<Object> key) { | 16425 Handle<Object> key) { |
16422 int entry = table->FindEntry(*key); | 16426 int entry = table->FindEntry(key); |
16423 if (entry == kNotFound) return table; | 16427 if (entry == kNotFound) return table; |
16424 table->RemoveEntry(entry); | 16428 table->RemoveEntry(entry); |
16425 return Shrink(table); | 16429 return Shrink(table); |
16426 } | 16430 } |
16427 | 16431 |
16428 | 16432 |
16429 Object* OrderedHashMap::Lookup(Handle<Object> key) { | 16433 Object* OrderedHashMap::Lookup(Handle<Object> key) { |
16430 DisallowHeapAllocation no_gc; | 16434 DisallowHeapAllocation no_gc; |
16431 int entry = FindEntry(*key); | 16435 int entry = FindEntry(key); |
16432 if (entry == kNotFound) return GetHeap()->the_hole_value(); | 16436 if (entry == kNotFound) return GetHeap()->the_hole_value(); |
16433 return ValueAt(entry); | 16437 return ValueAt(entry); |
16434 } | 16438 } |
16435 | 16439 |
16436 | 16440 |
16437 Handle<OrderedHashMap> OrderedHashMap::Put(Handle<OrderedHashMap> table, | 16441 Handle<OrderedHashMap> OrderedHashMap::Put(Handle<OrderedHashMap> table, |
16438 Handle<Object> key, | 16442 Handle<Object> key, |
16439 Handle<Object> value) { | 16443 Handle<Object> value) { |
16440 int entry = table->FindEntry(*key); | 16444 int entry = table->FindEntry(key); |
16441 | 16445 |
16442 if (value->IsTheHole()) { | 16446 if (value->IsTheHole()) { |
16443 if (entry == kNotFound) return table; | 16447 if (entry == kNotFound) return table; |
16444 table->RemoveEntry(entry); | 16448 table->RemoveEntry(entry); |
16445 return Shrink(table); | 16449 return Shrink(table); |
16446 } | 16450 } |
16447 | 16451 |
16448 if (entry != kNotFound) { | 16452 if (entry != kNotFound) { |
16449 table->set(table->EntryToIndex(entry) + kValueOffset, *value); | 16453 table->set(table->EntryToIndex(entry) + kValueOffset, *value); |
16450 return table; | 16454 return table; |
(...skipping 808 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
17259 #define ERROR_MESSAGES_TEXTS(C, T) T, | 17263 #define ERROR_MESSAGES_TEXTS(C, T) T, |
17260 static const char* error_messages_[] = { | 17264 static const char* error_messages_[] = { |
17261 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) | 17265 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) |
17262 }; | 17266 }; |
17263 #undef ERROR_MESSAGES_TEXTS | 17267 #undef ERROR_MESSAGES_TEXTS |
17264 return error_messages_[reason]; | 17268 return error_messages_[reason]; |
17265 } | 17269 } |
17266 | 17270 |
17267 | 17271 |
17268 } } // namespace v8::internal | 17272 } } // namespace v8::internal |
OLD | NEW |