Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 97 // ... | 97 // ... |
| 98 // } | 98 // } |
| 99 // | 99 // |
| 100 // This is an example of the Curiously Recurring Template Pattern (see | 100 // This is an example of the Curiously Recurring Template Pattern (see |
| 101 // http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern). We use | 101 // http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern). We use |
| 102 // CRTP to guarantee aggressive compile time optimizations (i.e. inlining and | 102 // CRTP to guarantee aggressive compile time optimizations (i.e. inlining and |
| 103 // specialization of SomeElementsAccessor methods). | 103 // specialization of SomeElementsAccessor methods). |
| 104 template <typename ElementsAccessorSubclass, typename BackingStoreClass> | 104 template <typename ElementsAccessorSubclass, typename BackingStoreClass> |
| 105 class ElementsAccessorBase : public ElementsAccessor { | 105 class ElementsAccessorBase : public ElementsAccessor { |
| 106 protected: | 106 protected: |
| 107 ElementsAccessorBase() { } | 107 ElementsAccessorBase(const char* name) : ElementsAccessor(name) { } |
| 108 virtual MaybeObject* Get(FixedArrayBase* backing_store, | 108 virtual MaybeObject* Get(FixedArrayBase* backing_store, |
| 109 uint32_t key, | 109 uint32_t key, |
| 110 JSObject* obj, | 110 JSObject* obj, |
| 111 Object* receiver) { | 111 Object* receiver) { |
| 112 return ElementsAccessorSubclass::GetImpl( | 112 return ElementsAccessorSubclass::GetImpl( |
| 113 BackingStoreClass::cast(backing_store), key, obj, receiver); | 113 BackingStoreClass::cast(backing_store), key, obj, receiver); |
| 114 } | 114 } |
| 115 | 115 |
| 116 static MaybeObject* GetImpl(BackingStoreClass* backing_store, | 116 static MaybeObject* GetImpl(BackingStoreClass* backing_store, |
| 117 uint32_t key, | 117 uint32_t key, |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 273 DISALLOW_COPY_AND_ASSIGN(ElementsAccessorBase); | 273 DISALLOW_COPY_AND_ASSIGN(ElementsAccessorBase); |
| 274 }; | 274 }; |
| 275 | 275 |
| 276 | 276 |
| 277 // Super class for all fast element arrays. | 277 // Super class for all fast element arrays. |
| 278 template<typename FastElementsAccessorSubclass, | 278 template<typename FastElementsAccessorSubclass, |
| 279 typename BackingStore, | 279 typename BackingStore, |
| 280 int ElementSize> | 280 int ElementSize> |
| 281 class FastElementsAccessor | 281 class FastElementsAccessor |
| 282 : public ElementsAccessorBase<FastElementsAccessorSubclass, BackingStore> { | 282 : public ElementsAccessorBase<FastElementsAccessorSubclass, BackingStore> { |
| 283 public: | |
| 284 explicit FastElementsAccessor(const char* name) | |
| 285 : ElementsAccessorBase<FastElementsAccessorSubclass, BackingStore>(name) { } | |
| 283 protected: | 286 protected: |
| 284 friend class ElementsAccessorBase<FastElementsAccessorSubclass, BackingStore>; | 287 friend class ElementsAccessorBase<FastElementsAccessorSubclass, BackingStore>; |
| 285 | 288 |
| 286 // Adjusts the length of the fast backing store or returns the new length or | 289 // Adjusts the length of the fast backing store or returns the new length or |
| 287 // undefined in case conversion to a slow backing store should be performed. | 290 // undefined in case conversion to a slow backing store should be performed. |
| 288 static MaybeObject* SetLengthWithoutNormalize(BackingStore* backing_store, | 291 static MaybeObject* SetLengthWithoutNormalize(BackingStore* backing_store, |
| 289 JSArray* array, | 292 JSArray* array, |
| 290 Object* length_object, | 293 Object* length_object, |
| 291 uint32_t length) { | 294 uint32_t length) { |
| 292 uint32_t old_capacity = backing_store->length(); | 295 uint32_t old_capacity = backing_store->length(); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 332 return array->GetHeap()->undefined_value(); | 335 return array->GetHeap()->undefined_value(); |
| 333 } | 336 } |
| 334 }; | 337 }; |
| 335 | 338 |
| 336 | 339 |
| 337 class FastObjectElementsAccessor | 340 class FastObjectElementsAccessor |
| 338 : public FastElementsAccessor<FastObjectElementsAccessor, | 341 : public FastElementsAccessor<FastObjectElementsAccessor, |
| 339 FixedArray, | 342 FixedArray, |
| 340 kPointerSize> { | 343 kPointerSize> { |
| 341 public: | 344 public: |
| 345 FastObjectElementsAccessor(const char* name) | |
|
Jakob Kummerow
2012/03/06 10:07:42
explicit
| |
| 346 : FastElementsAccessor<FastObjectElementsAccessor, | |
| 347 FixedArray, | |
| 348 kPointerSize>(name) {} | |
| 349 | |
| 342 static MaybeObject* DeleteCommon(JSObject* obj, | 350 static MaybeObject* DeleteCommon(JSObject* obj, |
| 343 uint32_t key) { | 351 uint32_t key) { |
| 344 ASSERT(obj->HasFastElements() || | 352 ASSERT(obj->HasFastElements() || |
| 345 obj->HasFastSmiOnlyElements() || | 353 obj->HasFastSmiOnlyElements() || |
| 346 obj->HasFastArgumentsElements()); | 354 obj->HasFastArgumentsElements()); |
| 347 Heap* heap = obj->GetHeap(); | 355 Heap* heap = obj->GetHeap(); |
| 348 FixedArray* backing_store = FixedArray::cast(obj->elements()); | 356 FixedArray* backing_store = FixedArray::cast(obj->elements()); |
| 349 if (backing_store->map() == heap->non_strict_arguments_elements_map()) { | 357 if (backing_store->map() == heap->non_strict_arguments_elements_map()) { |
| 350 backing_store = FixedArray::cast(backing_store->get(1)); | 358 backing_store = FixedArray::cast(backing_store->get(1)); |
| 351 } else { | 359 } else { |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 407 JSReceiver::DeleteMode mode) { | 415 JSReceiver::DeleteMode mode) { |
| 408 return DeleteCommon(obj, key); | 416 return DeleteCommon(obj, key); |
| 409 } | 417 } |
| 410 }; | 418 }; |
| 411 | 419 |
| 412 | 420 |
| 413 class FastDoubleElementsAccessor | 421 class FastDoubleElementsAccessor |
| 414 : public FastElementsAccessor<FastDoubleElementsAccessor, | 422 : public FastElementsAccessor<FastDoubleElementsAccessor, |
| 415 FixedDoubleArray, | 423 FixedDoubleArray, |
| 416 kDoubleSize> { | 424 kDoubleSize> { |
| 425 public: | |
| 426 FastDoubleElementsAccessor(const char* name) | |
|
Jakob Kummerow
2012/03/06 10:07:42
explicit
| |
| 427 : FastElementsAccessor<FastDoubleElementsAccessor, | |
| 428 FixedDoubleArray, | |
| 429 kDoubleSize>(name) {} | |
| 430 | |
| 417 static MaybeObject* SetFastElementsCapacityAndLength(JSObject* obj, | 431 static MaybeObject* SetFastElementsCapacityAndLength(JSObject* obj, |
| 418 uint32_t capacity, | 432 uint32_t capacity, |
| 419 uint32_t length) { | 433 uint32_t length) { |
| 420 return obj->SetFastDoubleElementsCapacityAndLength(capacity, length); | 434 return obj->SetFastDoubleElementsCapacityAndLength(capacity, length); |
| 421 } | 435 } |
| 422 | 436 |
| 423 protected: | 437 protected: |
| 424 friend class ElementsAccessorBase<FastDoubleElementsAccessor, | 438 friend class ElementsAccessorBase<FastDoubleElementsAccessor, |
| 425 FixedDoubleArray>; | 439 FixedDoubleArray>; |
| 426 friend class FastElementsAccessor<FastDoubleElementsAccessor, | 440 friend class FastElementsAccessor<FastDoubleElementsAccessor, |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 447 } | 461 } |
| 448 }; | 462 }; |
| 449 | 463 |
| 450 | 464 |
| 451 // Super class for all external element arrays. | 465 // Super class for all external element arrays. |
| 452 template<typename ExternalElementsAccessorSubclass, | 466 template<typename ExternalElementsAccessorSubclass, |
| 453 typename ExternalArray> | 467 typename ExternalArray> |
| 454 class ExternalElementsAccessor | 468 class ExternalElementsAccessor |
| 455 : public ElementsAccessorBase<ExternalElementsAccessorSubclass, | 469 : public ElementsAccessorBase<ExternalElementsAccessorSubclass, |
| 456 ExternalArray> { | 470 ExternalArray> { |
| 471 public: | |
| 472 ExternalElementsAccessor(const char* name) | |
|
Jakob Kummerow
2012/03/06 10:07:42
explicit
| |
| 473 : ElementsAccessorBase<ExternalElementsAccessorSubclass, | |
| 474 ExternalArray>(name) {} | |
| 475 | |
| 457 protected: | 476 protected: |
| 458 friend class ElementsAccessorBase<ExternalElementsAccessorSubclass, | 477 friend class ElementsAccessorBase<ExternalElementsAccessorSubclass, |
| 459 ExternalArray>; | 478 ExternalArray>; |
| 460 | 479 |
| 461 static MaybeObject* GetImpl(ExternalArray* backing_store, | 480 static MaybeObject* GetImpl(ExternalArray* backing_store, |
| 462 uint32_t key, | 481 uint32_t key, |
| 463 JSObject* obj, | 482 JSObject* obj, |
| 464 Object* receiver) { | 483 Object* receiver) { |
| 465 return | 484 return |
| 466 key < ExternalElementsAccessorSubclass::GetCapacityImpl(backing_store) | 485 key < ExternalElementsAccessorSubclass::GetCapacityImpl(backing_store) |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 490 uint32_t capacity = | 509 uint32_t capacity = |
| 491 ExternalElementsAccessorSubclass::GetCapacityImpl(backing_store); | 510 ExternalElementsAccessorSubclass::GetCapacityImpl(backing_store); |
| 492 return key < capacity; | 511 return key < capacity; |
| 493 } | 512 } |
| 494 }; | 513 }; |
| 495 | 514 |
| 496 | 515 |
| 497 class ExternalByteElementsAccessor | 516 class ExternalByteElementsAccessor |
| 498 : public ExternalElementsAccessor<ExternalByteElementsAccessor, | 517 : public ExternalElementsAccessor<ExternalByteElementsAccessor, |
| 499 ExternalByteArray> { | 518 ExternalByteArray> { |
| 519 public: | |
| 520 ExternalByteElementsAccessor(const char* name) | |
|
Jakob Kummerow
2012/03/06 10:07:42
make ALL the ctors explicit! (more below)
| |
| 521 : ExternalElementsAccessor<ExternalByteElementsAccessor, | |
| 522 ExternalByteArray>(name) {} | |
| 500 }; | 523 }; |
| 501 | 524 |
| 502 | 525 |
| 503 class ExternalUnsignedByteElementsAccessor | 526 class ExternalUnsignedByteElementsAccessor |
| 504 : public ExternalElementsAccessor<ExternalUnsignedByteElementsAccessor, | 527 : public ExternalElementsAccessor<ExternalUnsignedByteElementsAccessor, |
| 505 ExternalUnsignedByteArray> { | 528 ExternalUnsignedByteArray> { |
| 529 public: | |
| 530 ExternalUnsignedByteElementsAccessor(const char* name) | |
| 531 : ExternalElementsAccessor<ExternalUnsignedByteElementsAccessor, | |
| 532 ExternalUnsignedByteArray>(name) {} | |
| 506 }; | 533 }; |
| 507 | 534 |
| 508 | 535 |
| 509 class ExternalShortElementsAccessor | 536 class ExternalShortElementsAccessor |
| 510 : public ExternalElementsAccessor<ExternalShortElementsAccessor, | 537 : public ExternalElementsAccessor<ExternalShortElementsAccessor, |
| 511 ExternalShortArray> { | 538 ExternalShortArray> { |
| 539 public: | |
| 540 ExternalShortElementsAccessor(const char* name) | |
| 541 : ExternalElementsAccessor<ExternalShortElementsAccessor, | |
| 542 ExternalShortArray>(name) {} | |
| 512 }; | 543 }; |
| 513 | 544 |
| 514 | 545 |
| 515 class ExternalUnsignedShortElementsAccessor | 546 class ExternalUnsignedShortElementsAccessor |
| 516 : public ExternalElementsAccessor<ExternalUnsignedShortElementsAccessor, | 547 : public ExternalElementsAccessor<ExternalUnsignedShortElementsAccessor, |
| 517 ExternalUnsignedShortArray> { | 548 ExternalUnsignedShortArray> { |
| 549 public: | |
| 550 ExternalUnsignedShortElementsAccessor(const char* name) | |
| 551 : ExternalElementsAccessor<ExternalUnsignedShortElementsAccessor, | |
| 552 ExternalUnsignedShortArray>(name) {} | |
| 518 }; | 553 }; |
| 519 | 554 |
| 520 | 555 |
| 521 class ExternalIntElementsAccessor | 556 class ExternalIntElementsAccessor |
| 522 : public ExternalElementsAccessor<ExternalIntElementsAccessor, | 557 : public ExternalElementsAccessor<ExternalIntElementsAccessor, |
| 523 ExternalIntArray> { | 558 ExternalIntArray> { |
| 559 public: | |
| 560 ExternalIntElementsAccessor(const char* name) | |
| 561 : ExternalElementsAccessor<ExternalIntElementsAccessor, | |
| 562 ExternalIntArray>(name) {} | |
| 524 }; | 563 }; |
| 525 | 564 |
| 526 | 565 |
| 527 class ExternalUnsignedIntElementsAccessor | 566 class ExternalUnsignedIntElementsAccessor |
| 528 : public ExternalElementsAccessor<ExternalUnsignedIntElementsAccessor, | 567 : public ExternalElementsAccessor<ExternalUnsignedIntElementsAccessor, |
| 529 ExternalUnsignedIntArray> { | 568 ExternalUnsignedIntArray> { |
| 569 public: | |
| 570 ExternalUnsignedIntElementsAccessor(const char* name) | |
| 571 : ExternalElementsAccessor<ExternalUnsignedIntElementsAccessor, | |
| 572 ExternalUnsignedIntArray>(name) {} | |
| 573 | |
| 530 }; | 574 }; |
| 531 | 575 |
| 532 | 576 |
| 533 class ExternalFloatElementsAccessor | 577 class ExternalFloatElementsAccessor |
| 534 : public ExternalElementsAccessor<ExternalFloatElementsAccessor, | 578 : public ExternalElementsAccessor<ExternalFloatElementsAccessor, |
| 535 ExternalFloatArray> { | 579 ExternalFloatArray> { |
| 580 public: | |
| 581 ExternalFloatElementsAccessor(const char* name) | |
| 582 : ExternalElementsAccessor<ExternalFloatElementsAccessor, | |
| 583 ExternalFloatArray>(name) {} | |
| 536 }; | 584 }; |
| 537 | 585 |
| 538 | 586 |
| 539 class ExternalDoubleElementsAccessor | 587 class ExternalDoubleElementsAccessor |
| 540 : public ExternalElementsAccessor<ExternalDoubleElementsAccessor, | 588 : public ExternalElementsAccessor<ExternalDoubleElementsAccessor, |
| 541 ExternalDoubleArray> { | 589 ExternalDoubleArray> { |
| 590 public: | |
| 591 ExternalDoubleElementsAccessor(const char* name) | |
| 592 : ExternalElementsAccessor<ExternalDoubleElementsAccessor, | |
| 593 ExternalDoubleArray>(name) {} | |
| 542 }; | 594 }; |
| 543 | 595 |
| 544 | 596 |
| 545 class PixelElementsAccessor | 597 class PixelElementsAccessor |
| 546 : public ExternalElementsAccessor<PixelElementsAccessor, | 598 : public ExternalElementsAccessor<PixelElementsAccessor, |
| 547 ExternalPixelArray> { | 599 ExternalPixelArray> { |
| 600 public: | |
| 601 PixelElementsAccessor(const char* name) | |
| 602 : ExternalElementsAccessor<PixelElementsAccessor, | |
| 603 ExternalPixelArray>(name) {} | |
| 548 }; | 604 }; |
| 549 | 605 |
| 550 | 606 |
| 551 class DictionaryElementsAccessor | 607 class DictionaryElementsAccessor |
| 552 : public ElementsAccessorBase<DictionaryElementsAccessor, | 608 : public ElementsAccessorBase<DictionaryElementsAccessor, |
| 553 SeededNumberDictionary> { | 609 SeededNumberDictionary> { |
| 554 public: | 610 public: |
| 611 DictionaryElementsAccessor(const char* name) | |
| 612 : ElementsAccessorBase<DictionaryElementsAccessor, | |
| 613 SeededNumberDictionary>(name) {} | |
| 614 | |
| 555 // Adjusts the length of the dictionary backing store and returns the new | 615 // Adjusts the length of the dictionary backing store and returns the new |
| 556 // length according to ES5 section 15.4.5.2 behavior. | 616 // length according to ES5 section 15.4.5.2 behavior. |
| 557 static MaybeObject* SetLengthWithoutNormalize(SeededNumberDictionary* dict, | 617 static MaybeObject* SetLengthWithoutNormalize(SeededNumberDictionary* dict, |
| 558 JSArray* array, | 618 JSArray* array, |
| 559 Object* length_object, | 619 Object* length_object, |
| 560 uint32_t length) { | 620 uint32_t length) { |
| 561 if (length == 0) { | 621 if (length == 0) { |
| 562 // If the length of a slow array is reset to zero, we clear | 622 // If the length of a slow array is reset to zero, we clear |
| 563 // the array and flush backing storage. This has the added | 623 // the array and flush backing storage. This has the added |
| 564 // benefit that the array returns to fast mode. | 624 // benefit that the array returns to fast mode. |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 696 uint32_t index) { | 756 uint32_t index) { |
| 697 Object* key = dict->KeyAt(index); | 757 Object* key = dict->KeyAt(index); |
| 698 return Smi::cast(key)->value(); | 758 return Smi::cast(key)->value(); |
| 699 } | 759 } |
| 700 }; | 760 }; |
| 701 | 761 |
| 702 | 762 |
| 703 class NonStrictArgumentsElementsAccessor | 763 class NonStrictArgumentsElementsAccessor |
| 704 : public ElementsAccessorBase<NonStrictArgumentsElementsAccessor, | 764 : public ElementsAccessorBase<NonStrictArgumentsElementsAccessor, |
| 705 FixedArray> { | 765 FixedArray> { |
| 766 public: | |
| 767 NonStrictArgumentsElementsAccessor(const char* name) | |
| 768 : ElementsAccessorBase<NonStrictArgumentsElementsAccessor, | |
| 769 FixedArray>(name) {} | |
| 706 protected: | 770 protected: |
| 707 friend class ElementsAccessorBase<NonStrictArgumentsElementsAccessor, | 771 friend class ElementsAccessorBase<NonStrictArgumentsElementsAccessor, |
| 708 FixedArray>; | 772 FixedArray>; |
| 709 | 773 |
| 710 static MaybeObject* GetImpl(FixedArray* parameter_map, | 774 static MaybeObject* GetImpl(FixedArray* parameter_map, |
| 711 uint32_t key, | 775 uint32_t key, |
| 712 JSObject* obj, | 776 JSObject* obj, |
| 713 Object* receiver) { | 777 Object* receiver) { |
| 714 Object* probe = GetParameterMapArg(obj, parameter_map, key); | 778 Object* probe = GetParameterMapArg(obj, parameter_map, key); |
| 715 if (!probe->IsTheHole()) { | 779 if (!probe->IsTheHole()) { |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 859 V(ExternalUnsignedIntElementsAccessor, EXTERNAL_UNSIGNED_INT_ELEMENTS) \ | 923 V(ExternalUnsignedIntElementsAccessor, EXTERNAL_UNSIGNED_INT_ELEMENTS) \ |
| 860 V(ExternalFloatElementsAccessor, EXTERNAL_FLOAT_ELEMENTS) \ | 924 V(ExternalFloatElementsAccessor, EXTERNAL_FLOAT_ELEMENTS) \ |
| 861 V(ExternalDoubleElementsAccessor, EXTERNAL_DOUBLE_ELEMENTS) \ | 925 V(ExternalDoubleElementsAccessor, EXTERNAL_DOUBLE_ELEMENTS) \ |
| 862 V(PixelElementsAccessor, EXTERNAL_PIXEL_ELEMENTS) | 926 V(PixelElementsAccessor, EXTERNAL_PIXEL_ELEMENTS) |
| 863 | 927 |
| 864 static struct ConcreteElementsAccessors { | 928 static struct ConcreteElementsAccessors { |
| 865 #define ACCESSOR_STRUCT(Class, Name) Class* Name##_handler; | 929 #define ACCESSOR_STRUCT(Class, Name) Class* Name##_handler; |
| 866 ELEMENTS_LIST(ACCESSOR_STRUCT) | 930 ELEMENTS_LIST(ACCESSOR_STRUCT) |
| 867 #undef ACCESSOR_STRUCT | 931 #undef ACCESSOR_STRUCT |
| 868 } element_accessors = { | 932 } element_accessors = { |
| 869 #define ACCESSOR_INIT(Class, Name) new Class(), | 933 #define ACCESSOR_INIT(Class, Name) new Class(#Name), |
| 870 ELEMENTS_LIST(ACCESSOR_INIT) | 934 ELEMENTS_LIST(ACCESSOR_INIT) |
| 871 #undef ACCESSOR_INIT | 935 #undef ACCESSOR_INIT |
| 872 }; | 936 }; |
| 873 | 937 |
| 874 static ElementsAccessor* accessor_array[] = { | 938 static ElementsAccessor* accessor_array[] = { |
| 875 #define ACCESSOR_ARRAY(Class, Name) element_accessors.Name##_handler, | 939 #define ACCESSOR_ARRAY(Class, Name) element_accessors.Name##_handler, |
| 876 ELEMENTS_LIST(ACCESSOR_ARRAY) | 940 ELEMENTS_LIST(ACCESSOR_ARRAY) |
| 877 #undef ACCESSOR_ARRAY | 941 #undef ACCESSOR_ARRAY |
| 878 }; | 942 }; |
| 879 | 943 |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 940 if (!maybe_obj->To(&new_backing_store)) return maybe_obj; | 1004 if (!maybe_obj->To(&new_backing_store)) return maybe_obj; |
| 941 new_backing_store->set(0, length); | 1005 new_backing_store->set(0, length); |
| 942 { MaybeObject* result = array->SetContent(new_backing_store); | 1006 { MaybeObject* result = array->SetContent(new_backing_store); |
| 943 if (result->IsFailure()) return result; | 1007 if (result->IsFailure()) return result; |
| 944 } | 1008 } |
| 945 return array; | 1009 return array; |
| 946 } | 1010 } |
| 947 | 1011 |
| 948 | 1012 |
| 949 } } // namespace v8::internal | 1013 } } // namespace v8::internal |
| OLD | NEW |