OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 736 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
747 SetFastElementsCapacityAndLength(array, capacity, length); | 747 SetFastElementsCapacityAndLength(array, capacity, length); |
748 } | 748 } |
749 | 749 |
750 static void SetFastElementsCapacityAndLength( | 750 static void SetFastElementsCapacityAndLength( |
751 Handle<JSObject> obj, | 751 Handle<JSObject> obj, |
752 int capacity, | 752 int capacity, |
753 int length) { | 753 int length) { |
754 UNIMPLEMENTED(); | 754 UNIMPLEMENTED(); |
755 } | 755 } |
756 | 756 |
757 MUST_USE_RESULT virtual Handle<Object> Delete( | 757 MUST_USE_RESULT virtual MaybeHandle<Object> Delete( |
758 Handle<JSObject> obj, | 758 Handle<JSObject> obj, |
759 uint32_t key, | 759 uint32_t key, |
760 JSReceiver::DeleteMode mode) V8_OVERRIDE = 0; | 760 JSReceiver::DeleteMode mode) V8_OVERRIDE = 0; |
761 | 761 |
762 static void CopyElementsImpl(Handle<FixedArrayBase> from, | 762 static void CopyElementsImpl(Handle<FixedArrayBase> from, |
763 uint32_t from_start, | 763 uint32_t from_start, |
764 Handle<FixedArrayBase> to, | 764 Handle<FixedArrayBase> to, |
765 ElementsKind from_kind, | 765 ElementsKind from_kind, |
766 uint32_t to_start, | 766 uint32_t to_start, |
767 int packed_size, | 767 int packed_size, |
(...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1031 if (4 * num_used > backing_store->length()) break; | 1031 if (4 * num_used > backing_store->length()) break; |
1032 } | 1032 } |
1033 if (4 * num_used <= backing_store->length()) { | 1033 if (4 * num_used <= backing_store->length()) { |
1034 JSObject::NormalizeElements(obj); | 1034 JSObject::NormalizeElements(obj); |
1035 } | 1035 } |
1036 } | 1036 } |
1037 } | 1037 } |
1038 return isolate->factory()->true_value(); | 1038 return isolate->factory()->true_value(); |
1039 } | 1039 } |
1040 | 1040 |
1041 virtual Handle<Object> Delete( | 1041 virtual MaybeHandle<Object> Delete( |
1042 Handle<JSObject> obj, | 1042 Handle<JSObject> obj, |
1043 uint32_t key, | 1043 uint32_t key, |
1044 JSReceiver::DeleteMode mode) V8_FINAL V8_OVERRIDE { | 1044 JSReceiver::DeleteMode mode) V8_FINAL V8_OVERRIDE { |
1045 return DeleteCommon(obj, key, mode); | 1045 return DeleteCommon(obj, key, mode); |
1046 } | 1046 } |
1047 | 1047 |
1048 static bool HasElementImpl( | 1048 static bool HasElementImpl( |
1049 Handle<Object> receiver, | 1049 Handle<Object> receiver, |
1050 Handle<JSObject> holder, | 1050 Handle<JSObject> holder, |
1051 uint32_t key, | 1051 uint32_t key, |
(...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1366 | 1366 |
1367 MUST_USE_RESULT static MaybeHandle<Object> SetLengthImpl( | 1367 MUST_USE_RESULT static MaybeHandle<Object> SetLengthImpl( |
1368 Handle<JSObject> obj, | 1368 Handle<JSObject> obj, |
1369 Handle<Object> length, | 1369 Handle<Object> length, |
1370 Handle<FixedArrayBase> backing_store) { | 1370 Handle<FixedArrayBase> backing_store) { |
1371 // External arrays do not support changing their length. | 1371 // External arrays do not support changing their length. |
1372 UNREACHABLE(); | 1372 UNREACHABLE(); |
1373 return obj; | 1373 return obj; |
1374 } | 1374 } |
1375 | 1375 |
1376 MUST_USE_RESULT virtual Handle<Object> Delete( | 1376 MUST_USE_RESULT virtual MaybeHandle<Object> Delete( |
1377 Handle<JSObject> obj, | 1377 Handle<JSObject> obj, |
1378 uint32_t key, | 1378 uint32_t key, |
1379 JSReceiver::DeleteMode mode) V8_FINAL V8_OVERRIDE { | 1379 JSReceiver::DeleteMode mode) V8_FINAL V8_OVERRIDE { |
1380 // External arrays always ignore deletes. | 1380 // External arrays always ignore deletes. |
1381 return obj->GetIsolate()->factory()->true_value(); | 1381 return obj->GetIsolate()->factory()->true_value(); |
1382 } | 1382 } |
1383 | 1383 |
1384 static bool HasElementImpl(Handle<Object> receiver, | 1384 static bool HasElementImpl(Handle<Object> receiver, |
1385 Handle<JSObject> holder, | 1385 Handle<JSObject> holder, |
1386 uint32_t key, | 1386 uint32_t key, |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1481 Handle<FixedArrayBase> store, | 1481 Handle<FixedArrayBase> store, |
1482 Handle<JSArray> array, | 1482 Handle<JSArray> array, |
1483 Handle<Object> length_object, | 1483 Handle<Object> length_object, |
1484 uint32_t length) { | 1484 uint32_t length) { |
1485 CALL_HEAP_FUNCTION(array->GetIsolate(), | 1485 CALL_HEAP_FUNCTION(array->GetIsolate(), |
1486 SetLengthWithoutNormalize( | 1486 SetLengthWithoutNormalize( |
1487 *store, *array, *length_object, length), | 1487 *store, *array, *length_object, length), |
1488 Object); | 1488 Object); |
1489 } | 1489 } |
1490 | 1490 |
1491 MUST_USE_RESULT static MaybeObject* DeleteCommon( | 1491 MUST_USE_RESULT static MaybeHandle<Object> DeleteCommon( |
1492 JSObject* obj, | 1492 Handle<JSObject> obj, |
1493 uint32_t key, | 1493 uint32_t key, |
1494 JSReceiver::DeleteMode mode) { | 1494 JSReceiver::DeleteMode mode) { |
1495 Isolate* isolate = obj->GetIsolate(); | 1495 Isolate* isolate = obj->GetIsolate(); |
1496 Heap* heap = isolate->heap(); | 1496 Handle<FixedArray> backing_store(FixedArray::cast(obj->elements()), |
1497 FixedArray* backing_store = FixedArray::cast(obj->elements()); | 1497 isolate); |
1498 bool is_arguments = | 1498 bool is_arguments = |
1499 (obj->GetElementsKind() == SLOPPY_ARGUMENTS_ELEMENTS); | 1499 (obj->GetElementsKind() == SLOPPY_ARGUMENTS_ELEMENTS); |
1500 if (is_arguments) { | 1500 if (is_arguments) { |
1501 backing_store = FixedArray::cast(backing_store->get(1)); | 1501 backing_store = handle(FixedArray::cast(backing_store->get(1)), isolate); |
1502 } | 1502 } |
1503 SeededNumberDictionary* dictionary = | 1503 Handle<SeededNumberDictionary> dictionary = |
1504 SeededNumberDictionary::cast(backing_store); | 1504 Handle<SeededNumberDictionary>::cast(backing_store); |
1505 int entry = dictionary->FindEntry(key); | 1505 int entry = dictionary->FindEntry(key); |
1506 if (entry != SeededNumberDictionary::kNotFound) { | 1506 if (entry != SeededNumberDictionary::kNotFound) { |
1507 Object* result = dictionary->DeleteProperty(entry, mode); | 1507 Handle<Object> result = |
1508 if (result == heap->false_value()) { | 1508 SeededNumberDictionary::DeleteProperty(dictionary, entry, mode); |
| 1509 if (*result == *isolate->factory()->false_value()) { |
1509 if (mode == JSObject::STRICT_DELETION) { | 1510 if (mode == JSObject::STRICT_DELETION) { |
1510 // Deleting a non-configurable property in strict mode. | 1511 // Deleting a non-configurable property in strict mode. |
1511 HandleScope scope(isolate); | |
1512 Handle<Object> holder(obj, isolate); | |
1513 Handle<Object> name = isolate->factory()->NewNumberFromUint(key); | 1512 Handle<Object> name = isolate->factory()->NewNumberFromUint(key); |
1514 Handle<Object> args[2] = { name, holder }; | 1513 Handle<Object> args[2] = { name, obj }; |
1515 Handle<Object> error = | 1514 Handle<Object> error = |
1516 isolate->factory()->NewTypeError("strict_delete_property", | 1515 isolate->factory()->NewTypeError("strict_delete_property", |
1517 HandleVector(args, 2)); | 1516 HandleVector(args, 2)); |
1518 return isolate->Throw(*error); | 1517 return isolate->Throw<Object>(error); |
1519 } | 1518 } |
1520 return heap->false_value(); | 1519 return isolate->factory()->false_value(); |
1521 } | 1520 } |
1522 MaybeObject* maybe_elements = dictionary->Shrink(key); | 1521 Handle<FixedArray> new_elements = |
1523 FixedArray* new_elements = NULL; | 1522 SeededNumberDictionary::Shrink(dictionary, key); |
1524 if (!maybe_elements->To(&new_elements)) { | 1523 |
1525 return maybe_elements; | |
1526 } | |
1527 if (is_arguments) { | 1524 if (is_arguments) { |
1528 FixedArray::cast(obj->elements())->set(1, new_elements); | 1525 FixedArray::cast(obj->elements())->set(1, *new_elements); |
1529 } else { | 1526 } else { |
1530 obj->set_elements(new_elements); | 1527 obj->set_elements(*new_elements); |
1531 } | 1528 } |
1532 } | 1529 } |
1533 return heap->true_value(); | 1530 return isolate->factory()->true_value(); |
1534 } | |
1535 | |
1536 // TODO(ishell): Temporary wrapper until handlified. | |
1537 MUST_USE_RESULT static Handle<Object> DeleteCommon( | |
1538 Handle<JSObject> obj, | |
1539 uint32_t key, | |
1540 JSReceiver::DeleteMode mode) { | |
1541 CALL_HEAP_FUNCTION(obj->GetIsolate(), | |
1542 DeleteCommon(*obj, key, mode), | |
1543 Object); | |
1544 } | 1531 } |
1545 | 1532 |
1546 static void CopyElementsImpl(Handle<FixedArrayBase> from, | 1533 static void CopyElementsImpl(Handle<FixedArrayBase> from, |
1547 uint32_t from_start, | 1534 uint32_t from_start, |
1548 Handle<FixedArrayBase> to, | 1535 Handle<FixedArrayBase> to, |
1549 ElementsKind from_kind, | 1536 ElementsKind from_kind, |
1550 uint32_t to_start, | 1537 uint32_t to_start, |
1551 int packed_size, | 1538 int packed_size, |
1552 int copy_size) { | 1539 int copy_size) { |
1553 UNREACHABLE(); | 1540 UNREACHABLE(); |
1554 } | 1541 } |
1555 | 1542 |
1556 | 1543 |
1557 protected: | 1544 protected: |
1558 friend class ElementsAccessorBase<DictionaryElementsAccessor, | 1545 friend class ElementsAccessorBase<DictionaryElementsAccessor, |
1559 ElementsKindTraits<DICTIONARY_ELEMENTS> >; | 1546 ElementsKindTraits<DICTIONARY_ELEMENTS> >; |
1560 | 1547 |
1561 MUST_USE_RESULT virtual Handle<Object> Delete( | 1548 MUST_USE_RESULT virtual MaybeHandle<Object> Delete( |
1562 Handle<JSObject> obj, | 1549 Handle<JSObject> obj, |
1563 uint32_t key, | 1550 uint32_t key, |
1564 JSReceiver::DeleteMode mode) V8_FINAL V8_OVERRIDE { | 1551 JSReceiver::DeleteMode mode) V8_FINAL V8_OVERRIDE { |
1565 return DeleteCommon(obj, key, mode); | 1552 return DeleteCommon(obj, key, mode); |
1566 } | 1553 } |
1567 | 1554 |
1568 static Handle<Object> GetImpl( | 1555 static Handle<Object> GetImpl( |
1569 Handle<Object> receiver, | 1556 Handle<Object> receiver, |
1570 Handle<JSObject> obj, | 1557 Handle<JSObject> obj, |
1571 uint32_t key, | 1558 uint32_t key, |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1752 MUST_USE_RESULT static MaybeHandle<Object> SetLengthImpl( | 1739 MUST_USE_RESULT static MaybeHandle<Object> SetLengthImpl( |
1753 Handle<JSObject> obj, | 1740 Handle<JSObject> obj, |
1754 Handle<Object> length, | 1741 Handle<Object> length, |
1755 Handle<FixedArrayBase> parameter_map) { | 1742 Handle<FixedArrayBase> parameter_map) { |
1756 // TODO(mstarzinger): This was never implemented but will be used once we | 1743 // TODO(mstarzinger): This was never implemented but will be used once we |
1757 // correctly implement [[DefineOwnProperty]] on arrays. | 1744 // correctly implement [[DefineOwnProperty]] on arrays. |
1758 UNIMPLEMENTED(); | 1745 UNIMPLEMENTED(); |
1759 return obj; | 1746 return obj; |
1760 } | 1747 } |
1761 | 1748 |
1762 MUST_USE_RESULT virtual Handle<Object> Delete( | 1749 MUST_USE_RESULT virtual MaybeHandle<Object> Delete( |
1763 Handle<JSObject> obj, | 1750 Handle<JSObject> obj, |
1764 uint32_t key, | 1751 uint32_t key, |
1765 JSReceiver::DeleteMode mode) V8_FINAL V8_OVERRIDE { | 1752 JSReceiver::DeleteMode mode) V8_FINAL V8_OVERRIDE { |
1766 Isolate* isolate = obj->GetIsolate(); | 1753 Isolate* isolate = obj->GetIsolate(); |
1767 Handle<FixedArray> parameter_map(FixedArray::cast(obj->elements())); | 1754 Handle<FixedArray> parameter_map(FixedArray::cast(obj->elements())); |
1768 Handle<Object> probe = GetParameterMapArg(obj, parameter_map, key); | 1755 Handle<Object> probe = GetParameterMapArg(obj, parameter_map, key); |
1769 if (!probe->IsTheHole()) { | 1756 if (!probe->IsTheHole()) { |
1770 // TODO(kmillikin): We could check if this was the last aliased | 1757 // TODO(kmillikin): We could check if this was the last aliased |
1771 // parameter, and revert to normal elements in that case. That | 1758 // parameter, and revert to normal elements in that case. That |
1772 // would enable GC of the context. | 1759 // would enable GC of the context. |
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2020 UNREACHABLE(); | 2007 UNREACHABLE(); |
2021 break; | 2008 break; |
2022 } | 2009 } |
2023 | 2010 |
2024 array->set_elements(*elms); | 2011 array->set_elements(*elms); |
2025 array->set_length(Smi::FromInt(number_of_elements)); | 2012 array->set_length(Smi::FromInt(number_of_elements)); |
2026 return array; | 2013 return array; |
2027 } | 2014 } |
2028 | 2015 |
2029 } } // namespace v8::internal | 2016 } } // namespace v8::internal |
OLD | NEW |