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

Unified Diff: src/objects.cc

Issue 329253004: Optimize Map/Set.prototype.forEach (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Update count to fix merge issue 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 side-by-side diff with in-line comments
Download patch
« src/collection.js ('K') | « src/objects.h ('k') | src/objects-inl.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/objects.cc
diff --git a/src/objects.cc b/src/objects.cc
index f852f4d7c8197df97e26d6f041056c8a5af408e5..8a98ca73bf288f029ba25b5ee732f657a11a6a3f 100644
--- a/src/objects.cc
+++ b/src/objects.cc
@@ -16241,30 +16241,12 @@ Handle<OrderedHashMap> OrderedHashMap::Put(Handle<OrderedHashMap> table,
template<class Derived, class TableType>
Handle<JSObject> OrderedHashTableIterator<Derived, TableType>::Next(
Handle<Derived> iterator) {
- Isolate* isolate = iterator->GetIsolate();
- Factory* factory = isolate->factory();
-
- Handle<Object> maybe_table(iterator->table(), isolate);
- if (!maybe_table->IsUndefined()) {
- iterator->Transition();
-
- Handle<TableType> table(TableType::cast(iterator->table()), isolate);
- int index = Smi::cast(iterator->index())->value();
- int used_capacity = table->UsedCapacity();
-
- while (index < used_capacity && table->KeyAt(index)->IsTheHole()) {
- index++;
- }
+ Factory* factory = iterator->GetIsolate()->factory();
- if (index < used_capacity) {
- int entry_index = table->EntryToIndex(index);
- Handle<Object> value =
- Derived::ValueForKind(iterator, entry_index);
- iterator->set_index(Smi::FromInt(index + 1));
- return factory->NewIteratorResultObject(value, false);
- }
-
- iterator->set_table(iterator->GetHeap()->undefined_value());
+ if (iterator->HasMore()) {
+ Handle<Object> value = Derived::CurrentIteratorResultValue(iterator);
+ iterator->MoveNext();
+ return factory->NewIteratorResultObject(value, false);
}
return factory->NewIteratorResultObject(factory->undefined_value(), true);
@@ -16273,13 +16255,13 @@ Handle<JSObject> OrderedHashTableIterator<Derived, TableType>::Next(
template<class Derived, class TableType>
void OrderedHashTableIterator<Derived, TableType>::Transition() {
- Isolate* isolate = GetIsolate();
- Handle<TableType> table(TableType::cast(this->table()), isolate);
+ DisallowHeapAllocation no_allocation;
+ TableType* table = TableType::cast(this->table());
if (!table->IsObsolete()) return;
int index = Smi::cast(this->index())->value();
while (table->IsObsolete()) {
- Handle<TableType> next_table(table->NextTable(), isolate);
+ TableType* next_table = table->NextTable();
if (index > 0) {
int nod = table->NumberOfDeletedElements();
@@ -16300,8 +16282,32 @@ void OrderedHashTableIterator<Derived, TableType>::Transition() {
table = next_table;
}
- set_table(*table);
+ set_table(table);
+ set_index(Smi::FromInt(index));
+}
+
+
+template<class Derived, class TableType>
+bool OrderedHashTableIterator<Derived, TableType>::HasMore() {
+ DisallowHeapAllocation no_allocation;
+ if (this->table()->IsUndefined()) return false;
+
+ Transition();
+
+ TableType* table = TableType::cast(this->table());
+ int index = Smi::cast(this->index())->value();
+ int used_capacity = table->UsedCapacity();
+
+ while (index < used_capacity && table->KeyAt(index)->IsTheHole()) {
+ index++;
+ }
+
set_index(Smi::FromInt(index));
+
+ if (index < used_capacity) return true;
+
+ set_table(GetHeap()->undefined_value());
+ return false;
}
@@ -16309,6 +16315,15 @@ template Handle<JSObject>
OrderedHashTableIterator<JSSetIterator, OrderedHashSet>::Next(
Handle<JSSetIterator> iterator);
+template bool
+OrderedHashTableIterator<JSSetIterator, OrderedHashSet>::HasMore();
+
+template void
+OrderedHashTableIterator<JSSetIterator, OrderedHashSet>::MoveNext();
+
+template Object*
+OrderedHashTableIterator<JSSetIterator, OrderedHashSet>::CurrentKey();
+
template void
OrderedHashTableIterator<JSSetIterator, OrderedHashSet>::Transition();
@@ -16317,63 +16332,63 @@ template Handle<JSObject>
OrderedHashTableIterator<JSMapIterator, OrderedHashMap>::Next(
Handle<JSMapIterator> iterator);
+template bool
+OrderedHashTableIterator<JSMapIterator, OrderedHashMap>::HasMore();
+
template void
-OrderedHashTableIterator<JSMapIterator, OrderedHashMap>::Transition();
+OrderedHashTableIterator<JSMapIterator, OrderedHashMap>::MoveNext();
+
+template Object*
+OrderedHashTableIterator<JSMapIterator, OrderedHashMap>::CurrentKey();
+template void
+OrderedHashTableIterator<JSMapIterator, OrderedHashMap>::Transition();
-Handle<Object> JSSetIterator::ValueForKind(
- Handle<JSSetIterator> iterator, int entry_index) {
- int kind = iterator->kind()->value();
- // Set.prototype only has values and entries.
- ASSERT(kind == kKindValues || kind == kKindEntries);
+Handle<Object> JSSetIterator::CurrentIteratorResultValue(
+ Handle<JSSetIterator> iterator) {
Isolate* isolate = iterator->GetIsolate();
- Factory* factory = isolate->factory();
-
- Handle<OrderedHashSet> table(
- OrderedHashSet::cast(iterator->table()), isolate);
- Handle<Object> value = Handle<Object>(table->get(entry_index), isolate);
+ int kind = Smi::cast(iterator->kind())->value();
+ Handle<Object> value(iterator->CurrentKey(), isolate);
if (kind == kKindEntries) {
+ Factory* factory = isolate->factory();
Handle<FixedArray> array = factory->NewFixedArray(2);
array->set(0, *value);
array->set(1, *value);
return factory->NewJSArrayWithElements(array);
}
+ // Set.prototype only has values and entries.
+ ASSERT(kind == kKindValues);
+
return value;
}
-Handle<Object> JSMapIterator::ValueForKind(
- Handle<JSMapIterator> iterator, int entry_index) {
- int kind = iterator->kind()->value();
- ASSERT(kind == kKindKeys || kind == kKindValues || kind == kKindEntries);
-
+Handle<Object> JSMapIterator::CurrentIteratorResultValue(
+ Handle<JSMapIterator> iterator) {
Isolate* isolate = iterator->GetIsolate();
Factory* factory = isolate->factory();
- Handle<OrderedHashMap> table(
- OrderedHashMap::cast(iterator->table()), isolate);
-
+ int kind = Smi::cast(iterator->kind())->value();
switch (kind) {
case kKindKeys:
- return Handle<Object>(table->get(entry_index), isolate);
+ return handle(iterator->CurrentKey(), isolate);
case kKindValues:
- return Handle<Object>(table->get(entry_index + 1), isolate);
+ return handle(iterator->CurrentValue(), isolate);
case kKindEntries: {
- Handle<Object> key(table->get(entry_index), isolate);
- Handle<Object> value(table->get(entry_index + 1), isolate);
Handle<FixedArray> array = factory->NewFixedArray(2);
- array->set(0, *key);
- array->set(1, *value);
+ array->set(0, iterator->CurrentKey());
+ array->set(1, iterator->CurrentValue());
return factory->NewJSArrayWithElements(array);
}
}
UNREACHABLE();
+
return factory->undefined_value();
}
« src/collection.js ('K') | « src/objects.h ('k') | src/objects-inl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698