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()); | 16217 table->set_next_table(isolate->heap()->undefined_value()); |
16218 table->set_changes(isolate->heap()->undefined_value()); | |
16218 return table; | 16219 return table; |
16219 } | 16220 } |
16220 | 16221 |
16221 | 16222 |
16222 template<class Derived, class Iterator, int entrysize> | 16223 template<class Derived, class Iterator, int entrysize> |
16223 Handle<Derived> OrderedHashTable<Derived, Iterator, entrysize>::EnsureGrowable( | 16224 Handle<Derived> OrderedHashTable<Derived, Iterator, entrysize>::EnsureGrowable( |
16224 Handle<Derived> table) { | 16225 Handle<Derived> table) { |
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(); |
(...skipping 16 matching lines...) Expand all Loading... | |
16244 | 16245 |
16245 | 16246 |
16246 template<class Derived, class Iterator, int entrysize> | 16247 template<class Derived, class Iterator, int entrysize> |
16247 Handle<Derived> OrderedHashTable<Derived, Iterator, entrysize>::Clear( | 16248 Handle<Derived> OrderedHashTable<Derived, Iterator, entrysize>::Clear( |
16248 Handle<Derived> table) { | 16249 Handle<Derived> table) { |
16249 Handle<Derived> new_table = | 16250 Handle<Derived> new_table = |
16250 Allocate(table->GetIsolate(), | 16251 Allocate(table->GetIsolate(), |
16251 kMinCapacity, | 16252 kMinCapacity, |
16252 table->GetHeap()->InNewSpace(*table) ? NOT_TENURED : TENURED); | 16253 table->GetHeap()->InNewSpace(*table) ? NOT_TENURED : TENURED); |
16253 | 16254 |
16254 new_table->set_iterators(table->iterators()); | 16255 table->set_next_table(*new_table); |
16255 table->set_iterators(table->GetHeap()->undefined_value()); | 16256 // changes is kept as undefined for Clear. |
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 | 16257 |
16265 return new_table; | 16258 return new_table; |
16266 } | 16259 } |
16267 | 16260 |
16268 | 16261 |
16269 template<class Derived, class Iterator, int entrysize> | 16262 template<class Derived, class Iterator, int entrysize> |
16270 Handle<Derived> OrderedHashTable<Derived, Iterator, entrysize>::Rehash( | 16263 Handle<Derived> OrderedHashTable<Derived, Iterator, entrysize>::Rehash( |
16271 Handle<Derived> table, int new_capacity) { | 16264 Handle<Derived> table, int new_capacity) { |
16272 Handle<Derived> new_table = | 16265 Handle<Derived> new_table = |
16273 Allocate(table->GetIsolate(), | 16266 Allocate(table->GetIsolate(), |
16274 new_capacity, | 16267 new_capacity, |
16275 table->GetHeap()->InNewSpace(*table) ? NOT_TENURED : TENURED); | 16268 table->GetHeap()->InNewSpace(*table) ? NOT_TENURED : TENURED); |
16276 int nof = table->NumberOfElements(); | 16269 int nof = table->NumberOfElements(); |
16277 int nod = table->NumberOfDeletedElements(); | 16270 int nod = table->NumberOfDeletedElements(); |
16278 int new_buckets = new_table->NumberOfBuckets(); | 16271 int new_buckets = new_table->NumberOfBuckets(); |
16279 int new_entry = 0; | 16272 int new_entry = 0; |
16273 Handle<FixedArray> removed_entries = | |
16274 table->GetIsolate()->factory()->NewFixedArray(nod); | |
16275 int removed_entries_index = 0; | |
16280 for (int old_entry = 0; old_entry < (nof + nod); ++old_entry) { | 16276 for (int old_entry = 0; old_entry < (nof + nod); ++old_entry) { |
16281 Object* key = table->KeyAt(old_entry); | 16277 Object* key = table->KeyAt(old_entry); |
16282 if (key->IsTheHole()) continue; | 16278 if (key->IsTheHole()) { |
16279 removed_entries->set(removed_entries_index++, Smi::FromInt(old_entry)); | |
16280 continue; | |
16281 } | |
16283 Object* hash = key->GetHash(); | 16282 Object* hash = key->GetHash(); |
16284 int bucket = Smi::cast(hash)->value() & (new_buckets - 1); | 16283 int bucket = Smi::cast(hash)->value() & (new_buckets - 1); |
16285 Object* chain_entry = new_table->get(kHashTableStartIndex + bucket); | 16284 Object* chain_entry = new_table->get(kHashTableStartIndex + bucket); |
16286 new_table->set(kHashTableStartIndex + bucket, Smi::FromInt(new_entry)); | 16285 new_table->set(kHashTableStartIndex + bucket, Smi::FromInt(new_entry)); |
16287 int new_index = new_table->EntryToIndex(new_entry); | 16286 int new_index = new_table->EntryToIndex(new_entry); |
16288 int old_index = table->EntryToIndex(old_entry); | 16287 int old_index = table->EntryToIndex(old_entry); |
16289 for (int i = 0; i < entrysize; ++i) { | 16288 for (int i = 0; i < entrysize; ++i) { |
16290 Object* value = table->get(old_index + i); | 16289 Object* value = table->get(old_index + i); |
16291 new_table->set(new_index + i, value); | 16290 new_table->set(new_index + i, value); |
16292 } | 16291 } |
16293 new_table->set(new_index + kChainOffset, chain_entry); | 16292 new_table->set(new_index + kChainOffset, chain_entry); |
16294 ++new_entry; | 16293 ++new_entry; |
16295 } | 16294 } |
16296 new_table->SetNumberOfElements(nof); | 16295 new_table->SetNumberOfElements(nof); |
16297 | 16296 |
16298 new_table->set_iterators(table->iterators()); | 16297 table->set_next_table(*new_table); |
16299 table->set_iterators(table->GetHeap()->undefined_value()); | 16298 table->set_changes(*removed_entries); |
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 | 16299 |
16309 return new_table; | 16300 return new_table; |
16310 } | 16301 } |
16311 | 16302 |
16312 | 16303 |
16313 template<class Derived, class Iterator, int entrysize> | 16304 template<class Derived, class Iterator, int entrysize> |
16314 int OrderedHashTable<Derived, Iterator, entrysize>::FindEntry( | 16305 int OrderedHashTable<Derived, Iterator, entrysize>::FindEntry( |
16315 Handle<Object> key) { | 16306 Handle<Object> key) { |
16316 DisallowHeapAllocation no_gc; | 16307 DisallowHeapAllocation no_gc; |
16317 ASSERT(!key->IsTheHole()); | 16308 ASSERT(!key->IsTheHole()); |
(...skipping 24 matching lines...) Expand all Loading... | |
16342 | 16333 |
16343 | 16334 |
16344 template<class Derived, class Iterator, int entrysize> | 16335 template<class Derived, class Iterator, int entrysize> |
16345 void OrderedHashTable<Derived, Iterator, entrysize>::RemoveEntry(int entry) { | 16336 void OrderedHashTable<Derived, Iterator, entrysize>::RemoveEntry(int entry) { |
16346 int index = EntryToIndex(entry); | 16337 int index = EntryToIndex(entry); |
16347 for (int i = 0; i < entrysize; ++i) { | 16338 for (int i = 0; i < entrysize; ++i) { |
16348 set_the_hole(index + i); | 16339 set_the_hole(index + i); |
16349 } | 16340 } |
16350 SetNumberOfElements(NumberOfElements() - 1); | 16341 SetNumberOfElements(NumberOfElements() - 1); |
16351 SetNumberOfDeletedElements(NumberOfDeletedElements() + 1); | 16342 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 } | 16343 } |
16360 | 16344 |
16361 | 16345 |
16362 template Handle<OrderedHashSet> | 16346 template Handle<OrderedHashSet> |
16363 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::Allocate( | 16347 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::Allocate( |
16364 Isolate* isolate, int capacity, PretenureFlag pretenure); | 16348 Isolate* isolate, int capacity, PretenureFlag pretenure); |
16365 | 16349 |
16366 template Handle<OrderedHashSet> | 16350 template Handle<OrderedHashSet> |
16367 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::EnsureGrowable( | 16351 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::EnsureGrowable( |
16368 Handle<OrderedHashSet> table); | 16352 Handle<OrderedHashSet> table); |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
16468 | 16452 |
16469 Handle<Smi> hash = GetOrCreateHash(table->GetIsolate(), key); | 16453 Handle<Smi> hash = GetOrCreateHash(table->GetIsolate(), key); |
16470 int index = table->AddEntry(hash->value()); | 16454 int index = table->AddEntry(hash->value()); |
16471 table->set(index, *key); | 16455 table->set(index, *key); |
16472 table->set(index + kValueOffset, *value); | 16456 table->set(index + kValueOffset, *value); |
16473 return table; | 16457 return table; |
16474 } | 16458 } |
16475 | 16459 |
16476 | 16460 |
16477 template<class Derived, class TableType> | 16461 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( | 16462 Handle<JSObject> OrderedHashTableIterator<Derived, TableType>::Next( |
16549 Handle<Derived> iterator) { | 16463 Handle<Derived> iterator) { |
16550 Isolate* isolate = iterator->GetIsolate(); | 16464 Isolate* isolate = iterator->GetIsolate(); |
16551 Factory* factory = isolate->factory(); | 16465 Factory* factory = isolate->factory(); |
16552 | 16466 |
16553 Handle<Object> object(iterator->table(), isolate); | 16467 Handle<Object> maybe_table(iterator->table(), isolate); |
16468 if (!maybe_table->IsUndefined()) { | |
16469 iterator->Transition(); | |
16554 | 16470 |
16555 if (!object->IsUndefined()) { | 16471 Handle<TableType> table(TableType::cast(iterator->table()), isolate); |
16556 Handle<TableType> table = Handle<TableType>::cast(object); | 16472 int index = Smi::cast(iterator->index())->value(); |
16557 int index = iterator->index()->value(); | 16473 int used_capacity = table->UsedCapacity(); |
16558 if (index < table->UsedCapacity()) { | 16474 |
16475 while (index < used_capacity && table->KeyAt(index)->IsTheHole()) { | |
16476 index++; | |
16477 } | |
16478 | |
16479 if (index < used_capacity) { | |
16559 int entry_index = table->EntryToIndex(index); | 16480 int entry_index = table->EntryToIndex(index); |
16560 iterator->MoveNext(); | 16481 Handle<Object> value = |
16561 Handle<Object> value = Derived::ValueForKind(iterator, entry_index); | 16482 Derived::ValueForKind(iterator, entry_index); |
16483 iterator->set_index(Smi::FromInt(index + 1)); | |
16562 return factory->NewIteratorResultObject(value, false); | 16484 return factory->NewIteratorResultObject(value, false); |
16563 } else { | |
16564 iterator->Close(); | |
16565 } | 16485 } |
16486 | |
16487 iterator->set_table(iterator->GetHeap()->undefined_value()); | |
16566 } | 16488 } |
16567 | 16489 |
16568 return factory->NewIteratorResultObject(factory->undefined_value(), true); | 16490 return factory->NewIteratorResultObject(factory->undefined_value(), true); |
16569 } | 16491 } |
16570 | 16492 |
16571 | 16493 |
16494 template<class Derived, class TableType> | |
16495 void OrderedHashTableIterator<Derived, TableType>::Transition() { | |
16496 Isolate* isolate = GetIsolate(); | |
16497 Handle<TableType> table(TableType::cast(this->table()), isolate); | |
16498 Handle<Object> maybe_next_table(table->next_table(), isolate); | |
16499 if (maybe_next_table->IsUndefined()) return; | |
16500 | |
16501 int index = Smi::cast(this->index())->value(); | |
16502 while (!maybe_next_table->IsUndefined()) { | |
16503 Handle<TableType> next_table = Handle<TableType>::cast(maybe_next_table); | |
16504 Handle<Object> maybe_changes(table->changes(), table->GetIsolate()); | |
16505 | |
16506 // changes is kept as undefined after a Clear. | |
16507 if (maybe_changes->IsUndefined()) { | |
16508 index = 0; | |
16509 } else { | |
16510 Handle<FixedArray> changes = Handle<FixedArray>::cast(maybe_changes); | |
16511 for (int i = 0; i < changes->length(); ++i) { | |
16512 int entry_index = Smi::cast(changes->get(i))->value(); | |
16513 if (entry_index < index) { | |
rossberg
2014/05/14 14:27:25
You can simplify this slightly to
if (entry_ind
| |
16514 index--; | |
16515 } else { | |
16516 break; | |
16517 } | |
16518 } | |
16519 } | |
16520 | |
16521 table = next_table; | |
16522 maybe_next_table = Handle<Object>(table->next_table(), isolate); | |
16523 } | |
16524 | |
16525 set_table(*table); | |
16526 set_index(Smi::FromInt(index)); | |
16527 } | |
16528 | |
16529 | |
16572 template<class Derived, class TableType> | 16530 template<class Derived, class TableType> |
16573 Handle<Derived> OrderedHashTableIterator<Derived, TableType>::CreateInternal( | 16531 Handle<Derived> OrderedHashTableIterator<Derived, TableType>::CreateInternal( |
16574 Handle<Map> map, | 16532 Handle<Map> map, |
16575 Handle<TableType> table, | 16533 Handle<TableType> table, |
16576 int kind) { | 16534 int kind) { |
16577 Isolate* isolate = table->GetIsolate(); | 16535 Isolate* isolate = table->GetIsolate(); |
16578 | 16536 |
16579 Handle<Object> undefined = isolate->factory()->undefined_value(); | |
16580 | |
16581 Handle<Derived> new_iterator = Handle<Derived>::cast( | 16537 Handle<Derived> new_iterator = Handle<Derived>::cast( |
16582 isolate->factory()->NewJSObjectFromMap(map)); | 16538 isolate->factory()->NewJSObjectFromMap(map)); |
16583 new_iterator->set_previous_iterator(*undefined); | |
16584 new_iterator->set_table(*table); | 16539 new_iterator->set_table(*table); |
16585 new_iterator->set_index(Smi::FromInt(0)); | 16540 new_iterator->set_index(Smi::FromInt(0)); |
16586 new_iterator->set_count(Smi::FromInt(0)); | |
16587 new_iterator->set_kind(Smi::FromInt(kind)); | 16541 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; | 16542 return new_iterator; |
16600 } | 16543 } |
16601 | 16544 |
16602 | 16545 |
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> | 16546 template Handle<JSObject> |
16611 OrderedHashTableIterator<JSSetIterator, OrderedHashSet>::Next( | 16547 OrderedHashTableIterator<JSSetIterator, OrderedHashSet>::Next( |
16612 Handle<JSSetIterator> iterator); | 16548 Handle<JSSetIterator> iterator); |
16613 | 16549 |
16550 template void | |
16551 OrderedHashTableIterator<JSSetIterator, OrderedHashSet>::Transition(); | |
16552 | |
16614 template Handle<JSSetIterator> | 16553 template Handle<JSSetIterator> |
16615 OrderedHashTableIterator<JSSetIterator, OrderedHashSet>::CreateInternal( | 16554 OrderedHashTableIterator<JSSetIterator, OrderedHashSet>::CreateInternal( |
16616 Handle<Map> map, Handle<OrderedHashSet> table, int kind); | 16555 Handle<Map> map, Handle<OrderedHashSet> table, int kind); |
16617 | 16556 |
16618 | 16557 |
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> | 16558 template Handle<JSObject> |
16627 OrderedHashTableIterator<JSMapIterator, OrderedHashMap>::Next( | 16559 OrderedHashTableIterator<JSMapIterator, OrderedHashMap>::Next( |
16628 Handle<JSMapIterator> iterator); | 16560 Handle<JSMapIterator> iterator); |
16629 | 16561 |
16562 template void | |
16563 OrderedHashTableIterator<JSMapIterator, OrderedHashMap>::Transition(); | |
16564 | |
16630 template Handle<JSMapIterator> | 16565 template Handle<JSMapIterator> |
16631 OrderedHashTableIterator<JSMapIterator, OrderedHashMap>::CreateInternal( | 16566 OrderedHashTableIterator<JSMapIterator, OrderedHashMap>::CreateInternal( |
16632 Handle<Map> map, Handle<OrderedHashMap> table, int kind); | 16567 Handle<Map> map, Handle<OrderedHashMap> table, int kind); |
16633 | 16568 |
16634 | 16569 |
16635 Handle<Object> JSSetIterator::ValueForKind( | 16570 Handle<Object> JSSetIterator::ValueForKind( |
16636 Handle<JSSetIterator> iterator, int entry_index) { | 16571 Handle<JSSetIterator> iterator, |
16572 int entry_index) { | |
16637 int kind = iterator->kind()->value(); | 16573 int kind = iterator->kind()->value(); |
16638 // Set.prototype only has values and entries. | 16574 // Set.prototype only has values and entries. |
16639 ASSERT(kind == kKindValues || kind == kKindEntries); | 16575 ASSERT(kind == kKindValues || kind == kKindEntries); |
16640 | 16576 |
16641 Isolate* isolate = iterator->GetIsolate(); | 16577 Isolate* isolate = iterator->GetIsolate(); |
16642 Factory* factory = isolate->factory(); | 16578 Factory* factory = isolate->factory(); |
16643 | 16579 |
16644 Handle<OrderedHashSet> table( | 16580 Handle<OrderedHashSet> table( |
16645 OrderedHashSet::cast(iterator->table()), isolate); | 16581 OrderedHashSet::cast(iterator->table()), isolate); |
16646 Handle<Object> value = Handle<Object>(table->get(entry_index), isolate); | 16582 Handle<Object> value = Handle<Object>(table->get(entry_index), isolate); |
16647 | 16583 |
16648 if (kind == kKindEntries) { | 16584 if (kind == kKindEntries) { |
16649 Handle<FixedArray> array = factory->NewFixedArray(2); | 16585 Handle<FixedArray> array = factory->NewFixedArray(2); |
16650 array->set(0, *value); | 16586 array->set(0, *value); |
16651 array->set(1, *value); | 16587 array->set(1, *value); |
16652 return factory->NewJSArrayWithElements(array); | 16588 return factory->NewJSArrayWithElements(array); |
16653 } | 16589 } |
16654 | 16590 |
16655 return value; | 16591 return value; |
16656 } | 16592 } |
16657 | 16593 |
16658 | 16594 |
16659 Handle<Object> JSMapIterator::ValueForKind( | 16595 Handle<Object> JSMapIterator::ValueForKind( |
16660 Handle<JSMapIterator> iterator, int entry_index) { | 16596 Handle<JSMapIterator> iterator, |
16597 int entry_index) { | |
16661 int kind = iterator->kind()->value(); | 16598 int kind = iterator->kind()->value(); |
16662 ASSERT(kind == kKindKeys || kind == kKindValues || kind == kKindEntries); | 16599 ASSERT(kind == kKindKeys || kind == kKindValues || kind == kKindEntries); |
16663 | 16600 |
16664 Isolate* isolate = iterator->GetIsolate(); | 16601 Isolate* isolate = iterator->GetIsolate(); |
16665 Factory* factory = isolate->factory(); | 16602 Factory* factory = isolate->factory(); |
16666 | 16603 |
16667 Handle<OrderedHashMap> table( | 16604 Handle<OrderedHashMap> table( |
16668 OrderedHashMap::cast(iterator->table()), isolate); | 16605 OrderedHashMap::cast(iterator->table()), isolate); |
16669 | 16606 |
16670 switch (kind) { | 16607 switch (kind) { |
(...skipping 603 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
17274 #define ERROR_MESSAGES_TEXTS(C, T) T, | 17211 #define ERROR_MESSAGES_TEXTS(C, T) T, |
17275 static const char* error_messages_[] = { | 17212 static const char* error_messages_[] = { |
17276 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) | 17213 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) |
17277 }; | 17214 }; |
17278 #undef ERROR_MESSAGES_TEXTS | 17215 #undef ERROR_MESSAGES_TEXTS |
17279 return error_messages_[reason]; | 17216 return error_messages_[reason]; |
17280 } | 17217 } |
17281 | 17218 |
17282 | 17219 |
17283 } } // namespace v8::internal | 17220 } } // namespace v8::internal |
OLD | NEW |