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) { |
Michael Starzinger
2014/06/02 13:34:04
nit: Can we add an assertion here checking that "v
arv (Not doing code reviews)
2014/06/02 23:49:08
Done.
| |
16527 int entry = table->FindEntry(key); | 16553 int entry = table->FindEntry(key); |
16528 | 16554 |
16529 if (value->IsTheHole()) { | |
16530 if (entry == kNotFound) return table; | |
16531 table->RemoveEntry(entry); | |
16532 return Shrink(table); | |
16533 } | |
16534 | |
16535 if (entry != kNotFound) { | 16555 if (entry != kNotFound) { |
16536 table->set(table->EntryToIndex(entry) + kValueOffset, *value); | 16556 table->set(table->EntryToIndex(entry) + kValueOffset, *value); |
16537 return table; | 16557 return table; |
16538 } | 16558 } |
16539 | 16559 |
16540 table = EnsureGrowable(table); | 16560 table = EnsureGrowable(table); |
16541 | 16561 |
16542 Handle<Smi> hash = GetOrCreateHash(table->GetIsolate(), key); | 16562 Handle<Smi> hash = GetOrCreateHash(table->GetIsolate(), key); |
16543 int index = table->AddEntry(hash->value()); | 16563 int index = table->AddEntry(hash->value()); |
16544 table->set(index, *key); | 16564 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, | 17316 #define ERROR_MESSAGES_TEXTS(C, T) T, |
17297 static const char* error_messages_[] = { | 17317 static const char* error_messages_[] = { |
17298 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) | 17318 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) |
17299 }; | 17319 }; |
17300 #undef ERROR_MESSAGES_TEXTS | 17320 #undef ERROR_MESSAGES_TEXTS |
17301 return error_messages_[reason]; | 17321 return error_messages_[reason]; |
17302 } | 17322 } |
17303 | 17323 |
17304 | 17324 |
17305 } } // namespace v8::internal | 17325 } } // namespace v8::internal |
OLD | NEW |