Chromium Code Reviews| 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 "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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |