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

Side by Side Diff: src/objects.cc

Issue 329253004: Optimize Map/Set.prototype.forEach (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Unhandlify Created 6 years, 6 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
« no previous file with comments | « src/objects.h ('k') | src/objects-inl.h » ('j') | src/runtime.cc » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "src/v8.h" 5 #include "src/v8.h"
6 6
7 #include "src/accessors.h" 7 #include "src/accessors.h"
8 #include "src/allocation-site-scopes.h" 8 #include "src/allocation-site-scopes.h"
9 #include "src/api.h" 9 #include "src/api.h"
10 #include "src/arguments.h" 10 #include "src/arguments.h"
(...skipping 16368 matching lines...) Expand 10 before | Expand all | Expand 10 after
16379 int index = table->AddEntry(hash->value()); 16379 int index = table->AddEntry(hash->value());
16380 table->set(index, *key); 16380 table->set(index, *key);
16381 table->set(index + kValueOffset, *value); 16381 table->set(index + kValueOffset, *value);
16382 return table; 16382 return table;
16383 } 16383 }
16384 16384
16385 16385
16386 template<class Derived, class TableType> 16386 template<class Derived, class TableType>
16387 Handle<JSObject> OrderedHashTableIterator<Derived, TableType>::Next( 16387 Handle<JSObject> OrderedHashTableIterator<Derived, TableType>::Next(
16388 Handle<Derived> iterator) { 16388 Handle<Derived> iterator) {
16389 Isolate* isolate = iterator->GetIsolate(); 16389 Factory* factory = iterator->GetIsolate()->factory();
16390 Factory* factory = isolate->factory();
16391 16390
16392 Handle<Object> maybe_table(iterator->table(), isolate); 16391 if (HasMore(iterator)) {
16393 if (!maybe_table->IsUndefined()) { 16392 Handle<Object> value = Derived::CurrentIteratorResultValue(iterator);
16394 iterator->Transition(); 16393 iterator->MoveNext();
16395 16394 return factory->NewIteratorResultObject(value, false);
16396 Handle<TableType> table(TableType::cast(iterator->table()), isolate);
16397 int index = Smi::cast(iterator->index())->value();
16398 int used_capacity = table->UsedCapacity();
16399
16400 while (index < used_capacity && table->KeyAt(index)->IsTheHole()) {
16401 index++;
16402 }
16403
16404 if (index < used_capacity) {
16405 int entry_index = table->EntryToIndex(index);
16406 Handle<Object> value =
16407 Derived::ValueForKind(iterator, entry_index);
16408 iterator->set_index(Smi::FromInt(index + 1));
16409 return factory->NewIteratorResultObject(value, false);
16410 }
16411
16412 iterator->set_table(iterator->GetHeap()->undefined_value());
16413 } 16395 }
16414 16396
16415 return factory->NewIteratorResultObject(factory->undefined_value(), true); 16397 return factory->NewIteratorResultObject(factory->undefined_value(), true);
16416 } 16398 }
16417 16399
16418 16400
16419 template<class Derived, class TableType> 16401 template<class Derived, class TableType>
16420 void OrderedHashTableIterator<Derived, TableType>::Transition() { 16402 void OrderedHashTableIterator<Derived, TableType>::Transition() {
16421 Isolate* isolate = GetIsolate(); 16403 Isolate* isolate = GetIsolate();
16422 Handle<TableType> table(TableType::cast(this->table()), isolate); 16404 Handle<TableType> table(TableType::cast(this->table()), isolate);
(...skipping 20 matching lines...) Expand all
16443 } 16425 }
16444 16426
16445 table = next_table; 16427 table = next_table;
16446 } 16428 }
16447 16429
16448 set_table(*table); 16430 set_table(*table);
16449 set_index(Smi::FromInt(index)); 16431 set_index(Smi::FromInt(index));
16450 } 16432 }
16451 16433
16452 16434
16435 template<class Derived, class TableType>
16436 bool OrderedHashTableIterator<Derived, TableType>::HasMore(
adamk 2014/06/16 22:13:57 On second reading, does HasMore() ever do allocati
arv (Not doing code reviews) 2014/06/16 23:53:09 The only one that does allocation is Next (to crea
16437 Handle<Derived> iterator) {
16438 Isolate* isolate = iterator->GetIsolate();
16439
16440 if (iterator->table()->IsUndefined()) {
16441 return false;
16442 }
16443
16444 iterator->Transition();
adamk 2014/06/16 22:13:57 This is the only bit that suggests that HasMore us
arv (Not doing code reviews) 2014/06/16 23:53:09 I think I misunderstood this. Only allocations can
16445
16446 Handle<TableType> table(TableType::cast(iterator->table()), isolate);
16447 int index = Smi::cast(iterator->index())->value();
16448 int used_capacity = table->UsedCapacity();
16449
16450 while (index < used_capacity && table->KeyAt(index)->IsTheHole()) {
16451 index++;
16452 }
16453
16454 iterator->set_index(Smi::FromInt(index));
16455
16456 if (index < used_capacity) {
16457 return true;
16458 }
16459
16460 iterator->set_table(iterator->GetHeap()->undefined_value());
16461 return false;
16462 }
16463
16464
16453 template Handle<JSObject> 16465 template Handle<JSObject>
16454 OrderedHashTableIterator<JSSetIterator, OrderedHashSet>::Next( 16466 OrderedHashTableIterator<JSSetIterator, OrderedHashSet>::Next(
16455 Handle<JSSetIterator> iterator); 16467 Handle<JSSetIterator> iterator);
16456 16468
16469 template bool
16470 OrderedHashTableIterator<JSSetIterator, OrderedHashSet>::HasMore(
16471 Handle<JSSetIterator> iterator);
16472
16473 template void
16474 OrderedHashTableIterator<JSSetIterator, OrderedHashSet>::MoveNext();
16475
16476 template Object*
16477 OrderedHashTableIterator<JSSetIterator, OrderedHashSet>::CurrentKey();
16478
16457 template void 16479 template void
16458 OrderedHashTableIterator<JSSetIterator, OrderedHashSet>::Transition(); 16480 OrderedHashTableIterator<JSSetIterator, OrderedHashSet>::Transition();
16459 16481
16460 16482
16461 template Handle<JSObject> 16483 template Handle<JSObject>
16462 OrderedHashTableIterator<JSMapIterator, OrderedHashMap>::Next( 16484 OrderedHashTableIterator<JSMapIterator, OrderedHashMap>::Next(
16463 Handle<JSMapIterator> iterator); 16485 Handle<JSMapIterator> iterator);
16464 16486
16487 template bool
16488 OrderedHashTableIterator<JSMapIterator, OrderedHashMap>::HasMore(
16489 Handle<JSMapIterator> iterator);
16490
16491 template void
16492 OrderedHashTableIterator<JSMapIterator, OrderedHashMap>::MoveNext();
16493
16494 template Object*
16495 OrderedHashTableIterator<JSMapIterator, OrderedHashMap>::CurrentKey();
16496
16465 template void 16497 template void
16466 OrderedHashTableIterator<JSMapIterator, OrderedHashMap>::Transition(); 16498 OrderedHashTableIterator<JSMapIterator, OrderedHashMap>::Transition();
16467 16499
16468 16500
16469 Handle<Object> JSSetIterator::ValueForKind( 16501 Handle<Object> JSSetIterator::CurrentIteratorResultValue(
16470 Handle<JSSetIterator> iterator, int entry_index) { 16502 Handle<JSSetIterator> iterator) {
16471 int kind = iterator->kind()->value();
16472 // Set.prototype only has values and entries.
16473 ASSERT(kind == kKindValues || kind == kKindEntries);
16474
16475 Isolate* isolate = iterator->GetIsolate(); 16503 Isolate* isolate = iterator->GetIsolate();
16476 Factory* factory = isolate->factory(); 16504 int kind = Smi::cast(iterator->kind())->value();
16477 16505 Handle<Object> value(iterator->CurrentKey(), isolate);
16478 Handle<OrderedHashSet> table(
16479 OrderedHashSet::cast(iterator->table()), isolate);
16480 Handle<Object> value = Handle<Object>(table->get(entry_index), isolate);
16481 16506
16482 if (kind == kKindEntries) { 16507 if (kind == kKindEntries) {
16508 Factory* factory = isolate->factory();
16483 Handle<FixedArray> array = factory->NewFixedArray(2); 16509 Handle<FixedArray> array = factory->NewFixedArray(2);
16484 array->set(0, *value); 16510 array->set(0, *value);
16485 array->set(1, *value); 16511 array->set(1, *value);
16486 return factory->NewJSArrayWithElements(array); 16512 return factory->NewJSArrayWithElements(array);
16487 } 16513 }
16488 16514
16515 // Set.prototype only has values and entries.
16516 ASSERT(kind == kKindValues);
16517
16489 return value; 16518 return value;
16490 } 16519 }
16491 16520
16492 16521
16493 Handle<Object> JSMapIterator::ValueForKind( 16522 Handle<Object> JSMapIterator::CurrentIteratorResultValue(
16494 Handle<JSMapIterator> iterator, int entry_index) { 16523 Handle<JSMapIterator> iterator) {
16495 int kind = iterator->kind()->value();
16496 ASSERT(kind == kKindKeys || kind == kKindValues || kind == kKindEntries);
16497
16498 Isolate* isolate = iterator->GetIsolate(); 16524 Isolate* isolate = iterator->GetIsolate();
16499 Factory* factory = isolate->factory(); 16525 Factory* factory = isolate->factory();
16500 16526
16501 Handle<OrderedHashMap> table( 16527 int kind = Smi::cast(iterator->kind())->value();
16502 OrderedHashMap::cast(iterator->table()), isolate);
16503
16504 switch (kind) { 16528 switch (kind) {
16505 case kKindKeys: 16529 case kKindKeys:
16506 return Handle<Object>(table->get(entry_index), isolate); 16530 return handle(iterator->CurrentKey(), isolate);
16507 16531
16508 case kKindValues: 16532 case kKindValues:
16509 return Handle<Object>(table->get(entry_index + 1), isolate); 16533 return handle(iterator->CurrentValue(), isolate);
16510 16534
16511 case kKindEntries: { 16535 case kKindEntries: {
16512 Handle<Object> key(table->get(entry_index), isolate);
16513 Handle<Object> value(table->get(entry_index + 1), isolate);
16514 Handle<FixedArray> array = factory->NewFixedArray(2); 16536 Handle<FixedArray> array = factory->NewFixedArray(2);
16515 array->set(0, *key); 16537 array->set(0, iterator->CurrentKey());
16516 array->set(1, *value); 16538 array->set(1, iterator->CurrentValue());
16517 return factory->NewJSArrayWithElements(array); 16539 return factory->NewJSArrayWithElements(array);
16518 } 16540 }
16519 } 16541 }
16520 16542
16521 UNREACHABLE(); 16543 UNREACHABLE();
16544
16522 return factory->undefined_value(); 16545 return factory->undefined_value();
16523 } 16546 }
16524 16547
16525 16548
16526 DeclaredAccessorDescriptorIterator::DeclaredAccessorDescriptorIterator( 16549 DeclaredAccessorDescriptorIterator::DeclaredAccessorDescriptorIterator(
16527 DeclaredAccessorDescriptor* descriptor) 16550 DeclaredAccessorDescriptor* descriptor)
16528 : array_(descriptor->serialized_data()->GetDataStartAddress()), 16551 : array_(descriptor->serialized_data()->GetDataStartAddress()),
16529 length_(descriptor->serialized_data()->length()), 16552 length_(descriptor->serialized_data()->length()),
16530 offset_(0) { 16553 offset_(0) {
16531 } 16554 }
(...skipping 576 matching lines...) Expand 10 before | Expand all | Expand 10 after
17108 #define ERROR_MESSAGES_TEXTS(C, T) T, 17131 #define ERROR_MESSAGES_TEXTS(C, T) T,
17109 static const char* error_messages_[] = { 17132 static const char* error_messages_[] = {
17110 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) 17133 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS)
17111 }; 17134 };
17112 #undef ERROR_MESSAGES_TEXTS 17135 #undef ERROR_MESSAGES_TEXTS
17113 return error_messages_[reason]; 17136 return error_messages_[reason];
17114 } 17137 }
17115 17138
17116 17139
17117 } } // namespace v8::internal 17140 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/objects.h ('k') | src/objects-inl.h » ('j') | src/runtime.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698