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