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

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: 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 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 // 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 16223 matching lines...) Expand 10 before | Expand all | Expand 10 after
16234 int index = table->AddEntry(hash->value()); 16234 int index = table->AddEntry(hash->value());
16235 table->set(index, *key); 16235 table->set(index, *key);
16236 table->set(index + kValueOffset, *value); 16236 table->set(index + kValueOffset, *value);
16237 return table; 16237 return table;
16238 } 16238 }
16239 16239
16240 16240
16241 template<class Derived, class TableType> 16241 template<class Derived, class TableType>
16242 Handle<JSObject> OrderedHashTableIterator<Derived, TableType>::Next( 16242 Handle<JSObject> OrderedHashTableIterator<Derived, TableType>::Next(
16243 Handle<Derived> iterator) { 16243 Handle<Derived> iterator) {
16244 Isolate* isolate = iterator->GetIsolate(); 16244 Factory* factory = iterator->GetIsolate()->factory();
16245 Factory* factory = isolate->factory();
16246 16245
16247 Handle<Object> maybe_table(iterator->table(), isolate); 16246 if (iterator->HasMore()) {
16248 if (!maybe_table->IsUndefined()) { 16247 Handle<Object> value = Derived::CurrentIteratorResultValue(iterator);
16249 iterator->Transition(); 16248 iterator->MoveNext();
16250 16249 return factory->NewIteratorResultObject(value, false);
16251 Handle<TableType> table(TableType::cast(iterator->table()), isolate);
16252 int index = Smi::cast(iterator->index())->value();
16253 int used_capacity = table->UsedCapacity();
16254
16255 while (index < used_capacity && table->KeyAt(index)->IsTheHole()) {
16256 index++;
16257 }
16258
16259 if (index < used_capacity) {
16260 int entry_index = table->EntryToIndex(index);
16261 Handle<Object> value =
16262 Derived::ValueForKind(iterator, entry_index);
16263 iterator->set_index(Smi::FromInt(index + 1));
16264 return factory->NewIteratorResultObject(value, false);
16265 }
16266
16267 iterator->set_table(iterator->GetHeap()->undefined_value());
16268 } 16250 }
16269 16251
16270 return factory->NewIteratorResultObject(factory->undefined_value(), true); 16252 return factory->NewIteratorResultObject(factory->undefined_value(), true);
16271 } 16253 }
16272 16254
16273 16255
16274 template<class Derived, class TableType> 16256 template<class Derived, class TableType>
16275 void OrderedHashTableIterator<Derived, TableType>::Transition() { 16257 void OrderedHashTableIterator<Derived, TableType>::Transition() {
16276 Isolate* isolate = GetIsolate(); 16258 DisallowHeapAllocation no_allocation;
16277 Handle<TableType> table(TableType::cast(this->table()), isolate); 16259 TableType* table = TableType::cast(this->table());
16278 if (!table->IsObsolete()) return; 16260 if (!table->IsObsolete()) return;
16279 16261
16280 int index = Smi::cast(this->index())->value(); 16262 int index = Smi::cast(this->index())->value();
16281 while (table->IsObsolete()) { 16263 while (table->IsObsolete()) {
16282 Handle<TableType> next_table(table->NextTable(), isolate); 16264 TableType* next_table = table->NextTable();
16283 16265
16284 if (index > 0) { 16266 if (index > 0) {
16285 int nod = table->NumberOfDeletedElements(); 16267 int nod = table->NumberOfDeletedElements();
16286 16268
16287 // When we clear the table we set the number of deleted elements to -1. 16269 // When we clear the table we set the number of deleted elements to -1.
16288 if (nod == -1) { 16270 if (nod == -1) {
16289 index = 0; 16271 index = 0;
16290 } else { 16272 } else {
16291 int old_index = index; 16273 int old_index = index;
16292 for (int i = 0; i < nod; ++i) { 16274 for (int i = 0; i < nod; ++i) {
16293 int removed_index = table->RemovedIndexAt(i); 16275 int removed_index = table->RemovedIndexAt(i);
16294 if (removed_index >= old_index) break; 16276 if (removed_index >= old_index) break;
16295 --index; 16277 --index;
16296 } 16278 }
16297 } 16279 }
16298 } 16280 }
16299 16281
16300 table = next_table; 16282 table = next_table;
16301 } 16283 }
16302 16284
16303 set_table(*table); 16285 set_table(table);
16304 set_index(Smi::FromInt(index)); 16286 set_index(Smi::FromInt(index));
16305 } 16287 }
16306 16288
16307 16289
16290 template<class Derived, class TableType>
16291 bool OrderedHashTableIterator<Derived, TableType>::HasMore() {
16292 DisallowHeapAllocation no_allocation;
16293 if (this->table()->IsUndefined()) return false;
16294
16295 Transition();
16296
16297 TableType* table = TableType::cast(this->table());
16298 int index = Smi::cast(this->index())->value();
16299 int used_capacity = table->UsedCapacity();
16300
16301 while (index < used_capacity && table->KeyAt(index)->IsTheHole()) {
16302 index++;
16303 }
16304
16305 set_index(Smi::FromInt(index));
16306
16307 if (index < used_capacity) return true;
16308
16309 set_table(GetHeap()->undefined_value());
16310 return false;
16311 }
16312
16313
16308 template Handle<JSObject> 16314 template Handle<JSObject>
16309 OrderedHashTableIterator<JSSetIterator, OrderedHashSet>::Next( 16315 OrderedHashTableIterator<JSSetIterator, OrderedHashSet>::Next(
16310 Handle<JSSetIterator> iterator); 16316 Handle<JSSetIterator> iterator);
16311 16317
16318 template bool
16319 OrderedHashTableIterator<JSSetIterator, OrderedHashSet>::HasMore();
16320
16321 template void
16322 OrderedHashTableIterator<JSSetIterator, OrderedHashSet>::MoveNext();
16323
16324 template Object*
16325 OrderedHashTableIterator<JSSetIterator, OrderedHashSet>::CurrentKey();
16326
16312 template void 16327 template void
16313 OrderedHashTableIterator<JSSetIterator, OrderedHashSet>::Transition(); 16328 OrderedHashTableIterator<JSSetIterator, OrderedHashSet>::Transition();
16314 16329
16315 16330
16316 template Handle<JSObject> 16331 template Handle<JSObject>
16317 OrderedHashTableIterator<JSMapIterator, OrderedHashMap>::Next( 16332 OrderedHashTableIterator<JSMapIterator, OrderedHashMap>::Next(
16318 Handle<JSMapIterator> iterator); 16333 Handle<JSMapIterator> iterator);
16319 16334
16335 template bool
16336 OrderedHashTableIterator<JSMapIterator, OrderedHashMap>::HasMore();
16337
16338 template void
16339 OrderedHashTableIterator<JSMapIterator, OrderedHashMap>::MoveNext();
16340
16341 template Object*
16342 OrderedHashTableIterator<JSMapIterator, OrderedHashMap>::CurrentKey();
16343
16320 template void 16344 template void
16321 OrderedHashTableIterator<JSMapIterator, OrderedHashMap>::Transition(); 16345 OrderedHashTableIterator<JSMapIterator, OrderedHashMap>::Transition();
16322 16346
16323 16347
16324 Handle<Object> JSSetIterator::ValueForKind( 16348 Handle<Object> JSSetIterator::CurrentIteratorResultValue(
16325 Handle<JSSetIterator> iterator, int entry_index) { 16349 Handle<JSSetIterator> iterator) {
16326 int kind = iterator->kind()->value();
16327 // Set.prototype only has values and entries.
16328 ASSERT(kind == kKindValues || kind == kKindEntries);
16329
16330 Isolate* isolate = iterator->GetIsolate(); 16350 Isolate* isolate = iterator->GetIsolate();
16331 Factory* factory = isolate->factory(); 16351 int kind = Smi::cast(iterator->kind())->value();
16332 16352 Handle<Object> value(iterator->CurrentKey(), isolate);
16333 Handle<OrderedHashSet> table(
16334 OrderedHashSet::cast(iterator->table()), isolate);
16335 Handle<Object> value = Handle<Object>(table->get(entry_index), isolate);
16336 16353
16337 if (kind == kKindEntries) { 16354 if (kind == kKindEntries) {
16355 Factory* factory = isolate->factory();
16338 Handle<FixedArray> array = factory->NewFixedArray(2); 16356 Handle<FixedArray> array = factory->NewFixedArray(2);
16339 array->set(0, *value); 16357 array->set(0, *value);
16340 array->set(1, *value); 16358 array->set(1, *value);
16341 return factory->NewJSArrayWithElements(array); 16359 return factory->NewJSArrayWithElements(array);
16342 } 16360 }
16343 16361
16362 // Set.prototype only has values and entries.
16363 ASSERT(kind == kKindValues);
16364
16344 return value; 16365 return value;
16345 } 16366 }
16346 16367
16347 16368
16348 Handle<Object> JSMapIterator::ValueForKind( 16369 Handle<Object> JSMapIterator::CurrentIteratorResultValue(
16349 Handle<JSMapIterator> iterator, int entry_index) { 16370 Handle<JSMapIterator> iterator) {
16350 int kind = iterator->kind()->value();
16351 ASSERT(kind == kKindKeys || kind == kKindValues || kind == kKindEntries);
16352
16353 Isolate* isolate = iterator->GetIsolate(); 16371 Isolate* isolate = iterator->GetIsolate();
16354 Factory* factory = isolate->factory(); 16372 Factory* factory = isolate->factory();
16355 16373
16356 Handle<OrderedHashMap> table( 16374 int kind = Smi::cast(iterator->kind())->value();
16357 OrderedHashMap::cast(iterator->table()), isolate);
16358
16359 switch (kind) { 16375 switch (kind) {
16360 case kKindKeys: 16376 case kKindKeys:
16361 return Handle<Object>(table->get(entry_index), isolate); 16377 return handle(iterator->CurrentKey(), isolate);
16362 16378
16363 case kKindValues: 16379 case kKindValues:
16364 return Handle<Object>(table->get(entry_index + 1), isolate); 16380 return handle(iterator->CurrentValue(), isolate);
16365 16381
16366 case kKindEntries: { 16382 case kKindEntries: {
16367 Handle<Object> key(table->get(entry_index), isolate);
16368 Handle<Object> value(table->get(entry_index + 1), isolate);
16369 Handle<FixedArray> array = factory->NewFixedArray(2); 16383 Handle<FixedArray> array = factory->NewFixedArray(2);
16370 array->set(0, *key); 16384 array->set(0, iterator->CurrentKey());
16371 array->set(1, *value); 16385 array->set(1, iterator->CurrentValue());
16372 return factory->NewJSArrayWithElements(array); 16386 return factory->NewJSArrayWithElements(array);
16373 } 16387 }
16374 } 16388 }
16375 16389
16376 UNREACHABLE(); 16390 UNREACHABLE();
16391
16377 return factory->undefined_value(); 16392 return factory->undefined_value();
16378 } 16393 }
16379 16394
16380 16395
16381 DeclaredAccessorDescriptorIterator::DeclaredAccessorDescriptorIterator( 16396 DeclaredAccessorDescriptorIterator::DeclaredAccessorDescriptorIterator(
16382 DeclaredAccessorDescriptor* descriptor) 16397 DeclaredAccessorDescriptor* descriptor)
16383 : array_(descriptor->serialized_data()->GetDataStartAddress()), 16398 : array_(descriptor->serialized_data()->GetDataStartAddress()),
16384 length_(descriptor->serialized_data()->length()), 16399 length_(descriptor->serialized_data()->length()),
16385 offset_(0) { 16400 offset_(0) {
16386 } 16401 }
(...skipping 576 matching lines...) Expand 10 before | Expand all | Expand 10 after
16963 #define ERROR_MESSAGES_TEXTS(C, T) T, 16978 #define ERROR_MESSAGES_TEXTS(C, T) T,
16964 static const char* error_messages_[] = { 16979 static const char* error_messages_[] = {
16965 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) 16980 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS)
16966 }; 16981 };
16967 #undef ERROR_MESSAGES_TEXTS 16982 #undef ERROR_MESSAGES_TEXTS
16968 return error_messages_[reason]; 16983 return error_messages_[reason];
16969 } 16984 }
16970 16985
16971 16986
16972 } } // namespace v8::internal 16987 } } // namespace v8::internal
OLDNEW
« 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