OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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/conversions.h" | 8 #include "src/conversions.h" |
9 #include "src/elements.h" | 9 #include "src/elements.h" |
10 #include "src/messages.h" | 10 #include "src/messages.h" |
(...skipping 598 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
609 | 609 |
610 return ElementsAccessorSubclass::GetImpl( | 610 return ElementsAccessorSubclass::GetImpl( |
611 receiver, holder, key, backing_store); | 611 receiver, holder, key, backing_store); |
612 } | 612 } |
613 | 613 |
614 MUST_USE_RESULT static MaybeHandle<Object> GetImpl( | 614 MUST_USE_RESULT static MaybeHandle<Object> GetImpl( |
615 Handle<Object> receiver, | 615 Handle<Object> receiver, |
616 Handle<JSObject> obj, | 616 Handle<JSObject> obj, |
617 uint32_t key, | 617 uint32_t key, |
618 Handle<FixedArrayBase> backing_store) { | 618 Handle<FixedArrayBase> backing_store) { |
619 if (key < ElementsAccessorSubclass::GetCapacityImpl(obj, backing_store)) { | 619 if (key < ElementsAccessorSubclass::GetCapacityImpl(*obj, *backing_store)) { |
620 return BackingStore::get(Handle<BackingStore>::cast(backing_store), key); | 620 return BackingStore::get(Handle<BackingStore>::cast(backing_store), key); |
621 } else { | 621 } else { |
622 return backing_store->GetIsolate()->factory()->the_hole_value(); | 622 return backing_store->GetIsolate()->factory()->the_hole_value(); |
623 } | 623 } |
624 } | 624 } |
625 | 625 |
626 MUST_USE_RESULT virtual PropertyAttributes GetAttributes( | 626 MUST_USE_RESULT virtual PropertyAttributes GetAttributes( |
627 Handle<JSObject> holder, uint32_t key, | 627 Handle<JSObject> holder, uint32_t key, |
628 Handle<FixedArrayBase> backing_store) final { | 628 Handle<FixedArrayBase> backing_store) final { |
629 return ElementsAccessorSubclass::GetAttributesImpl(holder, key, | 629 return ElementsAccessorSubclass::GetAttributesImpl(holder, key, |
630 backing_store); | 630 backing_store); |
631 } | 631 } |
632 | 632 |
633 MUST_USE_RESULT static PropertyAttributes GetAttributesImpl( | 633 MUST_USE_RESULT static PropertyAttributes GetAttributesImpl( |
634 Handle<JSObject> obj, | 634 Handle<JSObject> obj, |
635 uint32_t key, | 635 uint32_t key, |
636 Handle<FixedArrayBase> backing_store) { | 636 Handle<FixedArrayBase> backing_store) { |
637 if (key >= ElementsAccessorSubclass::GetCapacityImpl(obj, backing_store)) { | 637 if (key >= |
| 638 ElementsAccessorSubclass::GetCapacityImpl(*obj, *backing_store)) { |
638 return ABSENT; | 639 return ABSENT; |
639 } | 640 } |
640 return | 641 return |
641 Handle<BackingStore>::cast(backing_store)->is_the_hole(key) | 642 Handle<BackingStore>::cast(backing_store)->is_the_hole(key) |
642 ? ABSENT : NONE; | 643 ? ABSENT : NONE; |
643 } | 644 } |
644 | 645 |
645 MUST_USE_RESULT virtual MaybeHandle<AccessorPair> GetAccessorPair( | 646 MUST_USE_RESULT virtual MaybeHandle<AccessorPair> GetAccessorPair( |
646 Handle<JSObject> holder, uint32_t key, | 647 Handle<JSObject> holder, uint32_t key, |
647 Handle<FixedArrayBase> backing_store) final { | 648 Handle<FixedArrayBase> backing_store) final { |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
742 #ifdef ENABLE_SLOW_DCHECKS | 743 #ifdef ENABLE_SLOW_DCHECKS |
743 if (FLAG_enable_slow_asserts) { | 744 if (FLAG_enable_slow_asserts) { |
744 for (int i = 0; i < len0; i++) { | 745 for (int i = 0; i < len0; i++) { |
745 DCHECK(!to->get(i)->IsTheHole()); | 746 DCHECK(!to->get(i)->IsTheHole()); |
746 } | 747 } |
747 } | 748 } |
748 #endif | 749 #endif |
749 | 750 |
750 // Optimize if 'other' is empty. | 751 // Optimize if 'other' is empty. |
751 // We cannot optimize if 'this' is empty, as other may have holes. | 752 // We cannot optimize if 'this' is empty, as other may have holes. |
752 uint32_t len1 = ElementsAccessorSubclass::GetCapacityImpl(receiver, from); | 753 uint32_t len1 = ElementsAccessorSubclass::GetCapacityImpl(*receiver, *from); |
753 if (len1 == 0) return to; | 754 if (len1 == 0) return to; |
754 | 755 |
755 Isolate* isolate = from->GetIsolate(); | 756 Isolate* isolate = from->GetIsolate(); |
756 | 757 |
757 // Compute how many elements are not in other. | 758 // Compute how many elements are not in other. |
758 uint32_t extra = 0; | 759 uint32_t extra = 0; |
759 for (uint32_t y = 0; y < len1; y++) { | 760 for (uint32_t y = 0; y < len1; y++) { |
760 uint32_t key = ElementsAccessorSubclass::GetKeyForIndexImpl(from, y); | 761 uint32_t key = ElementsAccessorSubclass::GetKeyForIndexImpl(*from, y); |
761 if (ElementsAccessorSubclass::HasElementImpl(receiver, key, from)) { | 762 if (ElementsAccessorSubclass::HasElementImpl(receiver, key, from)) { |
762 Handle<Object> value; | 763 Handle<Object> value; |
763 ASSIGN_RETURN_ON_EXCEPTION( | 764 ASSIGN_RETURN_ON_EXCEPTION( |
764 isolate, value, | 765 isolate, value, |
765 ElementsAccessorSubclass::GetImpl(receiver, receiver, key, from), | 766 ElementsAccessorSubclass::GetImpl(receiver, receiver, key, from), |
766 FixedArray); | 767 FixedArray); |
767 | 768 |
768 DCHECK(!value->IsTheHole()); | 769 DCHECK(!value->IsTheHole()); |
769 if (filter == FixedArray::NON_SYMBOL_KEYS && value->IsSymbol()) { | 770 if (filter == FixedArray::NON_SYMBOL_KEYS && value->IsSymbol()) { |
770 continue; | 771 continue; |
(...skipping 15 matching lines...) Expand all Loading... |
786 WriteBarrierMode mode = result->GetWriteBarrierMode(no_gc); | 787 WriteBarrierMode mode = result->GetWriteBarrierMode(no_gc); |
787 for (int i = 0; i < len0; i++) { | 788 for (int i = 0; i < len0; i++) { |
788 Object* e = to->get(i); | 789 Object* e = to->get(i); |
789 DCHECK(e->IsString() || e->IsNumber()); | 790 DCHECK(e->IsString() || e->IsNumber()); |
790 result->set(i, e, mode); | 791 result->set(i, e, mode); |
791 } | 792 } |
792 } | 793 } |
793 // Fill in the extra values. | 794 // Fill in the extra values. |
794 uint32_t index = 0; | 795 uint32_t index = 0; |
795 for (uint32_t y = 0; y < len1; y++) { | 796 for (uint32_t y = 0; y < len1; y++) { |
796 uint32_t key = | 797 uint32_t key = ElementsAccessorSubclass::GetKeyForIndexImpl(*from, y); |
797 ElementsAccessorSubclass::GetKeyForIndexImpl(from, y); | |
798 if (ElementsAccessorSubclass::HasElementImpl(receiver, key, from)) { | 798 if (ElementsAccessorSubclass::HasElementImpl(receiver, key, from)) { |
799 Handle<Object> value; | 799 Handle<Object> value; |
800 ASSIGN_RETURN_ON_EXCEPTION( | 800 ASSIGN_RETURN_ON_EXCEPTION( |
801 isolate, value, | 801 isolate, value, |
802 ElementsAccessorSubclass::GetImpl(receiver, receiver, key, from), | 802 ElementsAccessorSubclass::GetImpl(receiver, receiver, key, from), |
803 FixedArray); | 803 FixedArray); |
804 if (filter == FixedArray::NON_SYMBOL_KEYS && value->IsSymbol()) { | 804 if (filter == FixedArray::NON_SYMBOL_KEYS && value->IsSymbol()) { |
805 continue; | 805 continue; |
806 } | 806 } |
807 if (!value->IsTheHole() && !HasKey(to, value)) { | 807 if (!value->IsTheHole() && !HasKey(to, value)) { |
808 result->set(len0 + index, *value); | 808 result->set(len0 + index, *value); |
809 index++; | 809 index++; |
810 } | 810 } |
811 } | 811 } |
812 } | 812 } |
813 DCHECK(extra == index); | 813 DCHECK(extra == index); |
814 return result; | 814 return result; |
815 } | 815 } |
816 | 816 |
817 protected: | 817 protected: |
818 static uint32_t GetCapacityImpl(Handle<JSObject> holder, | 818 static uint32_t GetCapacityImpl(JSObject* holder, |
819 Handle<FixedArrayBase> backing_store) { | 819 FixedArrayBase* backing_store) { |
820 return backing_store->length(); | 820 return backing_store->length(); |
821 } | 821 } |
822 | 822 |
823 uint32_t GetCapacity(Handle<JSObject> holder, | 823 uint32_t GetCapacity(JSObject* holder, FixedArrayBase* backing_store) final { |
824 Handle<FixedArrayBase> backing_store) final { | |
825 return ElementsAccessorSubclass::GetCapacityImpl(holder, backing_store); | 824 return ElementsAccessorSubclass::GetCapacityImpl(holder, backing_store); |
826 } | 825 } |
827 | 826 |
828 static uint32_t GetKeyForIndexImpl(Handle<FixedArrayBase> backing_store, | 827 static uint32_t GetKeyForIndexImpl(FixedArrayBase* backing_store, |
829 uint32_t index) { | 828 uint32_t index) { |
830 return index; | 829 return index; |
831 } | 830 } |
832 | 831 |
833 virtual uint32_t GetKeyForIndex(Handle<FixedArrayBase> backing_store, | 832 virtual uint32_t GetKeyForIndex(FixedArrayBase* backing_store, |
834 uint32_t index) final { | 833 uint32_t index) final { |
835 return ElementsAccessorSubclass::GetKeyForIndexImpl(backing_store, index); | 834 return ElementsAccessorSubclass::GetKeyForIndexImpl(backing_store, index); |
836 } | 835 } |
837 | 836 |
| 837 static uint32_t GetIndexForKeyImpl(FixedArrayBase* backing_store, |
| 838 uint32_t key) { |
| 839 return key; |
| 840 } |
| 841 |
| 842 virtual uint32_t GetIndexForKey(FixedArrayBase* backing_store, |
| 843 uint32_t key) final { |
| 844 return ElementsAccessorSubclass::GetIndexForKeyImpl(backing_store, key); |
| 845 } |
| 846 |
| 847 static PropertyDetails GetDetailsImpl(FixedArrayBase* backing_store, |
| 848 uint32_t index) { |
| 849 return PropertyDetails(NONE, DATA, 0, PropertyCellType::kNoCell); |
| 850 } |
| 851 |
| 852 virtual PropertyDetails GetDetails(FixedArrayBase* backing_store, |
| 853 uint32_t index) final { |
| 854 return ElementsAccessorSubclass::GetDetailsImpl(backing_store, index); |
| 855 } |
| 856 |
838 private: | 857 private: |
839 DISALLOW_COPY_AND_ASSIGN(ElementsAccessorBase); | 858 DISALLOW_COPY_AND_ASSIGN(ElementsAccessorBase); |
840 }; | 859 }; |
841 | 860 |
842 | 861 |
843 // Super class for all fast element arrays. | 862 // Super class for all fast element arrays. |
844 template<typename FastElementsAccessorSubclass, | 863 template<typename FastElementsAccessorSubclass, |
845 typename KindTraits> | 864 typename KindTraits> |
846 class FastElementsAccessor | 865 class FastElementsAccessor |
847 : public ElementsAccessorBase<FastElementsAccessorSubclass, KindTraits> { | 866 : public ElementsAccessorBase<FastElementsAccessorSubclass, KindTraits> { |
(...skipping 405 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1253 typedef TypedElementsAccessor<Kind> AccessorClass; | 1272 typedef TypedElementsAccessor<Kind> AccessorClass; |
1254 | 1273 |
1255 friend class ElementsAccessorBase<AccessorClass, | 1274 friend class ElementsAccessorBase<AccessorClass, |
1256 ElementsKindTraits<Kind> >; | 1275 ElementsKindTraits<Kind> >; |
1257 | 1276 |
1258 MUST_USE_RESULT static MaybeHandle<Object> GetImpl( | 1277 MUST_USE_RESULT static MaybeHandle<Object> GetImpl( |
1259 Handle<Object> receiver, | 1278 Handle<Object> receiver, |
1260 Handle<JSObject> obj, | 1279 Handle<JSObject> obj, |
1261 uint32_t key, | 1280 uint32_t key, |
1262 Handle<FixedArrayBase> backing_store) { | 1281 Handle<FixedArrayBase> backing_store) { |
1263 if (key < AccessorClass::GetCapacityImpl(obj, backing_store)) { | 1282 if (key < AccessorClass::GetCapacityImpl(*obj, *backing_store)) { |
1264 return BackingStore::get(Handle<BackingStore>::cast(backing_store), key); | 1283 return BackingStore::get(Handle<BackingStore>::cast(backing_store), key); |
1265 } else { | 1284 } else { |
1266 return backing_store->GetIsolate()->factory()->undefined_value(); | 1285 return backing_store->GetIsolate()->factory()->undefined_value(); |
1267 } | 1286 } |
1268 } | 1287 } |
1269 | 1288 |
1270 MUST_USE_RESULT static PropertyAttributes GetAttributesImpl( | 1289 MUST_USE_RESULT static PropertyAttributes GetAttributesImpl( |
1271 Handle<JSObject> obj, | 1290 Handle<JSObject> obj, |
1272 uint32_t key, | 1291 uint32_t key, |
1273 Handle<FixedArrayBase> backing_store) { | 1292 Handle<FixedArrayBase> backing_store) { |
1274 return key < AccessorClass::GetCapacityImpl(obj, backing_store) ? NONE | 1293 return key < AccessorClass::GetCapacityImpl(*obj, *backing_store) ? NONE |
1275 : ABSENT; | 1294 : ABSENT; |
1276 } | 1295 } |
1277 | 1296 |
1278 MUST_USE_RESULT static MaybeHandle<Object> SetLengthImpl( | 1297 MUST_USE_RESULT static MaybeHandle<Object> SetLengthImpl( |
1279 Handle<JSObject> obj, | 1298 Handle<JSObject> obj, |
1280 Handle<Object> length, | 1299 Handle<Object> length, |
1281 Handle<FixedArrayBase> backing_store) { | 1300 Handle<FixedArrayBase> backing_store) { |
1282 // External arrays do not support changing their length. | 1301 // External arrays do not support changing their length. |
1283 UNREACHABLE(); | 1302 UNREACHABLE(); |
1284 return obj; | 1303 return obj; |
1285 } | 1304 } |
1286 | 1305 |
1287 MUST_USE_RESULT virtual MaybeHandle<Object> Delete( | 1306 MUST_USE_RESULT virtual MaybeHandle<Object> Delete( |
1288 Handle<JSObject> obj, uint32_t key, LanguageMode language_mode) final { | 1307 Handle<JSObject> obj, uint32_t key, LanguageMode language_mode) final { |
1289 // External arrays always ignore deletes. | 1308 // External arrays always ignore deletes. |
1290 return obj->GetIsolate()->factory()->true_value(); | 1309 return obj->GetIsolate()->factory()->true_value(); |
1291 } | 1310 } |
1292 | 1311 |
1293 static bool HasElementImpl(Handle<JSObject> holder, uint32_t key, | 1312 static bool HasElementImpl(Handle<JSObject> holder, uint32_t key, |
1294 Handle<FixedArrayBase> backing_store) { | 1313 Handle<FixedArrayBase> backing_store) { |
1295 uint32_t capacity = AccessorClass::GetCapacityImpl(holder, backing_store); | 1314 uint32_t capacity = AccessorClass::GetCapacityImpl(*holder, *backing_store); |
1296 return key < capacity; | 1315 return key < capacity; |
1297 } | 1316 } |
1298 | 1317 |
1299 static uint32_t GetCapacityImpl(Handle<JSObject> holder, | 1318 static uint32_t GetCapacityImpl(JSObject* holder, |
1300 Handle<FixedArrayBase> backing_store) { | 1319 FixedArrayBase* backing_store) { |
1301 Handle<JSArrayBufferView> view = Handle<JSArrayBufferView>::cast(holder); | 1320 JSArrayBufferView* view = JSArrayBufferView::cast(holder); |
1302 if (view->WasNeutered()) return 0; | 1321 if (view->WasNeutered()) return 0; |
1303 return backing_store->length(); | 1322 return backing_store->length(); |
1304 } | 1323 } |
1305 }; | 1324 }; |
1306 | 1325 |
1307 | 1326 |
1308 | 1327 |
1309 #define EXTERNAL_ELEMENTS_ACCESSOR(Type, type, TYPE, ctype, size) \ | 1328 #define EXTERNAL_ELEMENTS_ACCESSOR(Type, type, TYPE, ctype, size) \ |
1310 typedef TypedElementsAccessor<EXTERNAL_##TYPE##_ELEMENTS> \ | 1329 typedef TypedElementsAccessor<EXTERNAL_##TYPE##_ELEMENTS> \ |
1311 External##Type##ElementsAccessor; | 1330 External##Type##ElementsAccessor; |
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1493 return MaybeHandle<AccessorPair>(); | 1512 return MaybeHandle<AccessorPair>(); |
1494 } | 1513 } |
1495 | 1514 |
1496 static bool HasElementImpl(Handle<JSObject> holder, uint32_t key, | 1515 static bool HasElementImpl(Handle<JSObject> holder, uint32_t key, |
1497 Handle<FixedArrayBase> store) { | 1516 Handle<FixedArrayBase> store) { |
1498 Handle<SeededNumberDictionary> backing_store = | 1517 Handle<SeededNumberDictionary> backing_store = |
1499 Handle<SeededNumberDictionary>::cast(store); | 1518 Handle<SeededNumberDictionary>::cast(store); |
1500 return backing_store->FindEntry(key) != SeededNumberDictionary::kNotFound; | 1519 return backing_store->FindEntry(key) != SeededNumberDictionary::kNotFound; |
1501 } | 1520 } |
1502 | 1521 |
1503 static uint32_t GetKeyForIndexImpl(Handle<FixedArrayBase> store, | 1522 static uint32_t GetKeyForIndexImpl(FixedArrayBase* store, uint32_t index) { |
1504 uint32_t index) { | |
1505 DisallowHeapAllocation no_gc; | 1523 DisallowHeapAllocation no_gc; |
1506 Handle<SeededNumberDictionary> dict = | 1524 SeededNumberDictionary* dict = SeededNumberDictionary::cast(store); |
1507 Handle<SeededNumberDictionary>::cast(store); | |
1508 Object* key = dict->KeyAt(index); | 1525 Object* key = dict->KeyAt(index); |
1509 return Smi::cast(key)->value(); | 1526 return Smi::cast(key)->value(); |
1510 } | 1527 } |
| 1528 |
| 1529 static uint32_t GetIndexForKeyImpl(FixedArrayBase* store, uint32_t key) { |
| 1530 DisallowHeapAllocation no_gc; |
| 1531 SeededNumberDictionary* dict = SeededNumberDictionary::cast(store); |
| 1532 int entry = dict->FindEntry(key); |
| 1533 if (entry == SeededNumberDictionary::kNotFound) { |
| 1534 return kMaxUInt32; |
| 1535 } |
| 1536 return static_cast<uint32_t>(entry); |
| 1537 } |
| 1538 |
| 1539 static PropertyDetails GetDetailsImpl(FixedArrayBase* backing_store, |
| 1540 uint32_t index) { |
| 1541 return SeededNumberDictionary::cast(backing_store)->DetailsAt(index); |
| 1542 } |
1511 }; | 1543 }; |
1512 | 1544 |
1513 | 1545 |
1514 class SloppyArgumentsElementsAccessor : public ElementsAccessorBase< | 1546 class SloppyArgumentsElementsAccessor : public ElementsAccessorBase< |
1515 SloppyArgumentsElementsAccessor, | 1547 SloppyArgumentsElementsAccessor, |
1516 ElementsKindTraits<SLOPPY_ARGUMENTS_ELEMENTS> > { | 1548 ElementsKindTraits<SLOPPY_ARGUMENTS_ELEMENTS> > { |
1517 public: | 1549 public: |
1518 explicit SloppyArgumentsElementsAccessor(const char* name) | 1550 explicit SloppyArgumentsElementsAccessor(const char* name) |
1519 : ElementsAccessorBase< | 1551 : ElementsAccessorBase< |
1520 SloppyArgumentsElementsAccessor, | 1552 SloppyArgumentsElementsAccessor, |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1630 return isolate->factory()->true_value(); | 1662 return isolate->factory()->true_value(); |
1631 } | 1663 } |
1632 | 1664 |
1633 static void CopyElementsImpl(FixedArrayBase* from, uint32_t from_start, | 1665 static void CopyElementsImpl(FixedArrayBase* from, uint32_t from_start, |
1634 FixedArrayBase* to, ElementsKind from_kind, | 1666 FixedArrayBase* to, ElementsKind from_kind, |
1635 uint32_t to_start, int packed_size, | 1667 uint32_t to_start, int packed_size, |
1636 int copy_size) { | 1668 int copy_size) { |
1637 UNREACHABLE(); | 1669 UNREACHABLE(); |
1638 } | 1670 } |
1639 | 1671 |
1640 static uint32_t GetCapacityImpl(Handle<JSObject> holder, | 1672 static uint32_t GetCapacityImpl(JSObject* holder, |
1641 Handle<FixedArrayBase> backing_store) { | 1673 FixedArrayBase* backing_store) { |
1642 Handle<FixedArray> parameter_map = Handle<FixedArray>::cast(backing_store); | 1674 FixedArray* parameter_map = FixedArray::cast(backing_store); |
1643 Handle<FixedArrayBase> arguments( | 1675 FixedArrayBase* arguments = FixedArrayBase::cast(parameter_map->get(1)); |
1644 FixedArrayBase::cast(parameter_map->get(1))); | |
1645 return Max(static_cast<uint32_t>(parameter_map->length() - 2), | 1676 return Max(static_cast<uint32_t>(parameter_map->length() - 2), |
1646 ForArray(arguments)->GetCapacity(holder, arguments)); | 1677 ForArray(arguments)->GetCapacity(holder, arguments)); |
1647 } | 1678 } |
1648 | 1679 |
1649 static uint32_t GetKeyForIndexImpl(Handle<FixedArrayBase> dict, | 1680 static uint32_t GetKeyForIndexImpl(FixedArrayBase* dict, uint32_t index) { |
1650 uint32_t index) { | |
1651 return index; | 1681 return index; |
1652 } | 1682 } |
1653 | 1683 |
| 1684 static uint32_t GetIndexForKeyImpl(FixedArrayBase* dict, uint32_t key) { |
| 1685 return key; |
| 1686 } |
| 1687 |
| 1688 static PropertyDetails GetDetailsImpl(FixedArrayBase* backing_store, |
| 1689 uint32_t index) { |
| 1690 return PropertyDetails(NONE, DATA, 0, PropertyCellType::kNoCell); |
| 1691 } |
| 1692 |
| 1693 |
1654 private: | 1694 private: |
1655 static Handle<Object> GetParameterMapArg(Handle<JSObject> holder, | 1695 static Handle<Object> GetParameterMapArg(Handle<JSObject> holder, |
1656 Handle<FixedArray> parameter_map, | 1696 Handle<FixedArray> parameter_map, |
1657 uint32_t key) { | 1697 uint32_t key) { |
1658 Isolate* isolate = holder->GetIsolate(); | 1698 Isolate* isolate = holder->GetIsolate(); |
1659 uint32_t length = holder->IsJSArray() | 1699 uint32_t length = holder->IsJSArray() |
1660 ? Smi::cast(Handle<JSArray>::cast(holder)->length())->value() | 1700 ? Smi::cast(Handle<JSArray>::cast(holder)->length())->value() |
1661 : parameter_map->length(); | 1701 : parameter_map->length(); |
1662 return key < (length - 2) | 1702 return key < (length - 2) |
1663 ? handle(parameter_map->get(key + 2), isolate) | 1703 ? handle(parameter_map->get(key + 2), isolate) |
1664 : Handle<Object>::cast(isolate->factory()->the_hole_value()); | 1704 : Handle<Object>::cast(isolate->factory()->the_hole_value()); |
1665 } | 1705 } |
1666 }; | 1706 }; |
1667 | 1707 |
1668 | 1708 |
1669 ElementsAccessor* ElementsAccessor::ForArray(Handle<FixedArrayBase> array) { | 1709 ElementsAccessor* ElementsAccessor::ForArray(FixedArrayBase* array) { |
1670 return elements_accessors_[ElementsKindForArray(*array)]; | 1710 return elements_accessors_[ElementsKindForArray(array)]; |
1671 } | 1711 } |
1672 | 1712 |
1673 | 1713 |
| 1714 ElementsAccessor* ElementsAccessor::ForArray(Handle<FixedArrayBase> array) { |
| 1715 return ForArray(*array); |
| 1716 } |
| 1717 |
| 1718 |
1674 void ElementsAccessor::InitializeOncePerProcess() { | 1719 void ElementsAccessor::InitializeOncePerProcess() { |
1675 static ElementsAccessor* accessor_array[] = { | 1720 static ElementsAccessor* accessor_array[] = { |
1676 #define ACCESSOR_ARRAY(Class, Kind, Store) new Class(#Kind), | 1721 #define ACCESSOR_ARRAY(Class, Kind, Store) new Class(#Kind), |
1677 ELEMENTS_LIST(ACCESSOR_ARRAY) | 1722 ELEMENTS_LIST(ACCESSOR_ARRAY) |
1678 #undef ACCESSOR_ARRAY | 1723 #undef ACCESSOR_ARRAY |
1679 }; | 1724 }; |
1680 | 1725 |
1681 STATIC_ASSERT((sizeof(accessor_array) / sizeof(*accessor_array)) == | 1726 STATIC_ASSERT((sizeof(accessor_array) / sizeof(*accessor_array)) == |
1682 kElementsKindCount); | 1727 kElementsKindCount); |
1683 | 1728 |
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1849 UNREACHABLE(); | 1894 UNREACHABLE(); |
1850 break; | 1895 break; |
1851 } | 1896 } |
1852 | 1897 |
1853 array->set_elements(*elms); | 1898 array->set_elements(*elms); |
1854 array->set_length(Smi::FromInt(number_of_elements)); | 1899 array->set_length(Smi::FromInt(number_of_elements)); |
1855 return array; | 1900 return array; |
1856 } | 1901 } |
1857 | 1902 |
1858 } } // namespace v8::internal | 1903 } } // namespace v8::internal |
OLD | NEW |