| 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 16223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |