Chromium Code Reviews| 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 16196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 16207 kHashTableStartIndex + num_buckets + (capacity * kEntrySize), pretenure); | 16207 kHashTableStartIndex + num_buckets + (capacity * kEntrySize), pretenure); |
| 16208 backing_store->set_map_no_write_barrier( | 16208 backing_store->set_map_no_write_barrier( |
| 16209 isolate->heap()->ordered_hash_table_map()); | 16209 isolate->heap()->ordered_hash_table_map()); |
| 16210 Handle<Derived> table = Handle<Derived>::cast(backing_store); | 16210 Handle<Derived> table = Handle<Derived>::cast(backing_store); |
| 16211 for (int i = 0; i < num_buckets; ++i) { | 16211 for (int i = 0; i < num_buckets; ++i) { |
| 16212 table->set(kHashTableStartIndex + i, Smi::FromInt(kNotFound)); | 16212 table->set(kHashTableStartIndex + i, Smi::FromInt(kNotFound)); |
| 16213 } | 16213 } |
| 16214 table->SetNumberOfBuckets(num_buckets); | 16214 table->SetNumberOfBuckets(num_buckets); |
| 16215 table->SetNumberOfElements(0); | 16215 table->SetNumberOfElements(0); |
| 16216 table->SetNumberOfDeletedElements(0); | 16216 table->SetNumberOfDeletedElements(0); |
| 16217 table->set_iterators(isolate->heap()->undefined_value()); | |
| 16218 return table; | 16217 return table; |
| 16219 } | 16218 } |
| 16220 | 16219 |
| 16221 | 16220 |
| 16222 template<class Derived, class Iterator, int entrysize> | 16221 template<class Derived, class Iterator, int entrysize> |
| 16223 Handle<Derived> OrderedHashTable<Derived, Iterator, entrysize>::EnsureGrowable( | 16222 Handle<Derived> OrderedHashTable<Derived, Iterator, entrysize>::EnsureGrowable( |
| 16224 Handle<Derived> table) { | 16223 Handle<Derived> table) { |
| 16224 ASSERT(!table->IsObsolete()); | |
| 16225 | |
| 16225 int nof = table->NumberOfElements(); | 16226 int nof = table->NumberOfElements(); |
| 16226 int nod = table->NumberOfDeletedElements(); | 16227 int nod = table->NumberOfDeletedElements(); |
| 16227 int capacity = table->Capacity(); | 16228 int capacity = table->Capacity(); |
| 16228 if ((nof + nod) < capacity) return table; | 16229 if ((nof + nod) < capacity) return table; |
| 16229 // Don't need to grow if we can simply clear out deleted entries instead. | 16230 // Don't need to grow if we can simply clear out deleted entries instead. |
| 16230 // Note that we can't compact in place, though, so we always allocate | 16231 // Note that we can't compact in place, though, so we always allocate |
| 16231 // a new table. | 16232 // a new table. |
| 16232 return Rehash(table, (nod < (capacity >> 1)) ? capacity << 1 : capacity); | 16233 return Rehash(table, (nod < (capacity >> 1)) ? capacity << 1 : capacity); |
| 16233 } | 16234 } |
| 16234 | 16235 |
| 16235 | 16236 |
| 16236 template<class Derived, class Iterator, int entrysize> | 16237 template<class Derived, class Iterator, int entrysize> |
| 16237 Handle<Derived> OrderedHashTable<Derived, Iterator, entrysize>::Shrink( | 16238 Handle<Derived> OrderedHashTable<Derived, Iterator, entrysize>::Shrink( |
| 16238 Handle<Derived> table) { | 16239 Handle<Derived> table) { |
| 16240 ASSERT(!table->IsObsolete()); | |
| 16241 | |
| 16239 int nof = table->NumberOfElements(); | 16242 int nof = table->NumberOfElements(); |
| 16240 int capacity = table->Capacity(); | 16243 int capacity = table->Capacity(); |
| 16241 if (nof > (capacity >> 2)) return table; | 16244 if (nof >= (capacity >> 2)) return table; |
|
arv (Not doing code reviews)
2014/05/14 20:36:36
Since kMinCapacity is 4 we end up with nof=1 not b
| |
| 16242 return Rehash(table, capacity / 2); | 16245 return Rehash(table, capacity / 2); |
| 16243 } | 16246 } |
| 16244 | 16247 |
| 16245 | 16248 |
| 16246 template<class Derived, class Iterator, int entrysize> | 16249 template<class Derived, class Iterator, int entrysize> |
| 16247 Handle<Derived> OrderedHashTable<Derived, Iterator, entrysize>::Clear( | 16250 Handle<Derived> OrderedHashTable<Derived, Iterator, entrysize>::Clear( |
| 16248 Handle<Derived> table) { | 16251 Handle<Derived> table) { |
| 16252 ASSERT(!table->IsObsolete()); | |
| 16253 | |
| 16249 Handle<Derived> new_table = | 16254 Handle<Derived> new_table = |
| 16250 Allocate(table->GetIsolate(), | 16255 Allocate(table->GetIsolate(), |
| 16251 kMinCapacity, | 16256 kMinCapacity, |
| 16252 table->GetHeap()->InNewSpace(*table) ? NOT_TENURED : TENURED); | 16257 table->GetHeap()->InNewSpace(*table) ? NOT_TENURED : TENURED); |
| 16253 | 16258 |
| 16254 new_table->set_iterators(table->iterators()); | 16259 table->SetNextTable(*new_table); |
| 16255 table->set_iterators(table->GetHeap()->undefined_value()); | 16260 table->SetNumberOfDeletedElements(-1); |
| 16256 | |
| 16257 DisallowHeapAllocation no_allocation; | |
| 16258 for (Object* object = new_table->iterators(); | |
| 16259 !object->IsUndefined(); | |
| 16260 object = Iterator::cast(object)->next_iterator()) { | |
| 16261 Iterator::cast(object)->TableCleared(); | |
| 16262 Iterator::cast(object)->set_table(*new_table); | |
| 16263 } | |
| 16264 | 16261 |
| 16265 return new_table; | 16262 return new_table; |
| 16266 } | 16263 } |
| 16267 | 16264 |
| 16268 | 16265 |
| 16269 template<class Derived, class Iterator, int entrysize> | 16266 template<class Derived, class Iterator, int entrysize> |
| 16270 Handle<Derived> OrderedHashTable<Derived, Iterator, entrysize>::Rehash( | 16267 Handle<Derived> OrderedHashTable<Derived, Iterator, entrysize>::Rehash( |
| 16271 Handle<Derived> table, int new_capacity) { | 16268 Handle<Derived> table, int new_capacity) { |
| 16269 ASSERT(!table->IsObsolete()); | |
| 16270 | |
| 16272 Handle<Derived> new_table = | 16271 Handle<Derived> new_table = |
| 16273 Allocate(table->GetIsolate(), | 16272 Allocate(table->GetIsolate(), |
| 16274 new_capacity, | 16273 new_capacity, |
| 16275 table->GetHeap()->InNewSpace(*table) ? NOT_TENURED : TENURED); | 16274 table->GetHeap()->InNewSpace(*table) ? NOT_TENURED : TENURED); |
| 16276 int nof = table->NumberOfElements(); | 16275 int nof = table->NumberOfElements(); |
| 16277 int nod = table->NumberOfDeletedElements(); | 16276 int nod = table->NumberOfDeletedElements(); |
| 16278 int new_buckets = new_table->NumberOfBuckets(); | 16277 int new_buckets = new_table->NumberOfBuckets(); |
| 16279 int new_entry = 0; | 16278 int new_entry = 0; |
| 16279 int removed_holes_index = 0; | |
| 16280 | |
| 16280 for (int old_entry = 0; old_entry < (nof + nod); ++old_entry) { | 16281 for (int old_entry = 0; old_entry < (nof + nod); ++old_entry) { |
| 16281 Object* key = table->KeyAt(old_entry); | 16282 Object* key = table->KeyAt(old_entry); |
| 16282 if (key->IsTheHole()) continue; | 16283 if (key->IsTheHole()) { |
| 16284 table->SetRemovedIndexAt(removed_holes_index++, old_entry); | |
| 16285 continue; | |
| 16286 } | |
| 16287 | |
| 16283 Object* hash = key->GetHash(); | 16288 Object* hash = key->GetHash(); |
| 16284 int bucket = Smi::cast(hash)->value() & (new_buckets - 1); | 16289 int bucket = Smi::cast(hash)->value() & (new_buckets - 1); |
| 16285 Object* chain_entry = new_table->get(kHashTableStartIndex + bucket); | 16290 Object* chain_entry = new_table->get(kHashTableStartIndex + bucket); |
| 16286 new_table->set(kHashTableStartIndex + bucket, Smi::FromInt(new_entry)); | 16291 new_table->set(kHashTableStartIndex + bucket, Smi::FromInt(new_entry)); |
| 16287 int new_index = new_table->EntryToIndex(new_entry); | 16292 int new_index = new_table->EntryToIndex(new_entry); |
| 16288 int old_index = table->EntryToIndex(old_entry); | 16293 int old_index = table->EntryToIndex(old_entry); |
| 16289 for (int i = 0; i < entrysize; ++i) { | 16294 for (int i = 0; i < entrysize; ++i) { |
| 16290 Object* value = table->get(old_index + i); | 16295 Object* value = table->get(old_index + i); |
| 16291 new_table->set(new_index + i, value); | 16296 new_table->set(new_index + i, value); |
| 16292 } | 16297 } |
| 16293 new_table->set(new_index + kChainOffset, chain_entry); | 16298 new_table->set(new_index + kChainOffset, chain_entry); |
| 16294 ++new_entry; | 16299 ++new_entry; |
| 16295 } | 16300 } |
| 16301 | |
| 16302 ASSERT_EQ(nod, removed_holes_index); | |
| 16303 | |
| 16296 new_table->SetNumberOfElements(nof); | 16304 new_table->SetNumberOfElements(nof); |
| 16297 | 16305 table->SetNextTable(*new_table); |
| 16298 new_table->set_iterators(table->iterators()); | |
| 16299 table->set_iterators(table->GetHeap()->undefined_value()); | |
| 16300 | |
| 16301 DisallowHeapAllocation no_allocation; | |
| 16302 for (Object* object = new_table->iterators(); | |
| 16303 !object->IsUndefined(); | |
| 16304 object = Iterator::cast(object)->next_iterator()) { | |
| 16305 Iterator::cast(object)->TableCompacted(); | |
| 16306 Iterator::cast(object)->set_table(*new_table); | |
| 16307 } | |
| 16308 | 16306 |
| 16309 return new_table; | 16307 return new_table; |
| 16310 } | 16308 } |
| 16311 | 16309 |
| 16312 | 16310 |
| 16313 template<class Derived, class Iterator, int entrysize> | 16311 template<class Derived, class Iterator, int entrysize> |
| 16314 int OrderedHashTable<Derived, Iterator, entrysize>::FindEntry( | 16312 int OrderedHashTable<Derived, Iterator, entrysize>::FindEntry( |
| 16315 Handle<Object> key) { | 16313 Handle<Object> key) { |
| 16314 ASSERT(!IsObsolete()); | |
| 16315 | |
| 16316 DisallowHeapAllocation no_gc; | 16316 DisallowHeapAllocation no_gc; |
| 16317 ASSERT(!key->IsTheHole()); | 16317 ASSERT(!key->IsTheHole()); |
| 16318 Object* hash = key->GetHash(); | 16318 Object* hash = key->GetHash(); |
| 16319 if (hash->IsUndefined()) return kNotFound; | 16319 if (hash->IsUndefined()) return kNotFound; |
| 16320 for (int entry = HashToEntry(Smi::cast(hash)->value()); | 16320 for (int entry = HashToEntry(Smi::cast(hash)->value()); |
| 16321 entry != kNotFound; | 16321 entry != kNotFound; |
| 16322 entry = ChainAt(entry)) { | 16322 entry = ChainAt(entry)) { |
| 16323 Object* candidate = KeyAt(entry); | 16323 Object* candidate = KeyAt(entry); |
| 16324 if (candidate->SameValue(*key)) | 16324 if (candidate->SameValue(*key)) |
| 16325 return entry; | 16325 return entry; |
| 16326 } | 16326 } |
| 16327 return kNotFound; | 16327 return kNotFound; |
| 16328 } | 16328 } |
| 16329 | 16329 |
| 16330 | 16330 |
| 16331 template<class Derived, class Iterator, int entrysize> | 16331 template<class Derived, class Iterator, int entrysize> |
| 16332 int OrderedHashTable<Derived, Iterator, entrysize>::AddEntry(int hash) { | 16332 int OrderedHashTable<Derived, Iterator, entrysize>::AddEntry(int hash) { |
| 16333 ASSERT(!IsObsolete()); | |
| 16334 | |
| 16333 int entry = UsedCapacity(); | 16335 int entry = UsedCapacity(); |
| 16334 int bucket = HashToBucket(hash); | 16336 int bucket = HashToBucket(hash); |
| 16335 int index = EntryToIndex(entry); | 16337 int index = EntryToIndex(entry); |
| 16336 Object* chain_entry = get(kHashTableStartIndex + bucket); | 16338 Object* chain_entry = get(kHashTableStartIndex + bucket); |
| 16337 set(kHashTableStartIndex + bucket, Smi::FromInt(entry)); | 16339 set(kHashTableStartIndex + bucket, Smi::FromInt(entry)); |
| 16338 set(index + kChainOffset, chain_entry); | 16340 set(index + kChainOffset, chain_entry); |
| 16339 SetNumberOfElements(NumberOfElements() + 1); | 16341 SetNumberOfElements(NumberOfElements() + 1); |
| 16340 return index; | 16342 return index; |
| 16341 } | 16343 } |
| 16342 | 16344 |
| 16343 | 16345 |
| 16344 template<class Derived, class Iterator, int entrysize> | 16346 template<class Derived, class Iterator, int entrysize> |
| 16345 void OrderedHashTable<Derived, Iterator, entrysize>::RemoveEntry(int entry) { | 16347 void OrderedHashTable<Derived, Iterator, entrysize>::RemoveEntry(int entry) { |
| 16348 ASSERT(!IsObsolete()); | |
| 16349 | |
| 16346 int index = EntryToIndex(entry); | 16350 int index = EntryToIndex(entry); |
| 16347 for (int i = 0; i < entrysize; ++i) { | 16351 for (int i = 0; i < entrysize; ++i) { |
| 16348 set_the_hole(index + i); | 16352 set_the_hole(index + i); |
| 16349 } | 16353 } |
| 16350 SetNumberOfElements(NumberOfElements() - 1); | 16354 SetNumberOfElements(NumberOfElements() - 1); |
| 16351 SetNumberOfDeletedElements(NumberOfDeletedElements() + 1); | 16355 SetNumberOfDeletedElements(NumberOfDeletedElements() + 1); |
| 16352 | |
| 16353 DisallowHeapAllocation no_allocation; | |
| 16354 for (Object* object = iterators(); | |
| 16355 !object->IsUndefined(); | |
| 16356 object = Iterator::cast(object)->next_iterator()) { | |
| 16357 Iterator::cast(object)->EntryRemoved(entry); | |
| 16358 } | |
| 16359 } | 16356 } |
| 16360 | 16357 |
| 16361 | 16358 |
| 16362 template Handle<OrderedHashSet> | 16359 template Handle<OrderedHashSet> |
| 16363 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::Allocate( | 16360 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::Allocate( |
| 16364 Isolate* isolate, int capacity, PretenureFlag pretenure); | 16361 Isolate* isolate, int capacity, PretenureFlag pretenure); |
| 16365 | 16362 |
| 16366 template Handle<OrderedHashSet> | 16363 template Handle<OrderedHashSet> |
| 16367 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::EnsureGrowable( | 16364 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::EnsureGrowable( |
| 16368 Handle<OrderedHashSet> table); | 16365 Handle<OrderedHashSet> table); |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 16468 | 16465 |
| 16469 Handle<Smi> hash = GetOrCreateHash(table->GetIsolate(), key); | 16466 Handle<Smi> hash = GetOrCreateHash(table->GetIsolate(), key); |
| 16470 int index = table->AddEntry(hash->value()); | 16467 int index = table->AddEntry(hash->value()); |
| 16471 table->set(index, *key); | 16468 table->set(index, *key); |
| 16472 table->set(index + kValueOffset, *value); | 16469 table->set(index + kValueOffset, *value); |
| 16473 return table; | 16470 return table; |
| 16474 } | 16471 } |
| 16475 | 16472 |
| 16476 | 16473 |
| 16477 template<class Derived, class TableType> | 16474 template<class Derived, class TableType> |
| 16478 void OrderedHashTableIterator<Derived, TableType>::EntryRemoved(int index) { | |
| 16479 int i = this->index()->value(); | |
| 16480 if (index < i) { | |
| 16481 set_count(Smi::FromInt(count()->value() - 1)); | |
| 16482 } | |
| 16483 if (index == i) { | |
| 16484 Seek(); | |
| 16485 } | |
| 16486 } | |
| 16487 | |
| 16488 | |
| 16489 template<class Derived, class TableType> | |
| 16490 void OrderedHashTableIterator<Derived, TableType>::Close() { | |
| 16491 if (Closed()) return; | |
| 16492 | |
| 16493 DisallowHeapAllocation no_allocation; | |
| 16494 | |
| 16495 Object* undefined = GetHeap()->undefined_value(); | |
| 16496 TableType* table = TableType::cast(this->table()); | |
| 16497 Object* previous = previous_iterator(); | |
| 16498 Object* next = next_iterator(); | |
| 16499 | |
| 16500 if (previous == undefined) { | |
| 16501 ASSERT_EQ(table->iterators(), this); | |
| 16502 table->set_iterators(next); | |
| 16503 } else { | |
| 16504 ASSERT_EQ(Derived::cast(previous)->next_iterator(), this); | |
| 16505 Derived::cast(previous)->set_next_iterator(next); | |
| 16506 } | |
| 16507 | |
| 16508 if (!next->IsUndefined()) { | |
| 16509 ASSERT_EQ(Derived::cast(next)->previous_iterator(), this); | |
| 16510 Derived::cast(next)->set_previous_iterator(previous); | |
| 16511 } | |
| 16512 | |
| 16513 set_previous_iterator(undefined); | |
| 16514 set_next_iterator(undefined); | |
| 16515 set_table(undefined); | |
| 16516 } | |
| 16517 | |
| 16518 | |
| 16519 template<class Derived, class TableType> | |
| 16520 void OrderedHashTableIterator<Derived, TableType>::Seek() { | |
| 16521 ASSERT(!Closed()); | |
| 16522 | |
| 16523 DisallowHeapAllocation no_allocation; | |
| 16524 | |
| 16525 int index = this->index()->value(); | |
| 16526 | |
| 16527 TableType* table = TableType::cast(this->table()); | |
| 16528 int used_capacity = table->UsedCapacity(); | |
| 16529 | |
| 16530 while (index < used_capacity && table->KeyAt(index)->IsTheHole()) { | |
| 16531 index++; | |
| 16532 } | |
| 16533 set_index(Smi::FromInt(index)); | |
| 16534 } | |
| 16535 | |
| 16536 | |
| 16537 template<class Derived, class TableType> | |
| 16538 void OrderedHashTableIterator<Derived, TableType>::MoveNext() { | |
| 16539 ASSERT(!Closed()); | |
| 16540 | |
| 16541 set_index(Smi::FromInt(index()->value() + 1)); | |
| 16542 set_count(Smi::FromInt(count()->value() + 1)); | |
| 16543 Seek(); | |
| 16544 } | |
| 16545 | |
| 16546 | |
| 16547 template<class Derived, class TableType> | |
| 16548 Handle<JSObject> OrderedHashTableIterator<Derived, TableType>::Next( | 16475 Handle<JSObject> OrderedHashTableIterator<Derived, TableType>::Next( |
| 16549 Handle<Derived> iterator) { | 16476 Handle<Derived> iterator) { |
| 16550 Isolate* isolate = iterator->GetIsolate(); | 16477 Isolate* isolate = iterator->GetIsolate(); |
| 16551 Factory* factory = isolate->factory(); | 16478 Factory* factory = isolate->factory(); |
| 16552 | 16479 |
| 16553 Handle<Object> object(iterator->table(), isolate); | 16480 Handle<Object> maybe_table(iterator->table(), isolate); |
| 16481 if (!maybe_table->IsUndefined()) { | |
| 16482 iterator->Transition(); | |
| 16554 | 16483 |
| 16555 if (!object->IsUndefined()) { | 16484 Handle<TableType> table(TableType::cast(iterator->table()), isolate); |
| 16556 Handle<TableType> table = Handle<TableType>::cast(object); | 16485 int index = Smi::cast(iterator->index())->value(); |
| 16557 int index = iterator->index()->value(); | 16486 int used_capacity = table->UsedCapacity(); |
| 16558 if (index < table->UsedCapacity()) { | 16487 |
| 16488 while (index < used_capacity && table->KeyAt(index)->IsTheHole()) { | |
| 16489 index++; | |
| 16490 } | |
| 16491 | |
| 16492 if (index < used_capacity) { | |
| 16559 int entry_index = table->EntryToIndex(index); | 16493 int entry_index = table->EntryToIndex(index); |
| 16560 iterator->MoveNext(); | 16494 Handle<Object> value = |
| 16561 Handle<Object> value = Derived::ValueForKind(iterator, entry_index); | 16495 Derived::ValueForKind(iterator, entry_index); |
| 16496 iterator->set_index(Smi::FromInt(index + 1)); | |
| 16562 return factory->NewIteratorResultObject(value, false); | 16497 return factory->NewIteratorResultObject(value, false); |
| 16563 } else { | |
| 16564 iterator->Close(); | |
| 16565 } | 16498 } |
| 16499 | |
| 16500 iterator->set_table(iterator->GetHeap()->undefined_value()); | |
| 16566 } | 16501 } |
| 16567 | 16502 |
| 16568 return factory->NewIteratorResultObject(factory->undefined_value(), true); | 16503 return factory->NewIteratorResultObject(factory->undefined_value(), true); |
| 16569 } | 16504 } |
| 16570 | 16505 |
| 16571 | 16506 |
| 16507 template<class Derived, class TableType> | |
| 16508 void OrderedHashTableIterator<Derived, TableType>::Transition() { | |
| 16509 Isolate* isolate = GetIsolate(); | |
| 16510 Handle<TableType> table(TableType::cast(this->table()), isolate); | |
| 16511 if (!table->IsObsolete()) return; | |
| 16512 | |
| 16513 int index = Smi::cast(this->index())->value(); | |
| 16514 while (table->IsObsolete()) { | |
| 16515 Handle<TableType> next_table(table->NextTable(), isolate); | |
| 16516 | |
| 16517 if (index > 0) { | |
| 16518 int nod = table->NumberOfDeletedElements(); | |
| 16519 | |
| 16520 // When we clear the table we set the number of deleted elements to -1. | |
| 16521 if (nod == -1) { | |
| 16522 index = 0; | |
| 16523 } else { | |
| 16524 int old_index = index; | |
| 16525 for (int i = 0; i < nod; ++i) { | |
| 16526 int removed_index = table->RemovedIndexAt(i); | |
| 16527 if (removed_index >= old_index) break; | |
|
arv (Not doing code reviews)
2014/05/14 20:36:36
This was wrong before. We need to compare with the
| |
| 16528 --index; | |
| 16529 } | |
| 16530 } | |
| 16531 } | |
| 16532 | |
| 16533 table = next_table; | |
| 16534 } | |
| 16535 | |
| 16536 set_table(*table); | |
| 16537 set_index(Smi::FromInt(index)); | |
| 16538 } | |
| 16539 | |
| 16540 | |
| 16572 template<class Derived, class TableType> | 16541 template<class Derived, class TableType> |
| 16573 Handle<Derived> OrderedHashTableIterator<Derived, TableType>::CreateInternal( | 16542 Handle<Derived> OrderedHashTableIterator<Derived, TableType>::CreateInternal( |
| 16574 Handle<Map> map, | 16543 Handle<Map> map, |
| 16575 Handle<TableType> table, | 16544 Handle<TableType> table, |
| 16576 int kind) { | 16545 int kind) { |
| 16577 Isolate* isolate = table->GetIsolate(); | 16546 Isolate* isolate = table->GetIsolate(); |
| 16578 | 16547 |
| 16579 Handle<Object> undefined = isolate->factory()->undefined_value(); | |
| 16580 | |
| 16581 Handle<Derived> new_iterator = Handle<Derived>::cast( | 16548 Handle<Derived> new_iterator = Handle<Derived>::cast( |
| 16582 isolate->factory()->NewJSObjectFromMap(map)); | 16549 isolate->factory()->NewJSObjectFromMap(map)); |
| 16583 new_iterator->set_previous_iterator(*undefined); | |
| 16584 new_iterator->set_table(*table); | 16550 new_iterator->set_table(*table); |
| 16585 new_iterator->set_index(Smi::FromInt(0)); | 16551 new_iterator->set_index(Smi::FromInt(0)); |
| 16586 new_iterator->set_count(Smi::FromInt(0)); | |
| 16587 new_iterator->set_kind(Smi::FromInt(kind)); | 16552 new_iterator->set_kind(Smi::FromInt(kind)); |
| 16588 | |
| 16589 Handle<Object> old_iterator(table->iterators(), isolate); | |
| 16590 if (!old_iterator->IsUndefined()) { | |
| 16591 Handle<Derived>::cast(old_iterator)->set_previous_iterator(*new_iterator); | |
| 16592 new_iterator->set_next_iterator(*old_iterator); | |
| 16593 } else { | |
| 16594 new_iterator->set_next_iterator(*undefined); | |
| 16595 } | |
| 16596 | |
| 16597 table->set_iterators(*new_iterator); | |
| 16598 | |
| 16599 return new_iterator; | 16553 return new_iterator; |
| 16600 } | 16554 } |
| 16601 | 16555 |
| 16602 | 16556 |
| 16603 template void | |
| 16604 OrderedHashTableIterator<JSSetIterator, OrderedHashSet>::EntryRemoved( | |
| 16605 int index); | |
| 16606 | |
| 16607 template void | |
| 16608 OrderedHashTableIterator<JSSetIterator, OrderedHashSet>::Close(); | |
| 16609 | |
| 16610 template Handle<JSObject> | 16557 template Handle<JSObject> |
| 16611 OrderedHashTableIterator<JSSetIterator, OrderedHashSet>::Next( | 16558 OrderedHashTableIterator<JSSetIterator, OrderedHashSet>::Next( |
| 16612 Handle<JSSetIterator> iterator); | 16559 Handle<JSSetIterator> iterator); |
| 16613 | 16560 |
| 16561 template void | |
| 16562 OrderedHashTableIterator<JSSetIterator, OrderedHashSet>::Transition(); | |
| 16563 | |
| 16614 template Handle<JSSetIterator> | 16564 template Handle<JSSetIterator> |
| 16615 OrderedHashTableIterator<JSSetIterator, OrderedHashSet>::CreateInternal( | 16565 OrderedHashTableIterator<JSSetIterator, OrderedHashSet>::CreateInternal( |
| 16616 Handle<Map> map, Handle<OrderedHashSet> table, int kind); | 16566 Handle<Map> map, Handle<OrderedHashSet> table, int kind); |
| 16617 | 16567 |
| 16618 | 16568 |
| 16619 template void | |
| 16620 OrderedHashTableIterator<JSMapIterator, OrderedHashMap>::EntryRemoved( | |
| 16621 int index); | |
| 16622 | |
| 16623 template void | |
| 16624 OrderedHashTableIterator<JSMapIterator, OrderedHashMap>::Close(); | |
| 16625 | |
| 16626 template Handle<JSObject> | 16569 template Handle<JSObject> |
| 16627 OrderedHashTableIterator<JSMapIterator, OrderedHashMap>::Next( | 16570 OrderedHashTableIterator<JSMapIterator, OrderedHashMap>::Next( |
| 16628 Handle<JSMapIterator> iterator); | 16571 Handle<JSMapIterator> iterator); |
| 16629 | 16572 |
| 16573 template void | |
| 16574 OrderedHashTableIterator<JSMapIterator, OrderedHashMap>::Transition(); | |
| 16575 | |
| 16630 template Handle<JSMapIterator> | 16576 template Handle<JSMapIterator> |
| 16631 OrderedHashTableIterator<JSMapIterator, OrderedHashMap>::CreateInternal( | 16577 OrderedHashTableIterator<JSMapIterator, OrderedHashMap>::CreateInternal( |
| 16632 Handle<Map> map, Handle<OrderedHashMap> table, int kind); | 16578 Handle<Map> map, Handle<OrderedHashMap> table, int kind); |
| 16633 | 16579 |
| 16634 | 16580 |
| 16635 Handle<Object> JSSetIterator::ValueForKind( | 16581 Handle<Object> JSSetIterator::ValueForKind( |
| 16636 Handle<JSSetIterator> iterator, int entry_index) { | 16582 Handle<JSSetIterator> iterator, int entry_index) { |
| 16637 int kind = iterator->kind()->value(); | 16583 int kind = iterator->kind()->value(); |
| 16638 // Set.prototype only has values and entries. | 16584 // Set.prototype only has values and entries. |
| 16639 ASSERT(kind == kKindValues || kind == kKindEntries); | 16585 ASSERT(kind == kKindValues || kind == kKindEntries); |
| 16640 | 16586 |
| 16641 Isolate* isolate = iterator->GetIsolate(); | 16587 Isolate* isolate = iterator->GetIsolate(); |
| 16642 Factory* factory = isolate->factory(); | 16588 Factory* factory = isolate->factory(); |
| (...skipping 631 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 17274 #define ERROR_MESSAGES_TEXTS(C, T) T, | 17220 #define ERROR_MESSAGES_TEXTS(C, T) T, |
| 17275 static const char* error_messages_[] = { | 17221 static const char* error_messages_[] = { |
| 17276 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) | 17222 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) |
| 17277 }; | 17223 }; |
| 17278 #undef ERROR_MESSAGES_TEXTS | 17224 #undef ERROR_MESSAGES_TEXTS |
| 17279 return error_messages_[reason]; | 17225 return error_messages_[reason]; |
| 17280 } | 17226 } |
| 17281 | 17227 |
| 17282 | 17228 |
| 17283 } } // namespace v8::internal | 17229 } } // namespace v8::internal |
| OLD | NEW |