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 5284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5295 return DeleteHiddenProperty(Handle<JSObject>::cast(proto), key); | 5295 return DeleteHiddenProperty(Handle<JSObject>::cast(proto), key); |
5296 } | 5296 } |
5297 | 5297 |
5298 Object* inline_value = object->GetHiddenPropertiesHashTable(); | 5298 Object* inline_value = object->GetHiddenPropertiesHashTable(); |
5299 | 5299 |
5300 // We never delete (inline-stored) identity hashes. | 5300 // We never delete (inline-stored) identity hashes. |
5301 ASSERT(*key != *isolate->factory()->identity_hash_string()); | 5301 ASSERT(*key != *isolate->factory()->identity_hash_string()); |
5302 if (inline_value->IsUndefined() || inline_value->IsSmi()) return; | 5302 if (inline_value->IsUndefined() || inline_value->IsSmi()) return; |
5303 | 5303 |
5304 Handle<ObjectHashTable> hashtable(ObjectHashTable::cast(inline_value)); | 5304 Handle<ObjectHashTable> hashtable(ObjectHashTable::cast(inline_value)); |
5305 ObjectHashTable::Put(hashtable, key, isolate->factory()->the_hole_value()); | 5305 ObjectHashTable::Remove(hashtable, key); |
5306 } | 5306 } |
5307 | 5307 |
5308 | 5308 |
5309 bool JSObject::HasHiddenProperties(Handle<JSObject> object) { | 5309 bool JSObject::HasHiddenProperties(Handle<JSObject> object) { |
5310 Handle<Name> hidden = object->GetIsolate()->factory()->hidden_string(); | 5310 Handle<Name> hidden = object->GetIsolate()->factory()->hidden_string(); |
5311 return GetPropertyAttributePostInterceptor( | 5311 return GetPropertyAttributePostInterceptor( |
5312 object, object, hidden, false) != ABSENT; | 5312 object, object, hidden, false) != ABSENT; |
5313 } | 5313 } |
5314 | 5314 |
5315 | 5315 |
(...skipping 10850 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
16166 int entry = FindEntry(key); | 16166 int entry = FindEntry(key); |
16167 if (entry == kNotFound) return GetHeap()->the_hole_value(); | 16167 if (entry == kNotFound) return GetHeap()->the_hole_value(); |
16168 return get(EntryToIndex(entry) + 1); | 16168 return get(EntryToIndex(entry) + 1); |
16169 } | 16169 } |
16170 | 16170 |
16171 | 16171 |
16172 Handle<ObjectHashTable> ObjectHashTable::Put(Handle<ObjectHashTable> table, | 16172 Handle<ObjectHashTable> ObjectHashTable::Put(Handle<ObjectHashTable> table, |
16173 Handle<Object> key, | 16173 Handle<Object> key, |
16174 Handle<Object> value) { | 16174 Handle<Object> value) { |
16175 ASSERT(table->IsKey(*key)); | 16175 ASSERT(table->IsKey(*key)); |
| 16176 ASSERT(!value->IsTheHole()); |
16176 | 16177 |
16177 Isolate* isolate = table->GetIsolate(); | 16178 Isolate* isolate = table->GetIsolate(); |
16178 | 16179 |
16179 // Make sure the key object has an identity hash code. | 16180 // Make sure the key object has an identity hash code. |
16180 Handle<Smi> hash = Object::GetOrCreateHash(isolate, key); | 16181 Handle<Smi> hash = Object::GetOrCreateHash(isolate, key); |
16181 | 16182 |
16182 int entry = table->FindEntry(key); | 16183 int entry = table->FindEntry(key); |
16183 | 16184 |
16184 // Check whether to perform removal operation. | |
16185 if (value->IsTheHole()) { | |
16186 if (entry == kNotFound) return table; | |
16187 table->RemoveEntry(entry); | |
16188 return Shrink(table, key); | |
16189 } | |
16190 | |
16191 // Key is already in table, just overwrite value. | 16185 // Key is already in table, just overwrite value. |
16192 if (entry != kNotFound) { | 16186 if (entry != kNotFound) { |
16193 table->set(EntryToIndex(entry) + 1, *value); | 16187 table->set(EntryToIndex(entry) + 1, *value); |
16194 return table; | 16188 return table; |
16195 } | 16189 } |
16196 | 16190 |
16197 // Check whether the hash table should be extended. | 16191 // Check whether the hash table should be extended. |
16198 table = EnsureCapacity(table, 1, key); | 16192 table = EnsureCapacity(table, 1, key); |
16199 table->AddEntry(table->FindInsertionEntry(hash->value()), | 16193 table->AddEntry(table->FindInsertionEntry(hash->value()), |
16200 *key, | 16194 *key, |
16201 *value); | 16195 *value); |
16202 return table; | 16196 return table; |
16203 } | 16197 } |
16204 | 16198 |
16205 | 16199 |
| 16200 Handle<ObjectHashTable> ObjectHashTable::Remove(Handle<ObjectHashTable> table, |
| 16201 Handle<Object> key) { |
| 16202 ASSERT(table->IsKey(*key)); |
| 16203 |
| 16204 Object* hash = key->GetHash(); |
| 16205 if (hash->IsUndefined()) return table; |
| 16206 |
| 16207 int entry = table->FindEntry(key); |
| 16208 if (entry == kNotFound) return table; |
| 16209 table->RemoveEntry(entry); |
| 16210 return Shrink(table, key); |
| 16211 } |
| 16212 |
| 16213 |
16206 void ObjectHashTable::AddEntry(int entry, Object* key, Object* value) { | 16214 void ObjectHashTable::AddEntry(int entry, Object* key, Object* value) { |
16207 set(EntryToIndex(entry), key); | 16215 set(EntryToIndex(entry), key); |
16208 set(EntryToIndex(entry) + 1, value); | 16216 set(EntryToIndex(entry) + 1, value); |
16209 ElementAdded(); | 16217 ElementAdded(); |
16210 } | 16218 } |
16211 | 16219 |
16212 | 16220 |
16213 void ObjectHashTable::RemoveEntry(int entry) { | 16221 void ObjectHashTable::RemoveEntry(int entry) { |
16214 set_the_hole(EntryToIndex(entry)); | 16222 set_the_hole(EntryToIndex(entry)); |
16215 set_the_hole(EntryToIndex(entry) + 1); | 16223 set_the_hole(EntryToIndex(entry) + 1); |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
16328 table->GetHeap()->InNewSpace(*table) ? NOT_TENURED : TENURED); | 16336 table->GetHeap()->InNewSpace(*table) ? NOT_TENURED : TENURED); |
16329 | 16337 |
16330 table->SetNextTable(*new_table); | 16338 table->SetNextTable(*new_table); |
16331 table->SetNumberOfDeletedElements(-1); | 16339 table->SetNumberOfDeletedElements(-1); |
16332 | 16340 |
16333 return new_table; | 16341 return new_table; |
16334 } | 16342 } |
16335 | 16343 |
16336 | 16344 |
16337 template<class Derived, class Iterator, int entrysize> | 16345 template<class Derived, class Iterator, int entrysize> |
| 16346 Handle<Derived> OrderedHashTable<Derived, Iterator, entrysize>::Remove( |
| 16347 Handle<Derived> table, Handle<Object> key, bool* was_present) { |
| 16348 int entry = table->FindEntry(key); |
| 16349 if (entry == kNotFound) { |
| 16350 *was_present = false; |
| 16351 return table; |
| 16352 } |
| 16353 *was_present = true; |
| 16354 table->RemoveEntry(entry); |
| 16355 return Shrink(table); |
| 16356 } |
| 16357 |
| 16358 |
| 16359 template<class Derived, class Iterator, int entrysize> |
16338 Handle<Derived> OrderedHashTable<Derived, Iterator, entrysize>::Rehash( | 16360 Handle<Derived> OrderedHashTable<Derived, Iterator, entrysize>::Rehash( |
16339 Handle<Derived> table, int new_capacity) { | 16361 Handle<Derived> table, int new_capacity) { |
16340 ASSERT(!table->IsObsolete()); | 16362 ASSERT(!table->IsObsolete()); |
16341 | 16363 |
16342 Handle<Derived> new_table = | 16364 Handle<Derived> new_table = |
16343 Allocate(table->GetIsolate(), | 16365 Allocate(table->GetIsolate(), |
16344 new_capacity, | 16366 new_capacity, |
16345 table->GetHeap()->InNewSpace(*table) ? NOT_TENURED : TENURED); | 16367 table->GetHeap()->InNewSpace(*table) ? NOT_TENURED : TENURED); |
16346 int nof = table->NumberOfElements(); | 16368 int nof = table->NumberOfElements(); |
16347 int nod = table->NumberOfDeletedElements(); | 16369 int nod = table->NumberOfDeletedElements(); |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
16436 Handle<OrderedHashSet> table); | 16458 Handle<OrderedHashSet> table); |
16437 | 16459 |
16438 template Handle<OrderedHashSet> | 16460 template Handle<OrderedHashSet> |
16439 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::Shrink( | 16461 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::Shrink( |
16440 Handle<OrderedHashSet> table); | 16462 Handle<OrderedHashSet> table); |
16441 | 16463 |
16442 template Handle<OrderedHashSet> | 16464 template Handle<OrderedHashSet> |
16443 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::Clear( | 16465 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::Clear( |
16444 Handle<OrderedHashSet> table); | 16466 Handle<OrderedHashSet> table); |
16445 | 16467 |
| 16468 template Handle<OrderedHashSet> |
| 16469 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::Remove( |
| 16470 Handle<OrderedHashSet> table, Handle<Object> key, bool* was_present); |
| 16471 |
16446 template int | 16472 template int |
16447 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::FindEntry( | 16473 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::FindEntry( |
16448 Handle<Object> key); | 16474 Handle<Object> key); |
16449 | 16475 |
16450 template int | 16476 template int |
16451 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::AddEntry(int hash); | 16477 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::AddEntry(int hash); |
16452 | 16478 |
16453 template void | 16479 template void |
16454 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::RemoveEntry(int entry); | 16480 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::RemoveEntry(int entry); |
16455 | 16481 |
16456 | 16482 |
16457 template Handle<OrderedHashMap> | 16483 template Handle<OrderedHashMap> |
16458 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::Allocate( | 16484 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::Allocate( |
16459 Isolate* isolate, int capacity, PretenureFlag pretenure); | 16485 Isolate* isolate, int capacity, PretenureFlag pretenure); |
16460 | 16486 |
16461 template Handle<OrderedHashMap> | 16487 template Handle<OrderedHashMap> |
16462 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::EnsureGrowable( | 16488 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::EnsureGrowable( |
16463 Handle<OrderedHashMap> table); | 16489 Handle<OrderedHashMap> table); |
16464 | 16490 |
16465 template Handle<OrderedHashMap> | 16491 template Handle<OrderedHashMap> |
16466 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::Shrink( | 16492 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::Shrink( |
16467 Handle<OrderedHashMap> table); | 16493 Handle<OrderedHashMap> table); |
16468 | 16494 |
16469 template Handle<OrderedHashMap> | 16495 template Handle<OrderedHashMap> |
16470 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::Clear( | 16496 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::Clear( |
16471 Handle<OrderedHashMap> table); | 16497 Handle<OrderedHashMap> table); |
16472 | 16498 |
| 16499 template Handle<OrderedHashMap> |
| 16500 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::Remove( |
| 16501 Handle<OrderedHashMap> table, Handle<Object> key, bool* was_present); |
| 16502 |
16473 template int | 16503 template int |
16474 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::FindEntry( | 16504 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::FindEntry( |
16475 Handle<Object> key); | 16505 Handle<Object> key); |
16476 | 16506 |
16477 template int | 16507 template int |
16478 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::AddEntry(int hash); | 16508 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::AddEntry(int hash); |
16479 | 16509 |
16480 template void | 16510 template void |
16481 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::RemoveEntry(int entry); | 16511 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::RemoveEntry(int entry); |
16482 | 16512 |
16483 | 16513 |
16484 bool OrderedHashSet::Contains(Handle<Object> key) { | 16514 bool OrderedHashSet::Contains(Handle<Object> key) { |
16485 return FindEntry(key) != kNotFound; | 16515 return FindEntry(key) != kNotFound; |
16486 } | 16516 } |
16487 | 16517 |
16488 | 16518 |
16489 Handle<OrderedHashSet> OrderedHashSet::Add(Handle<OrderedHashSet> table, | 16519 Handle<OrderedHashSet> OrderedHashSet::Add(Handle<OrderedHashSet> table, |
16490 Handle<Object> key) { | 16520 Handle<Object> key) { |
16491 if (table->FindEntry(key) != kNotFound) return table; | 16521 if (table->FindEntry(key) != kNotFound) return table; |
16492 | 16522 |
16493 table = EnsureGrowable(table); | 16523 table = EnsureGrowable(table); |
16494 | 16524 |
16495 Handle<Smi> hash = GetOrCreateHash(table->GetIsolate(), key); | 16525 Handle<Smi> hash = GetOrCreateHash(table->GetIsolate(), key); |
16496 int index = table->AddEntry(hash->value()); | 16526 int index = table->AddEntry(hash->value()); |
16497 table->set(index, *key); | 16527 table->set(index, *key); |
16498 return table; | 16528 return table; |
16499 } | 16529 } |
16500 | 16530 |
16501 | 16531 |
16502 Handle<OrderedHashSet> OrderedHashSet::Remove(Handle<OrderedHashSet> table, | |
16503 Handle<Object> key, | |
16504 bool* was_present) { | |
16505 int entry = table->FindEntry(key); | |
16506 if (entry == kNotFound) { | |
16507 *was_present = false; | |
16508 return table; | |
16509 } | |
16510 *was_present = true; | |
16511 table->RemoveEntry(entry); | |
16512 return Shrink(table); | |
16513 } | |
16514 | |
16515 | |
16516 Object* OrderedHashMap::Lookup(Handle<Object> key) { | 16532 Object* OrderedHashMap::Lookup(Handle<Object> key) { |
16517 DisallowHeapAllocation no_gc; | 16533 DisallowHeapAllocation no_gc; |
16518 int entry = FindEntry(key); | 16534 int entry = FindEntry(key); |
16519 if (entry == kNotFound) return GetHeap()->the_hole_value(); | 16535 if (entry == kNotFound) return GetHeap()->the_hole_value(); |
16520 return ValueAt(entry); | 16536 return ValueAt(entry); |
16521 } | 16537 } |
16522 | 16538 |
16523 | 16539 |
16524 Handle<OrderedHashMap> OrderedHashMap::Put(Handle<OrderedHashMap> table, | 16540 Handle<OrderedHashMap> OrderedHashMap::Put(Handle<OrderedHashMap> table, |
16525 Handle<Object> key, | 16541 Handle<Object> key, |
16526 Handle<Object> value) { | 16542 Handle<Object> value) { |
16527 int entry = table->FindEntry(key); | 16543 int entry = table->FindEntry(key); |
16528 | 16544 |
16529 if (value->IsTheHole()) { | |
16530 if (entry == kNotFound) return table; | |
16531 table->RemoveEntry(entry); | |
16532 return Shrink(table); | |
16533 } | |
16534 | |
16535 if (entry != kNotFound) { | 16545 if (entry != kNotFound) { |
16536 table->set(table->EntryToIndex(entry) + kValueOffset, *value); | 16546 table->set(table->EntryToIndex(entry) + kValueOffset, *value); |
16537 return table; | 16547 return table; |
16538 } | 16548 } |
16539 | 16549 |
16540 table = EnsureGrowable(table); | 16550 table = EnsureGrowable(table); |
16541 | 16551 |
16542 Handle<Smi> hash = GetOrCreateHash(table->GetIsolate(), key); | 16552 Handle<Smi> hash = GetOrCreateHash(table->GetIsolate(), key); |
16543 int index = table->AddEntry(hash->value()); | 16553 int index = table->AddEntry(hash->value()); |
16544 table->set(index, *key); | 16554 table->set(index, *key); |
(...skipping 751 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
17296 #define ERROR_MESSAGES_TEXTS(C, T) T, | 17306 #define ERROR_MESSAGES_TEXTS(C, T) T, |
17297 static const char* error_messages_[] = { | 17307 static const char* error_messages_[] = { |
17298 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) | 17308 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) |
17299 }; | 17309 }; |
17300 #undef ERROR_MESSAGES_TEXTS | 17310 #undef ERROR_MESSAGES_TEXTS |
17301 return error_messages_[reason]; | 17311 return error_messages_[reason]; |
17302 } | 17312 } |
17303 | 17313 |
17304 | 17314 |
17305 } } // namespace v8::internal | 17315 } } // namespace v8::internal |
OLD | NEW |