| 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/objects.h" | 10 #include "src/objects.h" |
| (...skipping 673 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 684 } | 684 } |
| 685 | 685 |
| 686 static void SetFastElementsCapacityAndLength( | 686 static void SetFastElementsCapacityAndLength( |
| 687 Handle<JSObject> obj, | 687 Handle<JSObject> obj, |
| 688 int capacity, | 688 int capacity, |
| 689 int length) { | 689 int length) { |
| 690 UNIMPLEMENTED(); | 690 UNIMPLEMENTED(); |
| 691 } | 691 } |
| 692 | 692 |
| 693 MUST_USE_RESULT virtual MaybeHandle<Object> Delete( | 693 MUST_USE_RESULT virtual MaybeHandle<Object> Delete( |
| 694 Handle<JSObject> obj, uint32_t key, StrictMode strict_mode) OVERRIDE = 0; | 694 Handle<JSObject> obj, uint32_t key, |
| 695 LanguageMode language_mode) OVERRIDE = 0; |
| 695 | 696 |
| 696 static void CopyElementsImpl(FixedArrayBase* from, uint32_t from_start, | 697 static void CopyElementsImpl(FixedArrayBase* from, uint32_t from_start, |
| 697 FixedArrayBase* to, ElementsKind from_kind, | 698 FixedArrayBase* to, ElementsKind from_kind, |
| 698 uint32_t to_start, int packed_size, | 699 uint32_t to_start, int packed_size, |
| 699 int copy_size) { | 700 int copy_size) { |
| 700 UNREACHABLE(); | 701 UNREACHABLE(); |
| 701 } | 702 } |
| 702 | 703 |
| 703 virtual void CopyElements(Handle<FixedArrayBase> from, uint32_t from_start, | 704 virtual void CopyElements(Handle<FixedArrayBase> from, uint32_t from_start, |
| 704 ElementsKind from_kind, Handle<FixedArrayBase> to, | 705 ElementsKind from_kind, Handle<FixedArrayBase> to, |
| (...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 907 // Check whether the backing store should be expanded. | 908 // Check whether the backing store should be expanded. |
| 908 uint32_t min = JSObject::NewElementsCapacity(old_capacity); | 909 uint32_t min = JSObject::NewElementsCapacity(old_capacity); |
| 909 uint32_t new_capacity = length > min ? length : min; | 910 uint32_t new_capacity = length > min ? length : min; |
| 910 FastElementsAccessorSubclass::SetFastElementsCapacityAndLength( | 911 FastElementsAccessorSubclass::SetFastElementsCapacityAndLength( |
| 911 array, new_capacity, length); | 912 array, new_capacity, length); |
| 912 JSObject::ValidateElements(array); | 913 JSObject::ValidateElements(array); |
| 913 return length_object; | 914 return length_object; |
| 914 } | 915 } |
| 915 | 916 |
| 916 static Handle<Object> DeleteCommon(Handle<JSObject> obj, uint32_t key, | 917 static Handle<Object> DeleteCommon(Handle<JSObject> obj, uint32_t key, |
| 917 StrictMode strict_mode) { | 918 LanguageMode language_mode) { |
| 918 DCHECK(obj->HasFastSmiOrObjectElements() || | 919 DCHECK(obj->HasFastSmiOrObjectElements() || |
| 919 obj->HasFastDoubleElements() || | 920 obj->HasFastDoubleElements() || |
| 920 obj->HasFastArgumentsElements()); | 921 obj->HasFastArgumentsElements()); |
| 921 Isolate* isolate = obj->GetIsolate(); | 922 Isolate* isolate = obj->GetIsolate(); |
| 922 Heap* heap = obj->GetHeap(); | 923 Heap* heap = obj->GetHeap(); |
| 923 Handle<FixedArrayBase> elements(obj->elements()); | 924 Handle<FixedArrayBase> elements(obj->elements()); |
| 924 if (*elements == heap->empty_fixed_array()) { | 925 if (*elements == heap->empty_fixed_array()) { |
| 925 return isolate->factory()->true_value(); | 926 return isolate->factory()->true_value(); |
| 926 } | 927 } |
| 927 Handle<BackingStore> backing_store = Handle<BackingStore>::cast(elements); | 928 Handle<BackingStore> backing_store = Handle<BackingStore>::cast(elements); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 965 } | 966 } |
| 966 if (4 * num_used <= backing_store->length()) { | 967 if (4 * num_used <= backing_store->length()) { |
| 967 JSObject::NormalizeElements(obj); | 968 JSObject::NormalizeElements(obj); |
| 968 } | 969 } |
| 969 } | 970 } |
| 970 } | 971 } |
| 971 return isolate->factory()->true_value(); | 972 return isolate->factory()->true_value(); |
| 972 } | 973 } |
| 973 | 974 |
| 974 virtual MaybeHandle<Object> Delete(Handle<JSObject> obj, uint32_t key, | 975 virtual MaybeHandle<Object> Delete(Handle<JSObject> obj, uint32_t key, |
| 975 StrictMode strict_mode) FINAL { | 976 LanguageMode language_mode) FINAL { |
| 976 return DeleteCommon(obj, key, strict_mode); | 977 return DeleteCommon(obj, key, language_mode); |
| 977 } | 978 } |
| 978 | 979 |
| 979 static bool HasElementImpl( | 980 static bool HasElementImpl( |
| 980 Handle<Object> receiver, | 981 Handle<Object> receiver, |
| 981 Handle<JSObject> holder, | 982 Handle<JSObject> holder, |
| 982 uint32_t key, | 983 uint32_t key, |
| 983 Handle<FixedArrayBase> backing_store) { | 984 Handle<FixedArrayBase> backing_store) { |
| 984 if (key >= static_cast<uint32_t>(backing_store->length())) { | 985 if (key >= static_cast<uint32_t>(backing_store->length())) { |
| 985 return false; | 986 return false; |
| 986 } | 987 } |
| (...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1288 MUST_USE_RESULT static MaybeHandle<Object> SetLengthImpl( | 1289 MUST_USE_RESULT static MaybeHandle<Object> SetLengthImpl( |
| 1289 Handle<JSObject> obj, | 1290 Handle<JSObject> obj, |
| 1290 Handle<Object> length, | 1291 Handle<Object> length, |
| 1291 Handle<FixedArrayBase> backing_store) { | 1292 Handle<FixedArrayBase> backing_store) { |
| 1292 // External arrays do not support changing their length. | 1293 // External arrays do not support changing their length. |
| 1293 UNREACHABLE(); | 1294 UNREACHABLE(); |
| 1294 return obj; | 1295 return obj; |
| 1295 } | 1296 } |
| 1296 | 1297 |
| 1297 MUST_USE_RESULT virtual MaybeHandle<Object> Delete( | 1298 MUST_USE_RESULT virtual MaybeHandle<Object> Delete( |
| 1298 Handle<JSObject> obj, uint32_t key, StrictMode strict_mode) FINAL { | 1299 Handle<JSObject> obj, uint32_t key, LanguageMode language_mode) FINAL { |
| 1299 // External arrays always ignore deletes. | 1300 // External arrays always ignore deletes. |
| 1300 return obj->GetIsolate()->factory()->true_value(); | 1301 return obj->GetIsolate()->factory()->true_value(); |
| 1301 } | 1302 } |
| 1302 | 1303 |
| 1303 static bool HasElementImpl(Handle<Object> receiver, | 1304 static bool HasElementImpl(Handle<Object> receiver, |
| 1304 Handle<JSObject> holder, | 1305 Handle<JSObject> holder, |
| 1305 uint32_t key, | 1306 uint32_t key, |
| 1306 Handle<FixedArrayBase> backing_store) { | 1307 Handle<FixedArrayBase> backing_store) { |
| 1307 uint32_t capacity = | 1308 uint32_t capacity = |
| 1308 AccessorClass::GetCapacityImpl(backing_store); | 1309 AccessorClass::GetCapacityImpl(backing_store); |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1387 } | 1388 } |
| 1388 } | 1389 } |
| 1389 | 1390 |
| 1390 // Update the number of elements. | 1391 // Update the number of elements. |
| 1391 dict->ElementsRemoved(removed_entries); | 1392 dict->ElementsRemoved(removed_entries); |
| 1392 } | 1393 } |
| 1393 return length_object; | 1394 return length_object; |
| 1394 } | 1395 } |
| 1395 | 1396 |
| 1396 MUST_USE_RESULT static MaybeHandle<Object> DeleteCommon( | 1397 MUST_USE_RESULT static MaybeHandle<Object> DeleteCommon( |
| 1397 Handle<JSObject> obj, uint32_t key, StrictMode strict_mode) { | 1398 Handle<JSObject> obj, uint32_t key, LanguageMode language_mode) { |
| 1398 Isolate* isolate = obj->GetIsolate(); | 1399 Isolate* isolate = obj->GetIsolate(); |
| 1399 Handle<FixedArray> backing_store(FixedArray::cast(obj->elements()), | 1400 Handle<FixedArray> backing_store(FixedArray::cast(obj->elements()), |
| 1400 isolate); | 1401 isolate); |
| 1401 bool is_arguments = | 1402 bool is_arguments = |
| 1402 (obj->GetElementsKind() == SLOPPY_ARGUMENTS_ELEMENTS); | 1403 (obj->GetElementsKind() == SLOPPY_ARGUMENTS_ELEMENTS); |
| 1403 if (is_arguments) { | 1404 if (is_arguments) { |
| 1404 backing_store = handle(FixedArray::cast(backing_store->get(1)), isolate); | 1405 backing_store = handle(FixedArray::cast(backing_store->get(1)), isolate); |
| 1405 } | 1406 } |
| 1406 Handle<SeededNumberDictionary> dictionary = | 1407 Handle<SeededNumberDictionary> dictionary = |
| 1407 Handle<SeededNumberDictionary>::cast(backing_store); | 1408 Handle<SeededNumberDictionary>::cast(backing_store); |
| 1408 int entry = dictionary->FindEntry(key); | 1409 int entry = dictionary->FindEntry(key); |
| 1409 if (entry != SeededNumberDictionary::kNotFound) { | 1410 if (entry != SeededNumberDictionary::kNotFound) { |
| 1410 Handle<Object> result = | 1411 Handle<Object> result = |
| 1411 SeededNumberDictionary::DeleteProperty(dictionary, entry); | 1412 SeededNumberDictionary::DeleteProperty(dictionary, entry); |
| 1412 if (*result == *isolate->factory()->false_value()) { | 1413 if (*result == *isolate->factory()->false_value()) { |
| 1413 if (strict_mode == STRICT) { | 1414 if (is_strict(language_mode)) { |
| 1414 // Deleting a non-configurable property in strict mode. | 1415 // Deleting a non-configurable property in strict mode. |
| 1415 Handle<Object> name = isolate->factory()->NewNumberFromUint(key); | 1416 Handle<Object> name = isolate->factory()->NewNumberFromUint(key); |
| 1416 Handle<Object> args[2] = { name, obj }; | 1417 Handle<Object> args[2] = { name, obj }; |
| 1417 THROW_NEW_ERROR(isolate, NewTypeError("strict_delete_property", | 1418 THROW_NEW_ERROR(isolate, NewTypeError("strict_delete_property", |
| 1418 HandleVector(args, 2)), | 1419 HandleVector(args, 2)), |
| 1419 Object); | 1420 Object); |
| 1420 } | 1421 } |
| 1421 return isolate->factory()->false_value(); | 1422 return isolate->factory()->false_value(); |
| 1422 } | 1423 } |
| 1423 Handle<FixedArray> new_elements = | 1424 Handle<FixedArray> new_elements = |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1438 int copy_size) { | 1439 int copy_size) { |
| 1439 UNREACHABLE(); | 1440 UNREACHABLE(); |
| 1440 } | 1441 } |
| 1441 | 1442 |
| 1442 | 1443 |
| 1443 protected: | 1444 protected: |
| 1444 friend class ElementsAccessorBase<DictionaryElementsAccessor, | 1445 friend class ElementsAccessorBase<DictionaryElementsAccessor, |
| 1445 ElementsKindTraits<DICTIONARY_ELEMENTS> >; | 1446 ElementsKindTraits<DICTIONARY_ELEMENTS> >; |
| 1446 | 1447 |
| 1447 MUST_USE_RESULT virtual MaybeHandle<Object> Delete( | 1448 MUST_USE_RESULT virtual MaybeHandle<Object> Delete( |
| 1448 Handle<JSObject> obj, uint32_t key, StrictMode strict_mode) FINAL { | 1449 Handle<JSObject> obj, uint32_t key, LanguageMode language_mode) FINAL { |
| 1449 return DeleteCommon(obj, key, strict_mode); | 1450 return DeleteCommon(obj, key, language_mode); |
| 1450 } | 1451 } |
| 1451 | 1452 |
| 1452 MUST_USE_RESULT static MaybeHandle<Object> GetImpl( | 1453 MUST_USE_RESULT static MaybeHandle<Object> GetImpl( |
| 1453 Handle<Object> receiver, | 1454 Handle<Object> receiver, |
| 1454 Handle<JSObject> obj, | 1455 Handle<JSObject> obj, |
| 1455 uint32_t key, | 1456 uint32_t key, |
| 1456 Handle<FixedArrayBase> store) { | 1457 Handle<FixedArrayBase> store) { |
| 1457 Handle<SeededNumberDictionary> backing_store = | 1458 Handle<SeededNumberDictionary> backing_store = |
| 1458 Handle<SeededNumberDictionary>::cast(store); | 1459 Handle<SeededNumberDictionary>::cast(store); |
| 1459 Isolate* isolate = backing_store->GetIsolate(); | 1460 Isolate* isolate = backing_store->GetIsolate(); |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1610 Handle<JSObject> obj, | 1611 Handle<JSObject> obj, |
| 1611 Handle<Object> length, | 1612 Handle<Object> length, |
| 1612 Handle<FixedArrayBase> parameter_map) { | 1613 Handle<FixedArrayBase> parameter_map) { |
| 1613 // TODO(mstarzinger): This was never implemented but will be used once we | 1614 // TODO(mstarzinger): This was never implemented but will be used once we |
| 1614 // correctly implement [[DefineOwnProperty]] on arrays. | 1615 // correctly implement [[DefineOwnProperty]] on arrays. |
| 1615 UNIMPLEMENTED(); | 1616 UNIMPLEMENTED(); |
| 1616 return obj; | 1617 return obj; |
| 1617 } | 1618 } |
| 1618 | 1619 |
| 1619 MUST_USE_RESULT virtual MaybeHandle<Object> Delete( | 1620 MUST_USE_RESULT virtual MaybeHandle<Object> Delete( |
| 1620 Handle<JSObject> obj, uint32_t key, StrictMode strict_mode) FINAL { | 1621 Handle<JSObject> obj, uint32_t key, LanguageMode language_mode) FINAL { |
| 1621 Isolate* isolate = obj->GetIsolate(); | 1622 Isolate* isolate = obj->GetIsolate(); |
| 1622 Handle<FixedArray> parameter_map(FixedArray::cast(obj->elements())); | 1623 Handle<FixedArray> parameter_map(FixedArray::cast(obj->elements())); |
| 1623 Handle<Object> probe = GetParameterMapArg(obj, parameter_map, key); | 1624 Handle<Object> probe = GetParameterMapArg(obj, parameter_map, key); |
| 1624 if (!probe->IsTheHole()) { | 1625 if (!probe->IsTheHole()) { |
| 1625 // TODO(kmillikin): We could check if this was the last aliased | 1626 // TODO(kmillikin): We could check if this was the last aliased |
| 1626 // parameter, and revert to normal elements in that case. That | 1627 // parameter, and revert to normal elements in that case. That |
| 1627 // would enable GC of the context. | 1628 // would enable GC of the context. |
| 1628 parameter_map->set_the_hole(key + 2); | 1629 parameter_map->set_the_hole(key + 2); |
| 1629 } else { | 1630 } else { |
| 1630 Handle<FixedArray> arguments(FixedArray::cast(parameter_map->get(1))); | 1631 Handle<FixedArray> arguments(FixedArray::cast(parameter_map->get(1))); |
| 1631 if (arguments->IsDictionary()) { | 1632 if (arguments->IsDictionary()) { |
| 1632 return DictionaryElementsAccessor::DeleteCommon(obj, key, strict_mode); | 1633 return DictionaryElementsAccessor::DeleteCommon(obj, key, |
| 1634 language_mode); |
| 1633 } else { | 1635 } else { |
| 1634 // It's difficult to access the version of DeleteCommon that is declared | 1636 // It's difficult to access the version of DeleteCommon that is declared |
| 1635 // in the templatized super class, call the concrete implementation in | 1637 // in the templatized super class, call the concrete implementation in |
| 1636 // the class for the most generalized ElementsKind subclass. | 1638 // the class for the most generalized ElementsKind subclass. |
| 1637 return FastHoleyObjectElementsAccessor::DeleteCommon(obj, key, | 1639 return FastHoleyObjectElementsAccessor::DeleteCommon(obj, key, |
| 1638 strict_mode); | 1640 language_mode); |
| 1639 } | 1641 } |
| 1640 } | 1642 } |
| 1641 return isolate->factory()->true_value(); | 1643 return isolate->factory()->true_value(); |
| 1642 } | 1644 } |
| 1643 | 1645 |
| 1644 static void CopyElementsImpl(FixedArrayBase* from, uint32_t from_start, | 1646 static void CopyElementsImpl(FixedArrayBase* from, uint32_t from_start, |
| 1645 FixedArrayBase* to, ElementsKind from_kind, | 1647 FixedArrayBase* to, ElementsKind from_kind, |
| 1646 uint32_t to_start, int packed_size, | 1648 uint32_t to_start, int packed_size, |
| 1647 int copy_size) { | 1649 int copy_size) { |
| 1648 UNREACHABLE(); | 1650 UNREACHABLE(); |
| (...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1881 UNREACHABLE(); | 1883 UNREACHABLE(); |
| 1882 break; | 1884 break; |
| 1883 } | 1885 } |
| 1884 | 1886 |
| 1885 array->set_elements(*elms); | 1887 array->set_elements(*elms); |
| 1886 array->set_length(Smi::FromInt(number_of_elements)); | 1888 array->set_length(Smi::FromInt(number_of_elements)); |
| 1887 return array; | 1889 return array; |
| 1888 } | 1890 } |
| 1889 | 1891 |
| 1890 } } // namespace v8::internal | 1892 } } // namespace v8::internal |
| OLD | NEW |