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