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