| OLD | NEW | 
|---|
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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/arguments.h" | 7 #include "src/arguments.h" | 
| 8 #include "src/runtime/runtime-utils.h" | 8 #include "src/runtime/runtime-utils.h" | 
| 9 | 9 | 
| 10 namespace v8 { | 10 namespace v8 { | 
| (...skipping 421 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 432   if (!iter.IsAtEnd()) { | 432   if (!iter.IsAtEnd()) { | 
| 433     // The prototype will usually have no inherited element indices, | 433     // The prototype will usually have no inherited element indices, | 
| 434     // but we have to check. | 434     // but we have to check. | 
| 435     CollectElementIndices( | 435     CollectElementIndices( | 
| 436         Handle<JSObject>::cast(PrototypeIterator::GetCurrent(iter)), range, | 436         Handle<JSObject>::cast(PrototypeIterator::GetCurrent(iter)), range, | 
| 437         indices); | 437         indices); | 
| 438   } | 438   } | 
| 439 } | 439 } | 
| 440 | 440 | 
| 441 | 441 | 
|  | 442 static bool IterateElementsSlow(Isolate* isolate, Handle<JSObject> receiver, | 
|  | 443                                 uint32_t length, ArrayConcatVisitor* visitor) { | 
|  | 444   for (uint32_t i = 0; i < length; ++i) { | 
|  | 445     HandleScope loop_scope(isolate); | 
|  | 446     Maybe<bool> maybe = JSReceiver::HasElement(receiver, i); | 
|  | 447     if (!maybe.has_value) return false; | 
|  | 448     if (maybe.value) { | 
|  | 449       Handle<Object> element_value; | 
|  | 450       ASSIGN_RETURN_ON_EXCEPTION_VALUE( | 
|  | 451           isolate, element_value, | 
|  | 452           Runtime::GetElementOrCharAt(isolate, receiver, i), false); | 
|  | 453       visitor->visit(i, element_value); | 
|  | 454     } | 
|  | 455   } | 
|  | 456   visitor->increase_index_offset(length); | 
|  | 457   return true; | 
|  | 458 } | 
|  | 459 | 
|  | 460 | 
| 442 /** | 461 /** | 
| 443  * A helper function that visits elements of a JSObject in numerical | 462  * A helper function that visits elements of a JSObject in numerical | 
| 444  * order. | 463  * order. | 
| 445  * | 464  * | 
| 446  * The visitor argument called for each existing element in the array | 465  * The visitor argument called for each existing element in the array | 
| 447  * with the element index and the element's value. | 466  * with the element index and the element's value. | 
| 448  * Afterwards it increments the base-index of the visitor by the array | 467  * Afterwards it increments the base-index of the visitor by the array | 
| 449  * length. | 468  * length. | 
| 450  * Returns false if any access threw an exception, otherwise true. | 469  * Returns false if any access threw an exception, otherwise true. | 
| 451  */ | 470  */ | 
| (...skipping 10 matching lines...) Expand all  Loading... | 
| 462     ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, val, | 481     ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, val, | 
| 463         Runtime::GetObjectProperty(isolate, receiver, key), false); | 482         Runtime::GetObjectProperty(isolate, receiver, key), false); | 
| 464     // TODO(caitp): Support larger element indexes (up to 2^53-1). | 483     // TODO(caitp): Support larger element indexes (up to 2^53-1). | 
| 465     if (!val->ToUint32(&length)) { | 484     if (!val->ToUint32(&length)) { | 
| 466       ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, val, | 485       ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, val, | 
| 467           Execution::ToLength(isolate, val), false); | 486           Execution::ToLength(isolate, val), false); | 
| 468       val->ToUint32(&length); | 487       val->ToUint32(&length); | 
| 469     } | 488     } | 
| 470   } | 489   } | 
| 471 | 490 | 
|  | 491   if (!(receiver->IsJSArray() || receiver->IsJSTypedArray())) { | 
|  | 492     // For classes which are not known to be safe to access via elements alone, | 
|  | 493     // use the slow case. | 
|  | 494     return IterateElementsSlow(isolate, receiver, length, visitor); | 
|  | 495   } | 
|  | 496 | 
| 472   switch (receiver->GetElementsKind()) { | 497   switch (receiver->GetElementsKind()) { | 
| 473     case FAST_SMI_ELEMENTS: | 498     case FAST_SMI_ELEMENTS: | 
| 474     case FAST_ELEMENTS: | 499     case FAST_ELEMENTS: | 
| 475     case FAST_HOLEY_SMI_ELEMENTS: | 500     case FAST_HOLEY_SMI_ELEMENTS: | 
| 476     case FAST_HOLEY_ELEMENTS: { | 501     case FAST_HOLEY_ELEMENTS: { | 
| 477       // Run through the elements FixedArray and use HasElement and GetElement | 502       // Run through the elements FixedArray and use HasElement and GetElement | 
| 478       // to check the prototype for missing elements. | 503       // to check the prototype for missing elements. | 
| 479       Handle<FixedArray> elements(FixedArray::cast(receiver->elements())); | 504       Handle<FixedArray> elements(FixedArray::cast(receiver->elements())); | 
| 480       int fast_length = static_cast<int>(length); | 505       int fast_length = static_cast<int>(length); | 
| 481       DCHECK(fast_length <= elements->length()); | 506       DCHECK(fast_length <= elements->length()); | 
| (...skipping 801 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1283 } | 1308 } | 
| 1284 | 1309 | 
| 1285 | 1310 | 
| 1286 RUNTIME_FUNCTION(RuntimeReference_FastOneByteArrayJoin) { | 1311 RUNTIME_FUNCTION(RuntimeReference_FastOneByteArrayJoin) { | 
| 1287   SealHandleScope shs(isolate); | 1312   SealHandleScope shs(isolate); | 
| 1288   DCHECK(args.length() == 2); | 1313   DCHECK(args.length() == 2); | 
| 1289   return isolate->heap()->undefined_value(); | 1314   return isolate->heap()->undefined_value(); | 
| 1290 } | 1315 } | 
| 1291 } | 1316 } | 
| 1292 }  // namespace v8::internal | 1317 }  // namespace v8::internal | 
| OLD | NEW | 
|---|