| 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 605 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 616 virtual void Set(FixedArrayBase* backing_store, uint32_t key, | 616 virtual void Set(FixedArrayBase* backing_store, uint32_t key, |
| 617 Object* value) final { | 617 Object* value) final { |
| 618 ElementsAccessorSubclass::SetImpl(backing_store, key, value); | 618 ElementsAccessorSubclass::SetImpl(backing_store, key, value); |
| 619 } | 619 } |
| 620 | 620 |
| 621 static void SetImpl(FixedArrayBase* backing_store, uint32_t key, | 621 static void SetImpl(FixedArrayBase* backing_store, uint32_t key, |
| 622 Object* value) { | 622 Object* value) { |
| 623 BackingStore::cast(backing_store)->SetValue(key, value); | 623 BackingStore::cast(backing_store)->SetValue(key, value); |
| 624 } | 624 } |
| 625 | 625 |
| 626 virtual void Reconfigure(Handle<JSObject> object, |
| 627 Handle<FixedArrayBase> store, uint32_t index, |
| 628 Handle<Object> value, |
| 629 PropertyAttributes attributes) final { |
| 630 ElementsAccessorSubclass::ReconfigureImpl(object, store, index, value, |
| 631 attributes); |
| 632 } |
| 633 |
| 634 static void ReconfigureImpl(Handle<JSObject> object, |
| 635 Handle<FixedArrayBase> store, uint32_t index, |
| 636 Handle<Object> value, |
| 637 PropertyAttributes attributes) { |
| 638 UNREACHABLE(); |
| 639 } |
| 640 |
| 626 virtual MaybeHandle<AccessorPair> GetAccessorPair( | 641 virtual MaybeHandle<AccessorPair> GetAccessorPair( |
| 627 Handle<JSObject> holder, uint32_t key, | 642 Handle<JSObject> holder, uint32_t key, |
| 628 Handle<FixedArrayBase> backing_store) final { | 643 Handle<FixedArrayBase> backing_store) final { |
| 629 return ElementsAccessorSubclass::GetAccessorPairImpl(holder, key, | 644 return ElementsAccessorSubclass::GetAccessorPairImpl(holder, key, |
| 630 backing_store); | 645 backing_store); |
| 631 } | 646 } |
| 632 | 647 |
| 633 static MaybeHandle<AccessorPair> GetAccessorPairImpl( | 648 static MaybeHandle<AccessorPair> GetAccessorPairImpl( |
| 634 Handle<JSObject> obj, uint32_t key, | 649 Handle<JSObject> obj, uint32_t key, |
| 635 Handle<FixedArrayBase> backing_store) { | 650 Handle<FixedArrayBase> backing_store) { |
| (...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 896 | 911 |
| 897 // Super class for all fast element arrays. | 912 // Super class for all fast element arrays. |
| 898 template<typename FastElementsAccessorSubclass, | 913 template<typename FastElementsAccessorSubclass, |
| 899 typename KindTraits> | 914 typename KindTraits> |
| 900 class FastElementsAccessor | 915 class FastElementsAccessor |
| 901 : public ElementsAccessorBase<FastElementsAccessorSubclass, KindTraits> { | 916 : public ElementsAccessorBase<FastElementsAccessorSubclass, KindTraits> { |
| 902 public: | 917 public: |
| 903 explicit FastElementsAccessor(const char* name) | 918 explicit FastElementsAccessor(const char* name) |
| 904 : ElementsAccessorBase<FastElementsAccessorSubclass, | 919 : ElementsAccessorBase<FastElementsAccessorSubclass, |
| 905 KindTraits>(name) {} | 920 KindTraits>(name) {} |
| 921 |
| 922 static void ReconfigureImpl(Handle<JSObject> object, |
| 923 Handle<FixedArrayBase> store, uint32_t index, |
| 924 Handle<Object> value, |
| 925 PropertyAttributes attributes) { |
| 926 Handle<SeededNumberDictionary> dictionary = |
| 927 JSObject::NormalizeElements(object); |
| 928 index = dictionary->FindEntry(index); |
| 929 object->GetElementsAccessor()->Reconfigure(object, dictionary, index, value, |
| 930 attributes); |
| 931 } |
| 932 |
| 906 protected: | 933 protected: |
| 907 friend class ElementsAccessorBase<FastElementsAccessorSubclass, KindTraits>; | 934 friend class ElementsAccessorBase<FastElementsAccessorSubclass, KindTraits>; |
| 908 friend class SloppyArgumentsElementsAccessor; | 935 friend class SloppyArgumentsElementsAccessor; |
| 909 | 936 |
| 910 typedef typename KindTraits::BackingStore BackingStore; | 937 typedef typename KindTraits::BackingStore BackingStore; |
| 911 | 938 |
| 912 static void DeleteCommon(Handle<JSObject> obj, uint32_t key, | 939 static void DeleteCommon(Handle<JSObject> obj, uint32_t key, |
| 913 LanguageMode language_mode) { | 940 LanguageMode language_mode) { |
| 914 DCHECK(obj->HasFastSmiOrObjectElements() || | 941 DCHECK(obj->HasFastSmiOrObjectElements() || |
| 915 obj->HasFastDoubleElements() || | 942 obj->HasFastDoubleElements() || |
| (...skipping 486 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1402 Handle<SeededNumberDictionary>::cast(store); | 1429 Handle<SeededNumberDictionary>::cast(store); |
| 1403 Isolate* isolate = backing_store->GetIsolate(); | 1430 Isolate* isolate = backing_store->GetIsolate(); |
| 1404 int entry = backing_store->FindEntry(key); | 1431 int entry = backing_store->FindEntry(key); |
| 1405 if (entry != SeededNumberDictionary::kNotFound) { | 1432 if (entry != SeededNumberDictionary::kNotFound) { |
| 1406 return handle(backing_store->ValueAt(entry), isolate); | 1433 return handle(backing_store->ValueAt(entry), isolate); |
| 1407 } | 1434 } |
| 1408 return isolate->factory()->the_hole_value(); | 1435 return isolate->factory()->the_hole_value(); |
| 1409 } | 1436 } |
| 1410 | 1437 |
| 1411 static void SetImpl(FixedArrayBase* store, uint32_t key, Object* value) { | 1438 static void SetImpl(FixedArrayBase* store, uint32_t key, Object* value) { |
| 1412 SeededNumberDictionary* backing_store = SeededNumberDictionary::cast(store); | 1439 SeededNumberDictionary* dictionary = SeededNumberDictionary::cast(store); |
| 1413 int entry = backing_store->FindEntry(key); | 1440 int entry = dictionary->FindEntry(key); |
| 1414 DCHECK_NE(SeededNumberDictionary::kNotFound, entry); | 1441 DCHECK_NE(SeededNumberDictionary::kNotFound, entry); |
| 1415 backing_store->ValueAtPut(entry, value); | 1442 dictionary->ValueAtPut(entry, value); |
| 1443 } |
| 1444 |
| 1445 static void ReconfigureImpl(Handle<JSObject> object, |
| 1446 Handle<FixedArrayBase> store, uint32_t index, |
| 1447 Handle<Object> value, |
| 1448 PropertyAttributes attributes) { |
| 1449 SeededNumberDictionary* dictionary = SeededNumberDictionary::cast(*store); |
| 1450 if (attributes != NONE) dictionary->set_requires_slow_elements(); |
| 1451 dictionary->ValueAtPut(index, *value); |
| 1452 PropertyDetails details = dictionary->DetailsAt(index); |
| 1453 details = PropertyDetails(attributes, DATA, details.dictionary_index(), |
| 1454 PropertyCellType::kNoCell); |
| 1455 dictionary->DetailsAtPut(index, details); |
| 1416 } | 1456 } |
| 1417 | 1457 |
| 1418 static MaybeHandle<AccessorPair> GetAccessorPairImpl( | 1458 static MaybeHandle<AccessorPair> GetAccessorPairImpl( |
| 1419 Handle<JSObject> obj, uint32_t key, Handle<FixedArrayBase> store) { | 1459 Handle<JSObject> obj, uint32_t key, Handle<FixedArrayBase> store) { |
| 1420 Handle<SeededNumberDictionary> backing_store = | 1460 Handle<SeededNumberDictionary> backing_store = |
| 1421 Handle<SeededNumberDictionary>::cast(store); | 1461 Handle<SeededNumberDictionary>::cast(store); |
| 1422 int entry = backing_store->FindEntry(key); | 1462 int entry = backing_store->FindEntry(key); |
| 1423 if (entry != SeededNumberDictionary::kNotFound && | 1463 if (entry != SeededNumberDictionary::kNotFound && |
| 1424 backing_store->DetailsAt(entry).type() == ACCESSOR_CONSTANT && | 1464 backing_store->DetailsAt(entry).type() == ACCESSOR_CONSTANT && |
| 1425 backing_store->ValueAt(entry)->IsAccessorPair()) { | 1465 backing_store->ValueAt(entry)->IsAccessorPair()) { |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1526 Context* context = Context::cast(parameter_map->get(0)); | 1566 Context* context = Context::cast(parameter_map->get(0)); |
| 1527 int context_index = Smi::cast(probe)->value(); | 1567 int context_index = Smi::cast(probe)->value(); |
| 1528 DCHECK(!context->get(context_index)->IsTheHole()); | 1568 DCHECK(!context->get(context_index)->IsTheHole()); |
| 1529 context->set(context_index, value); | 1569 context->set(context_index, value); |
| 1530 } else { | 1570 } else { |
| 1531 FixedArray* arguments = FixedArray::cast(parameter_map->get(1)); | 1571 FixedArray* arguments = FixedArray::cast(parameter_map->get(1)); |
| 1532 ElementsAccessor::ForArray(arguments)->Set(arguments, key, value); | 1572 ElementsAccessor::ForArray(arguments)->Set(arguments, key, value); |
| 1533 } | 1573 } |
| 1534 } | 1574 } |
| 1535 | 1575 |
| 1576 static void ReconfigureImpl(Handle<JSObject> object, |
| 1577 Handle<FixedArrayBase> store, uint32_t index, |
| 1578 Handle<Object> value, |
| 1579 PropertyAttributes attributes) { |
| 1580 Handle<FixedArray> parameter_map = Handle<FixedArray>::cast(store); |
| 1581 uint32_t length = parameter_map->length() - 2; |
| 1582 if (index < length) { |
| 1583 Object* probe = parameter_map->get(index + 2); |
| 1584 DCHECK(!probe->IsTheHole()); |
| 1585 Context* context = Context::cast(parameter_map->get(0)); |
| 1586 int context_index = Smi::cast(probe)->value(); |
| 1587 DCHECK(!context->get(context_index)->IsTheHole()); |
| 1588 context->set(context_index, *value); |
| 1589 |
| 1590 // Redefining attributes of an aliased element destroys fast aliasing. |
| 1591 parameter_map->set_the_hole(index + 2); |
| 1592 // For elements that are still writable we re-establish slow aliasing. |
| 1593 if ((attributes & READ_ONLY) == 0) { |
| 1594 Isolate* isolate = store->GetIsolate(); |
| 1595 value = isolate->factory()->NewAliasedArgumentsEntry(context_index); |
| 1596 } |
| 1597 |
| 1598 PropertyDetails details(attributes, DATA, 0, PropertyCellType::kNoCell); |
| 1599 Handle<SeededNumberDictionary> arguments = |
| 1600 parameter_map->get(1)->IsSeededNumberDictionary() |
| 1601 ? handle(SeededNumberDictionary::cast(parameter_map->get(1))) |
| 1602 : JSObject::NormalizeElements(object); |
| 1603 arguments = SeededNumberDictionary::AddNumberEntry(arguments, index, |
| 1604 value, details); |
| 1605 parameter_map->set(1, *arguments); |
| 1606 } else { |
| 1607 Handle<FixedArrayBase> arguments( |
| 1608 FixedArrayBase::cast(parameter_map->get(1))); |
| 1609 ElementsAccessor::ForArray(arguments) |
| 1610 ->Reconfigure(object, arguments, index - length, value, attributes); |
| 1611 } |
| 1612 } |
| 1613 |
| 1536 static MaybeHandle<AccessorPair> GetAccessorPairImpl( | 1614 static MaybeHandle<AccessorPair> GetAccessorPairImpl( |
| 1537 Handle<JSObject> obj, uint32_t key, Handle<FixedArrayBase> parameters) { | 1615 Handle<JSObject> obj, uint32_t key, Handle<FixedArrayBase> parameters) { |
| 1538 Handle<FixedArray> parameter_map = Handle<FixedArray>::cast(parameters); | 1616 Handle<FixedArray> parameter_map = Handle<FixedArray>::cast(parameters); |
| 1539 Handle<Object> probe(GetParameterMapArg(*parameter_map, key), | 1617 Handle<Object> probe(GetParameterMapArg(*parameter_map, key), |
| 1540 obj->GetIsolate()); | 1618 obj->GetIsolate()); |
| 1541 if (!probe->IsTheHole()) { | 1619 if (!probe->IsTheHole()) { |
| 1542 return MaybeHandle<AccessorPair>(); | 1620 return MaybeHandle<AccessorPair>(); |
| 1543 } else { | 1621 } else { |
| 1544 // If not aliased, check the arguments. | 1622 // If not aliased, check the arguments. |
| 1545 Handle<FixedArray> arguments(FixedArray::cast(parameter_map->get(1))); | 1623 Handle<FixedArray> arguments(FixedArray::cast(parameter_map->get(1))); |
| (...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1820 break; | 1898 break; |
| 1821 } | 1899 } |
| 1822 | 1900 |
| 1823 array->set_elements(*elms); | 1901 array->set_elements(*elms); |
| 1824 array->set_length(Smi::FromInt(number_of_elements)); | 1902 array->set_length(Smi::FromInt(number_of_elements)); |
| 1825 return array; | 1903 return array; |
| 1826 } | 1904 } |
| 1827 | 1905 |
| 1828 } // namespace internal | 1906 } // namespace internal |
| 1829 } // namespace v8 | 1907 } // namespace v8 |
| OLD | NEW |