Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(26)

Side by Side Diff: src/objects.cc

Issue 240323003: ES6: Add support for Map/Set forEach (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 1657 matching lines...) Expand 10 before | Expand all | Expand 10 after
1668 case JS_GENERATOR_OBJECT_TYPE: 1668 case JS_GENERATOR_OBJECT_TYPE:
1669 case JS_MODULE_TYPE: 1669 case JS_MODULE_TYPE:
1670 case JS_VALUE_TYPE: 1670 case JS_VALUE_TYPE:
1671 case JS_DATE_TYPE: 1671 case JS_DATE_TYPE:
1672 case JS_ARRAY_TYPE: 1672 case JS_ARRAY_TYPE:
1673 case JS_ARRAY_BUFFER_TYPE: 1673 case JS_ARRAY_BUFFER_TYPE:
1674 case JS_TYPED_ARRAY_TYPE: 1674 case JS_TYPED_ARRAY_TYPE:
1675 case JS_DATA_VIEW_TYPE: 1675 case JS_DATA_VIEW_TYPE:
1676 case JS_SET_TYPE: 1676 case JS_SET_TYPE:
1677 case JS_MAP_TYPE: 1677 case JS_MAP_TYPE:
1678 case JS_SET_ITERATOR_TYPE:
1679 case JS_MAP_ITERATOR_TYPE:
1678 case JS_WEAK_MAP_TYPE: 1680 case JS_WEAK_MAP_TYPE:
1679 case JS_WEAK_SET_TYPE: 1681 case JS_WEAK_SET_TYPE:
1680 case JS_REGEXP_TYPE: 1682 case JS_REGEXP_TYPE:
1681 case JS_GLOBAL_PROXY_TYPE: 1683 case JS_GLOBAL_PROXY_TYPE:
1682 case JS_GLOBAL_OBJECT_TYPE: 1684 case JS_GLOBAL_OBJECT_TYPE:
1683 case JS_BUILTINS_OBJECT_TYPE: 1685 case JS_BUILTINS_OBJECT_TYPE:
1684 case JS_MESSAGE_OBJECT_TYPE: 1686 case JS_MESSAGE_OBJECT_TYPE:
1685 JSObject::BodyDescriptor::IterateBody(this, object_size, v); 1687 JSObject::BodyDescriptor::IterateBody(this, object_size, v);
1686 break; 1688 break;
1687 case JS_FUNCTION_TYPE: 1689 case JS_FUNCTION_TYPE:
(...skipping 14625 matching lines...) Expand 10 before | Expand all | Expand 10 after
16313 } 16315 }
16314 16316
16315 16317
16316 void WeakHashTable::AddEntry(int entry, Object* key, Object* value) { 16318 void WeakHashTable::AddEntry(int entry, Object* key, Object* value) {
16317 set(EntryToIndex(entry), key); 16319 set(EntryToIndex(entry), key);
16318 set(EntryToValueIndex(entry), value); 16320 set(EntryToValueIndex(entry), value);
16319 ElementAdded(); 16321 ElementAdded();
16320 } 16322 }
16321 16323
16322 16324
16323 template<class Derived, int entrysize> 16325 template<class Derived, class Iterator, int entrysize>
16324 Handle<Derived> OrderedHashTable<Derived, entrysize>::Allocate( 16326 Handle<Derived> OrderedHashTable<Derived, Iterator, entrysize>::Allocate(
16325 Isolate* isolate, int capacity, PretenureFlag pretenure) { 16327 Isolate* isolate, int capacity, PretenureFlag pretenure) {
16326 // Capacity must be a power of two, since we depend on being able 16328 // Capacity must be a power of two, since we depend on being able
16327 // to divide and multiple by 2 (kLoadFactor) to derive capacity 16329 // to divide and multiple by 2 (kLoadFactor) to derive capacity
16328 // from number of buckets. If we decide to change kLoadFactor 16330 // from number of buckets. If we decide to change kLoadFactor
16329 // to something other than 2, capacity should be stored as another 16331 // to something other than 2, capacity should be stored as another
16330 // field of this object. 16332 // field of this object.
16331 const int kMinCapacity = 4;
16332 capacity = RoundUpToPowerOf2(Max(kMinCapacity, capacity)); 16333 capacity = RoundUpToPowerOf2(Max(kMinCapacity, capacity));
16333 if (capacity > kMaxCapacity) { 16334 if (capacity > kMaxCapacity) {
16334 v8::internal::Heap::FatalProcessOutOfMemory("invalid table size", true); 16335 v8::internal::Heap::FatalProcessOutOfMemory("invalid table size", true);
16335 } 16336 }
16336 int num_buckets = capacity / kLoadFactor; 16337 int num_buckets = capacity / kLoadFactor;
16337 Handle<FixedArray> backing_store = isolate->factory()->NewFixedArray( 16338 Handle<FixedArray> backing_store = isolate->factory()->NewFixedArray(
16338 kHashTableStartIndex + num_buckets + (capacity * kEntrySize), pretenure); 16339 kHashTableStartIndex + num_buckets + (capacity * kEntrySize), pretenure);
16339 backing_store->set_map_no_write_barrier( 16340 backing_store->set_map_no_write_barrier(
16340 isolate->heap()->ordered_hash_table_map()); 16341 isolate->heap()->ordered_hash_table_map());
16341 Handle<Derived> table = Handle<Derived>::cast(backing_store); 16342 Handle<Derived> table = Handle<Derived>::cast(backing_store);
16342 for (int i = 0; i < num_buckets; ++i) { 16343 for (int i = 0; i < num_buckets; ++i) {
16343 table->set(kHashTableStartIndex + i, Smi::FromInt(kNotFound)); 16344 table->set(kHashTableStartIndex + i, Smi::FromInt(kNotFound));
16344 } 16345 }
16345 table->SetNumberOfBuckets(num_buckets); 16346 table->SetNumberOfBuckets(num_buckets);
16346 table->SetNumberOfElements(0); 16347 table->SetNumberOfElements(0);
16347 table->SetNumberOfDeletedElements(0); 16348 table->SetNumberOfDeletedElements(0);
16349 table->set_iterators(isolate->heap()->undefined_value());
16348 return table; 16350 return table;
16349 } 16351 }
16350 16352
16351 16353
16352 template<class Derived, int entrysize> 16354 template<class Derived, class Iterator, int entrysize>
16353 Handle<Derived> OrderedHashTable<Derived, entrysize>::EnsureGrowable( 16355 Handle<Derived> OrderedHashTable<Derived, Iterator, entrysize>::EnsureGrowable(
16354 Handle<Derived> table) { 16356 Handle<Derived> table) {
16355 int nof = table->NumberOfElements(); 16357 int nof = table->NumberOfElements();
16356 int nod = table->NumberOfDeletedElements(); 16358 int nod = table->NumberOfDeletedElements();
16357 int capacity = table->Capacity(); 16359 int capacity = table->Capacity();
16358 if ((nof + nod) < capacity) return table; 16360 if ((nof + nod) < capacity) return table;
16359 // Don't need to grow if we can simply clear out deleted entries instead. 16361 // Don't need to grow if we can simply clear out deleted entries instead.
16360 // Note that we can't compact in place, though, so we always allocate 16362 // Note that we can't compact in place, though, so we always allocate
16361 // a new table. 16363 // a new table.
16362 return Rehash(table, (nod < (capacity >> 1)) ? capacity << 1 : capacity); 16364 return Rehash(table, (nod < (capacity >> 1)) ? capacity << 1 : capacity);
16363 } 16365 }
16364 16366
16365 16367
16366 template<class Derived, int entrysize> 16368 template<class Derived, class Iterator, int entrysize>
16367 Handle<Derived> OrderedHashTable<Derived, entrysize>::Shrink( 16369 Handle<Derived> OrderedHashTable<Derived, Iterator, entrysize>::Shrink(
16368 Handle<Derived> table) { 16370 Handle<Derived> table) {
16369 int nof = table->NumberOfElements(); 16371 int nof = table->NumberOfElements();
16370 int capacity = table->Capacity(); 16372 int capacity = table->Capacity();
16371 if (nof > (capacity >> 2)) return table; 16373 if (nof > (capacity >> 2)) return table;
16372 return Rehash(table, capacity / 2); 16374 return Rehash(table, capacity / 2);
16373 } 16375 }
16374 16376
16375 16377
16376 template<class Derived, int entrysize> 16378 template<class Derived, class Iterator, int entrysize>
16377 Handle<Derived> OrderedHashTable<Derived, entrysize>::Rehash( 16379 Handle<Derived> OrderedHashTable<Derived, Iterator, entrysize>::Clear(
16380 Handle<Derived> table) {
16381 Handle<Derived> new_table =
16382 Allocate(table->GetIsolate(),
16383 kMinCapacity,
16384 table->GetHeap()->InNewSpace(*table) ? NOT_TENURED : TENURED);
16385
16386 new_table->set_iterators(table->iterators());
16387 table->set_iterators(table->GetHeap()->undefined_value());
16388
16389 DisallowHeapAllocation no_allocation;
16390 for (Object* object = new_table->iterators();
16391 !object->IsUndefined();
16392 object = Iterator::cast(object)->next_iterator()) {
16393 Iterator::cast(object)->TableCleared();
16394 Iterator::cast(object)->set_table(*new_table);
16395 }
16396
16397 return new_table;
16398 }
16399
16400
16401 template<class Derived, class Iterator, int entrysize>
16402 Handle<Derived> OrderedHashTable<Derived, Iterator, entrysize>::Rehash(
16378 Handle<Derived> table, int new_capacity) { 16403 Handle<Derived> table, int new_capacity) {
16379 Handle<Derived> new_table = 16404 Handle<Derived> new_table =
16380 Allocate(table->GetIsolate(), 16405 Allocate(table->GetIsolate(),
16381 new_capacity, 16406 new_capacity,
16382 table->GetHeap()->InNewSpace(*table) ? NOT_TENURED : TENURED); 16407 table->GetHeap()->InNewSpace(*table) ? NOT_TENURED : TENURED);
16383 int nof = table->NumberOfElements(); 16408 int nof = table->NumberOfElements();
16384 int nod = table->NumberOfDeletedElements(); 16409 int nod = table->NumberOfDeletedElements();
16385 int new_buckets = new_table->NumberOfBuckets(); 16410 int new_buckets = new_table->NumberOfBuckets();
16386 int new_entry = 0; 16411 int new_entry = 0;
16387 for (int old_entry = 0; old_entry < (nof + nod); ++old_entry) { 16412 for (int old_entry = 0; old_entry < (nof + nod); ++old_entry) {
16388 Object* key = table->KeyAt(old_entry); 16413 Object* key = table->KeyAt(old_entry);
16389 if (key->IsTheHole()) continue; 16414 if (key->IsTheHole()) continue;
16390 Object* hash = key->GetHash(); 16415 Object* hash = key->GetHash();
16391 int bucket = Smi::cast(hash)->value() & (new_buckets - 1); 16416 int bucket = Smi::cast(hash)->value() & (new_buckets - 1);
16392 Object* chain_entry = new_table->get(kHashTableStartIndex + bucket); 16417 Object* chain_entry = new_table->get(kHashTableStartIndex + bucket);
16393 new_table->set(kHashTableStartIndex + bucket, Smi::FromInt(new_entry)); 16418 new_table->set(kHashTableStartIndex + bucket, Smi::FromInt(new_entry));
16394 int new_index = new_table->EntryToIndex(new_entry); 16419 int new_index = new_table->EntryToIndex(new_entry);
16395 int old_index = table->EntryToIndex(old_entry); 16420 int old_index = table->EntryToIndex(old_entry);
16396 for (int i = 0; i < entrysize; ++i) { 16421 for (int i = 0; i < entrysize; ++i) {
16397 Object* value = table->get(old_index + i); 16422 Object* value = table->get(old_index + i);
16398 new_table->set(new_index + i, value); 16423 new_table->set(new_index + i, value);
16399 } 16424 }
16400 new_table->set(new_index + kChainOffset, chain_entry); 16425 new_table->set(new_index + kChainOffset, chain_entry);
16401 ++new_entry; 16426 ++new_entry;
16402 } 16427 }
16403 new_table->SetNumberOfElements(nof); 16428 new_table->SetNumberOfElements(nof);
16429
16430 new_table->set_iterators(table->iterators());
16431 table->set_iterators(table->GetHeap()->undefined_value());
16432
16433 DisallowHeapAllocation no_allocation;
16434 for (Object* object = new_table->iterators();
16435 !object->IsUndefined();
16436 object = Iterator::cast(object)->next_iterator()) {
16437 Iterator::cast(object)->TableCompacted();
16438 Iterator::cast(object)->set_table(*new_table);
16439 }
16440
16404 return new_table; 16441 return new_table;
16405 } 16442 }
16406 16443
16407 16444
16408 template<class Derived, int entrysize> 16445 template<class Derived, class Iterator, int entrysize>
16409 int OrderedHashTable<Derived, entrysize>::FindEntry(Object* key) { 16446 int OrderedHashTable<Derived, Iterator, entrysize>::FindEntry(Object* key) {
16410 ASSERT(!key->IsTheHole()); 16447 ASSERT(!key->IsTheHole());
16411 Object* hash = key->GetHash(); 16448 Object* hash = key->GetHash();
16412 if (hash->IsUndefined()) return kNotFound; 16449 if (hash->IsUndefined()) return kNotFound;
16413 for (int entry = HashToEntry(Smi::cast(hash)->value()); 16450 for (int entry = HashToEntry(Smi::cast(hash)->value());
16414 entry != kNotFound; 16451 entry != kNotFound;
16415 entry = ChainAt(entry)) { 16452 entry = ChainAt(entry)) {
16416 Object* candidate = KeyAt(entry); 16453 Object* candidate = KeyAt(entry);
16417 if (candidate->SameValue(key)) 16454 if (candidate->SameValue(key))
16418 return entry; 16455 return entry;
16419 } 16456 }
16420 return kNotFound; 16457 return kNotFound;
16421 } 16458 }
16422 16459
16423 16460
16424 template<class Derived, int entrysize> 16461 template<class Derived, class Iterator, int entrysize>
16425 int OrderedHashTable<Derived, entrysize>::AddEntry(int hash) { 16462 int OrderedHashTable<Derived, Iterator, entrysize>::AddEntry(int hash) {
16426 int entry = NumberOfElements() + NumberOfDeletedElements(); 16463 int entry = UsedCapacity();
16427 int bucket = HashToBucket(hash); 16464 int bucket = HashToBucket(hash);
16428 int index = EntryToIndex(entry); 16465 int index = EntryToIndex(entry);
16429 Object* chain_entry = get(kHashTableStartIndex + bucket); 16466 Object* chain_entry = get(kHashTableStartIndex + bucket);
16430 set(kHashTableStartIndex + bucket, Smi::FromInt(entry)); 16467 set(kHashTableStartIndex + bucket, Smi::FromInt(entry));
16431 set(index + kChainOffset, chain_entry); 16468 set(index + kChainOffset, chain_entry);
16432 SetNumberOfElements(NumberOfElements() + 1); 16469 SetNumberOfElements(NumberOfElements() + 1);
16433 return index; 16470 return index;
16434 } 16471 }
16435 16472
16436 16473
16437 template<class Derived, int entrysize> 16474 template<class Derived, class Iterator, int entrysize>
16438 void OrderedHashTable<Derived, entrysize>::RemoveEntry(int entry) { 16475 void OrderedHashTable<Derived, Iterator, entrysize>::RemoveEntry(int entry) {
16439 int index = EntryToIndex(entry); 16476 int index = EntryToIndex(entry);
16440 for (int i = 0; i < entrysize; ++i) { 16477 for (int i = 0; i < entrysize; ++i) {
16441 set_the_hole(index + i); 16478 set_the_hole(index + i);
16442 } 16479 }
16443 SetNumberOfElements(NumberOfElements() - 1); 16480 SetNumberOfElements(NumberOfElements() - 1);
16444 SetNumberOfDeletedElements(NumberOfDeletedElements() + 1); 16481 SetNumberOfDeletedElements(NumberOfDeletedElements() + 1);
16482
16483 DisallowHeapAllocation no_allocation;
16484 for (Object* object = iterators();
16485 !object->IsUndefined();
16486 object = Iterator::cast(object)->next_iterator()) {
16487 Iterator::cast(object)->EntryRemoved(entry);
16488 }
16445 } 16489 }
16446 16490
16447 16491
16448 template class OrderedHashTable<OrderedHashSet, 1>; 16492 template class OrderedHashTable<OrderedHashSet, JSSetIterator, 1>;
16449 template class OrderedHashTable<OrderedHashMap, 2>; 16493 template class OrderedHashTable<OrderedHashMap, JSMapIterator, 2>;
adamk 2014/04/16 18:35:11 Based on the Windows build error, I think you need
arv (Not doing code reviews) 2014/04/16 18:49:54 Done.
16450 16494
16451 16495
16452 bool OrderedHashSet::Contains(Object* key) { 16496 bool OrderedHashSet::Contains(Object* key) {
16453 return FindEntry(key) != kNotFound; 16497 return FindEntry(key) != kNotFound;
16454 } 16498 }
16455 16499
16456 16500
16457 Handle<OrderedHashSet> OrderedHashSet::Add(Handle<OrderedHashSet> table, 16501 Handle<OrderedHashSet> OrderedHashSet::Add(Handle<OrderedHashSet> table,
16458 Handle<Object> key) { 16502 Handle<Object> key) {
16459 if (table->FindEntry(*key) != kNotFound) return table; 16503 if (table->FindEntry(*key) != kNotFound) return table;
16460 16504
16461 table = EnsureGrowable(table); 16505 table = EnsureGrowable(table);
16462 16506
16463 Handle<Object> hash = GetOrCreateHash(key, table->GetIsolate()); 16507 Handle<Object> hash = GetOrCreateHash(key, table->GetIsolate());
16464 int index = table->AddEntry(Smi::cast(*hash)->value()); 16508 int index = table->AddEntry(Smi::cast(*hash)->value());
16465 table->set(index, *key); 16509 table->set(index, *key);
16466 return table; 16510 return table;
16467 } 16511 }
16468 16512
16469 16513
16470 Handle<OrderedHashSet> OrderedHashSet::Remove(Handle<OrderedHashSet> table, 16514 Handle<OrderedHashSet> OrderedHashSet::Remove(Handle<OrderedHashSet> table,
16471 Handle<Object> key) { 16515 Handle<Object> key) {
16472 int entry = table->FindEntry(*key); 16516 int entry = table->FindEntry(*key);
16473 if (entry == kNotFound) return table; 16517 if (entry == kNotFound) return table;
16474 table->RemoveEntry(entry); 16518 table->RemoveEntry(entry);
16475 // TODO(adamk): Don't shrink if we're being iterated over
16476 return Shrink(table); 16519 return Shrink(table);
16477 } 16520 }
16478 16521
16479 16522
16480 Object* OrderedHashMap::Lookup(Object* key) { 16523 Object* OrderedHashMap::Lookup(Object* key) {
16481 int entry = FindEntry(key); 16524 int entry = FindEntry(key);
16482 if (entry == kNotFound) return GetHeap()->the_hole_value(); 16525 if (entry == kNotFound) return GetHeap()->the_hole_value();
16483 return ValueAt(entry); 16526 return ValueAt(entry);
16484 } 16527 }
16485 16528
16486 16529
16487 Handle<OrderedHashMap> OrderedHashMap::Put(Handle<OrderedHashMap> table, 16530 Handle<OrderedHashMap> OrderedHashMap::Put(Handle<OrderedHashMap> table,
16488 Handle<Object> key, 16531 Handle<Object> key,
16489 Handle<Object> value) { 16532 Handle<Object> value) {
16490 int entry = table->FindEntry(*key); 16533 int entry = table->FindEntry(*key);
16491 16534
16492 if (value->IsTheHole()) { 16535 if (value->IsTheHole()) {
16493 if (entry == kNotFound) return table; 16536 if (entry == kNotFound) return table;
16494 table->RemoveEntry(entry); 16537 table->RemoveEntry(entry);
16495 // TODO(adamk): Only shrink if not iterating
16496 return Shrink(table); 16538 return Shrink(table);
16497 } 16539 }
16498 16540
16499 if (entry != kNotFound) { 16541 if (entry != kNotFound) {
16500 table->set(table->EntryToIndex(entry) + kValueOffset, *value); 16542 table->set(table->EntryToIndex(entry) + kValueOffset, *value);
16501 return table; 16543 return table;
16502 } 16544 }
16503 16545
16504 table = EnsureGrowable(table); 16546 table = EnsureGrowable(table);
16505 16547
16506 Handle<Object> hash = GetOrCreateHash(key, table->GetIsolate()); 16548 Handle<Object> hash = GetOrCreateHash(key, table->GetIsolate());
16507 int index = table->AddEntry(Smi::cast(*hash)->value()); 16549 int index = table->AddEntry(Smi::cast(*hash)->value());
16508 table->set(index, *key); 16550 table->set(index, *key);
16509 table->set(index + kValueOffset, *value); 16551 table->set(index + kValueOffset, *value);
16510 return table; 16552 return table;
16511 } 16553 }
16512 16554
16513 16555
16556 template<class Derived, class TableType>
16557 void OrderedHashTableIterator<Derived, TableType>::EntryRemoved(int index) {
16558 int i = this->index()->value();
16559 if (index < i) {
16560 set_count(Smi::FromInt(count()->value() - 1));
16561 }
16562 if (index == i) {
16563 Seek();
16564 }
16565 }
16566
16567
16568 template<class Derived, class TableType>
16569 void OrderedHashTableIterator<Derived, TableType>::Close() {
16570 if (Closed()) return;
16571
16572 DisallowHeapAllocation no_allocation;
16573
16574 Object* undefined = GetHeap()->undefined_value();
16575 TableType* table = TableType::cast(this->table());
16576 Object* previous = previous_iterator();
16577 Object* next = next_iterator();
16578
16579 if (previous == undefined) {
16580 ASSERT_EQ(table->iterators(), this);
16581 table->set_iterators(next);
16582 } else {
16583 ASSERT_EQ(Derived::cast(previous)->next_iterator(), this);
16584 Derived::cast(previous)->set_next_iterator(next);
16585 }
16586
16587 if (!next->IsUndefined()) {
16588 ASSERT_EQ(Derived::cast(next)->previous_iterator(), this);
16589 Derived::cast(next)->set_previous_iterator(previous);
16590 }
16591
16592 set_previous_iterator(undefined);
16593 set_next_iterator(undefined);
16594 set_table(undefined);
16595 }
16596
16597
16598 template<class Derived, class TableType>
16599 void OrderedHashTableIterator<Derived, TableType>::Seek() {
16600 ASSERT(!Closed());
16601
16602 DisallowHeapAllocation no_allocation;
16603
16604 int index = this->index()->value();
16605
16606 TableType* table = TableType::cast(this->table());
16607 int used_capacity = table->UsedCapacity();
16608
16609 while (index < used_capacity && table->KeyAt(index)->IsTheHole()) {
16610 index++;
16611 }
16612 set_index(Smi::FromInt(index));
16613 }
16614
16615
16616 template<class Derived, class TableType>
16617 void OrderedHashTableIterator<Derived, TableType>::MoveNext() {
16618 ASSERT(!Closed());
16619
16620 set_index(Smi::FromInt(index()->value() + 1));
16621 set_count(Smi::FromInt(count()->value() + 1));
16622 Seek();
16623 }
16624
16625
16626 template<class Derived, class TableType>
16627 Handle<JSObject> OrderedHashTableIterator<Derived, TableType>::Next(
16628 Handle<Derived> iterator) {
16629 Isolate* isolate = iterator->GetIsolate();
16630 Factory* factory = isolate->factory();
16631
16632 Handle<Object> object(iterator->table(), isolate);
16633
16634 if (!object->IsUndefined()) {
16635 Handle<TableType> table = Handle<TableType>::cast(object);
16636 int index = iterator->index()->value();
16637 if (index < table->UsedCapacity()) {
16638 int entry_index = table->EntryToIndex(index);
16639 iterator->MoveNext();
16640 Handle<Object> value = Derived::ValueForKind(iterator, entry_index);
16641 return factory->NewIteratorResultObject(value, false);
16642 } else {
16643 iterator->Close();
16644 }
16645 }
16646
16647 return factory->NewIteratorResultObject(factory->undefined_value(), true);
16648 }
16649
16650
16651 template<class Derived, class TableType>
16652 Handle<Derived> OrderedHashTableIterator<Derived, TableType>::CreateInternal(
16653 Handle<Map> map,
16654 Handle<TableType> table,
16655 int kind) {
16656 Isolate* isolate = table->GetIsolate();
16657
16658 Handle<Object> undefined = isolate->factory()->undefined_value();
16659
16660 Handle<Derived> new_iterator = Handle<Derived>::cast(
16661 isolate->factory()->NewJSObjectFromMap(map));
16662 new_iterator->set_previous_iterator(*undefined);
16663 new_iterator->set_table(*table);
16664 new_iterator->set_index(Smi::FromInt(0));
16665 new_iterator->set_count(Smi::FromInt(0));
16666 new_iterator->set_kind(Smi::FromInt(kind));
16667
16668 Handle<Object> old_iterator(table->iterators(), isolate);
16669 if (!old_iterator->IsUndefined()) {
16670 Handle<Derived>::cast(old_iterator)->set_previous_iterator(*new_iterator);
16671 new_iterator->set_next_iterator(*old_iterator);
16672 } else {
16673 new_iterator->set_next_iterator(*undefined);
16674 }
16675
16676 table->set_iterators(*new_iterator);
16677
16678 return new_iterator;
16679 }
16680
16681
16682 template class OrderedHashTableIterator<JSSetIterator, OrderedHashSet>;
16683 template class OrderedHashTableIterator<JSMapIterator, OrderedHashMap>;
adamk 2014/04/16 18:35:11 Based on the windows build errors, I think you nee
arv (Not doing code reviews) 2014/04/16 18:49:54 Done.
16684
16685
16686 Handle<JSSetIterator> JSSetIterator::Create(
16687 Handle<OrderedHashSet> table, int kind) {
16688 return CreateInternal(table->GetIsolate()->set_iterator_map(), table, kind);
16689 }
16690
16691
16692 Handle<Object> JSSetIterator::ValueForKind(
16693 Handle<JSSetIterator> iterator, int entry_index) {
16694 int kind = iterator->kind()->value();
16695 // Set.prototype only has values and entries.
16696 ASSERT(kind == kKindValues || kind == kKindEntries);
16697
16698 Isolate* isolate = iterator->GetIsolate();
16699 Factory* factory = isolate->factory();
16700
16701 Handle<OrderedHashSet> table(
16702 OrderedHashSet::cast(iterator->table()), isolate);
16703 Handle<Object> value = Handle<Object>(table->get(entry_index), isolate);
16704
16705 if (kind == kKindEntries) {
16706 Handle<FixedArray> array = factory->NewFixedArray(2);
16707 array->set(0, *value);
16708 array->set(1, *value);
16709 return factory->NewJSArrayWithElements(array);
16710 }
16711
16712 return value;
16713 }
16714
16715
16716 Handle<JSMapIterator> JSMapIterator::Create(
16717 Handle<OrderedHashMap> table,
16718 int kind) {
16719 return CreateInternal(table->GetIsolate()->map_iterator_map(), table, kind);
16720 }
16721
16722
16723 Handle<Object> JSMapIterator::ValueForKind(
16724 Handle<JSMapIterator> iterator, int entry_index) {
16725 int kind = iterator->kind()->value();
16726 ASSERT(kind == kKindKeys || kind == kKindValues || kind == kKindEntries);
16727
16728 Isolate* isolate = iterator->GetIsolate();
16729 Factory* factory = isolate->factory();
16730
16731 Handle<OrderedHashMap> table(
16732 OrderedHashMap::cast(iterator->table()), isolate);
16733
16734 switch (kind) {
16735 case kKindKeys:
16736 return Handle<Object>(table->get(entry_index), isolate);
16737
16738 case kKindValues:
16739 return Handle<Object>(table->get(entry_index + 1), isolate);
16740
16741 case kKindEntries: {
16742 Handle<Object> key(table->get(entry_index), isolate);
16743 Handle<Object> value(table->get(entry_index + 1), isolate);
16744 Handle<FixedArray> array = factory->NewFixedArray(2);
16745 array->set(0, *key);
16746 array->set(1, *value);
16747 return factory->NewJSArrayWithElements(array);
16748 }
16749 }
16750
16751 UNREACHABLE();
16752 return factory->undefined_value();
16753 }
16754
16755
16514 DeclaredAccessorDescriptorIterator::DeclaredAccessorDescriptorIterator( 16756 DeclaredAccessorDescriptorIterator::DeclaredAccessorDescriptorIterator(
16515 DeclaredAccessorDescriptor* descriptor) 16757 DeclaredAccessorDescriptor* descriptor)
16516 : array_(descriptor->serialized_data()->GetDataStartAddress()), 16758 : array_(descriptor->serialized_data()->GetDataStartAddress()),
16517 length_(descriptor->serialized_data()->length()), 16759 length_(descriptor->serialized_data()->length()),
16518 offset_(0) { 16760 offset_(0) {
16519 } 16761 }
16520 16762
16521 16763
16522 const DeclaredAccessorDescriptorData* 16764 const DeclaredAccessorDescriptorData*
16523 DeclaredAccessorDescriptorIterator::Next() { 16765 DeclaredAccessorDescriptorIterator::Next() {
(...skipping 573 matching lines...) Expand 10 before | Expand all | Expand 10 after
17097 #define ERROR_MESSAGES_TEXTS(C, T) T, 17339 #define ERROR_MESSAGES_TEXTS(C, T) T,
17098 static const char* error_messages_[] = { 17340 static const char* error_messages_[] = {
17099 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) 17341 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS)
17100 }; 17342 };
17101 #undef ERROR_MESSAGES_TEXTS 17343 #undef ERROR_MESSAGES_TEXTS
17102 return error_messages_[reason]; 17344 return error_messages_[reason];
17103 } 17345 }
17104 17346
17105 17347
17106 } } // namespace v8::internal 17348 } } // namespace v8::internal
OLDNEW
« src/objects.h ('K') | « src/objects.h ('k') | src/objects-debug.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698