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 932 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
943 static void SetImpl(FixedArrayBase* store, uint32_t entry, Object* value) { | 943 static void SetImpl(FixedArrayBase* store, uint32_t entry, Object* value) { |
944 SeededNumberDictionary* dictionary = SeededNumberDictionary::cast(store); | 944 SeededNumberDictionary* dictionary = SeededNumberDictionary::cast(store); |
945 dictionary->ValueAtPut(entry, value); | 945 dictionary->ValueAtPut(entry, value); |
946 } | 946 } |
947 | 947 |
948 static void ReconfigureImpl(Handle<JSObject> object, | 948 static void ReconfigureImpl(Handle<JSObject> object, |
949 Handle<FixedArrayBase> store, uint32_t entry, | 949 Handle<FixedArrayBase> store, uint32_t entry, |
950 Handle<Object> value, | 950 Handle<Object> value, |
951 PropertyAttributes attributes) { | 951 PropertyAttributes attributes) { |
952 SeededNumberDictionary* dictionary = SeededNumberDictionary::cast(*store); | 952 SeededNumberDictionary* dictionary = SeededNumberDictionary::cast(*store); |
953 if (attributes != NONE) dictionary->set_requires_slow_elements(); | 953 if (attributes != NONE) object->RequireSlowElements(dictionary); |
954 dictionary->ValueAtPut(entry, *value); | 954 dictionary->ValueAtPut(entry, *value); |
955 PropertyDetails details = dictionary->DetailsAt(entry); | 955 PropertyDetails details = dictionary->DetailsAt(entry); |
956 details = PropertyDetails(attributes, DATA, details.dictionary_index(), | 956 details = PropertyDetails(attributes, DATA, details.dictionary_index(), |
957 PropertyCellType::kNoCell); | 957 PropertyCellType::kNoCell); |
958 dictionary->DetailsAtPut(entry, details); | 958 dictionary->DetailsAtPut(entry, details); |
959 } | 959 } |
960 | 960 |
961 static void AddImpl(Handle<JSObject> object, uint32_t index, | 961 static void AddImpl(Handle<JSObject> object, uint32_t index, |
962 Handle<Object> value, PropertyAttributes attributes, | 962 Handle<Object> value, PropertyAttributes attributes, |
963 uint32_t new_capacity) { | 963 uint32_t new_capacity) { |
964 PropertyDetails details(attributes, DATA, 0, PropertyCellType::kNoCell); | 964 PropertyDetails details(attributes, DATA, 0, PropertyCellType::kNoCell); |
965 Handle<SeededNumberDictionary> dictionary = | 965 Handle<SeededNumberDictionary> dictionary = |
966 object->HasFastElements() | 966 object->HasFastElements() |
967 ? JSObject::NormalizeElements(object) | 967 ? JSObject::NormalizeElements(object) |
968 : handle(SeededNumberDictionary::cast(object->elements())); | 968 : handle(SeededNumberDictionary::cast(object->elements())); |
969 Handle<SeededNumberDictionary> new_dictionary = | 969 Handle<SeededNumberDictionary> new_dictionary = |
970 SeededNumberDictionary::AddNumberEntry(dictionary, index, value, | 970 SeededNumberDictionary::AddNumberEntry(dictionary, index, value, |
971 details); | 971 details); |
972 if (attributes != NONE) new_dictionary->set_requires_slow_elements(); | 972 if (attributes != NONE) object->RequireSlowElements(*new_dictionary); |
973 if (dictionary.is_identical_to(new_dictionary)) return; | 973 if (dictionary.is_identical_to(new_dictionary)) return; |
974 object->set_elements(*new_dictionary); | 974 object->set_elements(*new_dictionary); |
975 } | 975 } |
976 | 976 |
977 static bool HasEntryImpl(FixedArrayBase* store, uint32_t entry) { | 977 static bool HasEntryImpl(FixedArrayBase* store, uint32_t entry) { |
978 DisallowHeapAllocation no_gc; | 978 DisallowHeapAllocation no_gc; |
979 SeededNumberDictionary* dict = SeededNumberDictionary::cast(store); | 979 SeededNumberDictionary* dict = SeededNumberDictionary::cast(store); |
980 Object* index = dict->KeyAt(entry); | 980 Object* index = dict->KeyAt(entry); |
981 return !index->IsTheHole(); | 981 return !index->IsTheHole(); |
982 } | 982 } |
(...skipping 624 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1607 Handle<FixedArrayBase> old_elements( | 1607 Handle<FixedArrayBase> old_elements( |
1608 FixedArrayBase::cast(parameter_map->get(1))); | 1608 FixedArrayBase::cast(parameter_map->get(1))); |
1609 Handle<SeededNumberDictionary> dictionary = | 1609 Handle<SeededNumberDictionary> dictionary = |
1610 old_elements->IsSeededNumberDictionary() | 1610 old_elements->IsSeededNumberDictionary() |
1611 ? Handle<SeededNumberDictionary>::cast(old_elements) | 1611 ? Handle<SeededNumberDictionary>::cast(old_elements) |
1612 : JSObject::NormalizeElements(object); | 1612 : JSObject::NormalizeElements(object); |
1613 PropertyDetails details(attributes, DATA, 0, PropertyCellType::kNoCell); | 1613 PropertyDetails details(attributes, DATA, 0, PropertyCellType::kNoCell); |
1614 Handle<SeededNumberDictionary> new_dictionary = | 1614 Handle<SeededNumberDictionary> new_dictionary = |
1615 SeededNumberDictionary::AddNumberEntry(dictionary, index, value, | 1615 SeededNumberDictionary::AddNumberEntry(dictionary, index, value, |
1616 details); | 1616 details); |
1617 if (attributes != NONE) new_dictionary->set_requires_slow_elements(); | 1617 if (attributes != NONE) object->RequireSlowElements(*new_dictionary); |
1618 if (*dictionary != *new_dictionary) { | 1618 if (*dictionary != *new_dictionary) { |
1619 FixedArray::cast(object->elements())->set(1, *new_dictionary); | 1619 FixedArray::cast(object->elements())->set(1, *new_dictionary); |
1620 } | 1620 } |
1621 } | 1621 } |
1622 | 1622 |
1623 static void ReconfigureImpl(Handle<JSObject> object, | 1623 static void ReconfigureImpl(Handle<JSObject> object, |
1624 Handle<FixedArrayBase> store, uint32_t entry, | 1624 Handle<FixedArrayBase> store, uint32_t entry, |
1625 Handle<Object> value, | 1625 Handle<Object> value, |
1626 PropertyAttributes attributes) { | 1626 PropertyAttributes attributes) { |
1627 Handle<FixedArray> parameter_map = Handle<FixedArray>::cast(store); | 1627 Handle<FixedArray> parameter_map = Handle<FixedArray>::cast(store); |
(...skipping 12 matching lines...) Expand all Loading... |
1640 if ((attributes & READ_ONLY) == 0) { | 1640 if ((attributes & READ_ONLY) == 0) { |
1641 Isolate* isolate = store->GetIsolate(); | 1641 Isolate* isolate = store->GetIsolate(); |
1642 value = isolate->factory()->NewAliasedArgumentsEntry(context_entry); | 1642 value = isolate->factory()->NewAliasedArgumentsEntry(context_entry); |
1643 } | 1643 } |
1644 | 1644 |
1645 PropertyDetails details(attributes, DATA, 0, PropertyCellType::kNoCell); | 1645 PropertyDetails details(attributes, DATA, 0, PropertyCellType::kNoCell); |
1646 Handle<SeededNumberDictionary> arguments( | 1646 Handle<SeededNumberDictionary> arguments( |
1647 SeededNumberDictionary::cast(parameter_map->get(1))); | 1647 SeededNumberDictionary::cast(parameter_map->get(1))); |
1648 arguments = SeededNumberDictionary::AddNumberEntry(arguments, entry, | 1648 arguments = SeededNumberDictionary::AddNumberEntry(arguments, entry, |
1649 value, details); | 1649 value, details); |
| 1650 // If the attributes were NONE, we would have called set rather than |
| 1651 // reconfigure. |
| 1652 DCHECK_NE(NONE, attributes); |
| 1653 object->RequireSlowElements(*arguments); |
1650 parameter_map->set(1, *arguments); | 1654 parameter_map->set(1, *arguments); |
1651 } else { | 1655 } else { |
1652 Handle<FixedArrayBase> arguments( | 1656 Handle<FixedArrayBase> arguments( |
1653 FixedArrayBase::cast(parameter_map->get(1))); | 1657 FixedArrayBase::cast(parameter_map->get(1))); |
1654 DictionaryElementsAccessor::ReconfigureImpl( | 1658 DictionaryElementsAccessor::ReconfigureImpl( |
1655 object, arguments, entry - length, value, attributes); | 1659 object, arguments, entry - length, value, attributes); |
1656 } | 1660 } |
1657 } | 1661 } |
1658 }; | 1662 }; |
1659 | 1663 |
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1941 #define ACCESSOR_DELETE(Class, Kind, Store) delete elements_accessors_[Kind]; | 1945 #define ACCESSOR_DELETE(Class, Kind, Store) delete elements_accessors_[Kind]; |
1942 ELEMENTS_LIST(ACCESSOR_DELETE) | 1946 ELEMENTS_LIST(ACCESSOR_DELETE) |
1943 #undef ACCESSOR_DELETE | 1947 #undef ACCESSOR_DELETE |
1944 elements_accessors_ = NULL; | 1948 elements_accessors_ = NULL; |
1945 } | 1949 } |
1946 | 1950 |
1947 | 1951 |
1948 ElementsAccessor** ElementsAccessor::elements_accessors_ = NULL; | 1952 ElementsAccessor** ElementsAccessor::elements_accessors_ = NULL; |
1949 } // namespace internal | 1953 } // namespace internal |
1950 } // namespace v8 | 1954 } // namespace v8 |
OLD | NEW |