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 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1469 } | 1469 } |
1470 } | 1470 } |
1471 } | 1471 } |
1472 | 1472 |
1473 // Update the number of elements. | 1473 // Update the number of elements. |
1474 dict->ElementsRemoved(removed_entries); | 1474 dict->ElementsRemoved(removed_entries); |
1475 } | 1475 } |
1476 return length_object; | 1476 return length_object; |
1477 } | 1477 } |
1478 | 1478 |
1479 MUST_USE_RESULT static MaybeObject* DeleteCommon( | 1479 MUST_USE_RESULT static MaybeHandle<Object> DeleteCommon( |
1480 JSObject* obj, | 1480 Handle<JSObject> obj, |
1481 uint32_t key, | 1481 uint32_t key, |
1482 JSReceiver::DeleteMode mode) { | 1482 JSReceiver::DeleteMode mode) { |
1483 Isolate* isolate = obj->GetIsolate(); | 1483 Isolate* isolate = obj->GetIsolate(); |
1484 Heap* heap = isolate->heap(); | 1484 Handle<FixedArray> backing_store(FixedArray::cast(obj->elements()), |
1485 FixedArray* backing_store = FixedArray::cast(obj->elements()); | 1485 isolate); |
1486 bool is_arguments = | 1486 bool is_arguments = |
1487 (obj->GetElementsKind() == SLOPPY_ARGUMENTS_ELEMENTS); | 1487 (obj->GetElementsKind() == SLOPPY_ARGUMENTS_ELEMENTS); |
1488 if (is_arguments) { | 1488 if (is_arguments) { |
1489 backing_store = FixedArray::cast(backing_store->get(1)); | 1489 backing_store = handle(FixedArray::cast(backing_store->get(1)), isolate); |
1490 } | 1490 } |
1491 SeededNumberDictionary* dictionary = | 1491 Handle<SeededNumberDictionary> dictionary = |
1492 SeededNumberDictionary::cast(backing_store); | 1492 Handle<SeededNumberDictionary>::cast(backing_store); |
1493 int entry = dictionary->FindEntry(key); | 1493 int entry = dictionary->FindEntry(key); |
1494 if (entry != SeededNumberDictionary::kNotFound) { | 1494 if (entry != SeededNumberDictionary::kNotFound) { |
1495 Object* result = dictionary->DeleteProperty(entry, mode); | 1495 Handle<Object> result = |
1496 if (result == heap->false_value()) { | 1496 SeededNumberDictionary::DeleteProperty(dictionary, entry, mode); |
| 1497 if (*result == *isolate->factory()->false_value()) { |
1497 if (mode == JSObject::STRICT_DELETION) { | 1498 if (mode == JSObject::STRICT_DELETION) { |
1498 // Deleting a non-configurable property in strict mode. | 1499 // Deleting a non-configurable property in strict mode. |
1499 HandleScope scope(isolate); | |
1500 Handle<Object> holder(obj, isolate); | |
1501 Handle<Object> name = isolate->factory()->NewNumberFromUint(key); | 1500 Handle<Object> name = isolate->factory()->NewNumberFromUint(key); |
1502 Handle<Object> args[2] = { name, holder }; | 1501 Handle<Object> args[2] = { name, obj }; |
1503 Handle<Object> error = | 1502 Handle<Object> error = |
1504 isolate->factory()->NewTypeError("strict_delete_property", | 1503 isolate->factory()->NewTypeError("strict_delete_property", |
1505 HandleVector(args, 2)); | 1504 HandleVector(args, 2)); |
1506 return isolate->Throw(*error); | 1505 return isolate->Throw<Object>(error); |
1507 } | 1506 } |
1508 return heap->false_value(); | 1507 return isolate->factory()->false_value(); |
1509 } | 1508 } |
1510 MaybeObject* maybe_elements = dictionary->Shrink(key); | 1509 Handle<FixedArray> new_elements = |
1511 FixedArray* new_elements = NULL; | 1510 SeededNumberDictionary::Shrink(dictionary, key); |
1512 if (!maybe_elements->To(&new_elements)) { | 1511 |
1513 return maybe_elements; | |
1514 } | |
1515 if (is_arguments) { | 1512 if (is_arguments) { |
1516 FixedArray::cast(obj->elements())->set(1, new_elements); | 1513 FixedArray::cast(obj->elements())->set(1, *new_elements); |
1517 } else { | 1514 } else { |
1518 obj->set_elements(new_elements); | 1515 obj->set_elements(*new_elements); |
1519 } | 1516 } |
1520 } | 1517 } |
1521 return heap->true_value(); | 1518 return isolate->factory()->true_value(); |
1522 } | |
1523 | |
1524 // TODO(ishell): Temporary wrapper until handlified. | |
1525 MUST_USE_RESULT static Handle<Object> DeleteCommon( | |
1526 Handle<JSObject> obj, | |
1527 uint32_t key, | |
1528 JSReceiver::DeleteMode mode) { | |
1529 CALL_HEAP_FUNCTION(obj->GetIsolate(), | |
1530 DeleteCommon(*obj, key, mode), | |
1531 Object); | |
1532 } | 1519 } |
1533 | 1520 |
1534 static void CopyElementsImpl(Handle<FixedArrayBase> from, | 1521 static void CopyElementsImpl(Handle<FixedArrayBase> from, |
1535 uint32_t from_start, | 1522 uint32_t from_start, |
1536 Handle<FixedArrayBase> to, | 1523 Handle<FixedArrayBase> to, |
1537 ElementsKind from_kind, | 1524 ElementsKind from_kind, |
1538 uint32_t to_start, | 1525 uint32_t to_start, |
1539 int packed_size, | 1526 int packed_size, |
1540 int copy_size) { | 1527 int copy_size) { |
1541 UNREACHABLE(); | 1528 UNREACHABLE(); |
1542 } | 1529 } |
1543 | 1530 |
1544 | 1531 |
1545 protected: | 1532 protected: |
1546 friend class ElementsAccessorBase<DictionaryElementsAccessor, | 1533 friend class ElementsAccessorBase<DictionaryElementsAccessor, |
1547 ElementsKindTraits<DICTIONARY_ELEMENTS> >; | 1534 ElementsKindTraits<DICTIONARY_ELEMENTS> >; |
1548 | 1535 |
1549 MUST_USE_RESULT virtual Handle<Object> Delete( | 1536 MUST_USE_RESULT virtual MaybeHandle<Object> Delete( |
1550 Handle<JSObject> obj, | 1537 Handle<JSObject> obj, |
1551 uint32_t key, | 1538 uint32_t key, |
1552 JSReceiver::DeleteMode mode) V8_FINAL V8_OVERRIDE { | 1539 JSReceiver::DeleteMode mode) V8_FINAL V8_OVERRIDE { |
1553 return DeleteCommon(obj, key, mode); | 1540 return DeleteCommon(obj, key, mode); |
1554 } | 1541 } |
1555 | 1542 |
1556 static Handle<Object> GetImpl( | 1543 static Handle<Object> GetImpl( |
1557 Handle<Object> receiver, | 1544 Handle<Object> receiver, |
1558 Handle<JSObject> obj, | 1545 Handle<JSObject> obj, |
1559 uint32_t key, | 1546 uint32_t key, |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1740 MUST_USE_RESULT static MaybeHandle<Object> SetLengthImpl( | 1727 MUST_USE_RESULT static MaybeHandle<Object> SetLengthImpl( |
1741 Handle<JSObject> obj, | 1728 Handle<JSObject> obj, |
1742 Handle<Object> length, | 1729 Handle<Object> length, |
1743 Handle<FixedArrayBase> parameter_map) { | 1730 Handle<FixedArrayBase> parameter_map) { |
1744 // TODO(mstarzinger): This was never implemented but will be used once we | 1731 // TODO(mstarzinger): This was never implemented but will be used once we |
1745 // correctly implement [[DefineOwnProperty]] on arrays. | 1732 // correctly implement [[DefineOwnProperty]] on arrays. |
1746 UNIMPLEMENTED(); | 1733 UNIMPLEMENTED(); |
1747 return obj; | 1734 return obj; |
1748 } | 1735 } |
1749 | 1736 |
1750 MUST_USE_RESULT virtual Handle<Object> Delete( | 1737 MUST_USE_RESULT virtual MaybeHandle<Object> Delete( |
1751 Handle<JSObject> obj, | 1738 Handle<JSObject> obj, |
1752 uint32_t key, | 1739 uint32_t key, |
1753 JSReceiver::DeleteMode mode) V8_FINAL V8_OVERRIDE { | 1740 JSReceiver::DeleteMode mode) V8_FINAL V8_OVERRIDE { |
1754 Isolate* isolate = obj->GetIsolate(); | 1741 Isolate* isolate = obj->GetIsolate(); |
1755 Handle<FixedArray> parameter_map(FixedArray::cast(obj->elements())); | 1742 Handle<FixedArray> parameter_map(FixedArray::cast(obj->elements())); |
1756 Handle<Object> probe = GetParameterMapArg(obj, parameter_map, key); | 1743 Handle<Object> probe = GetParameterMapArg(obj, parameter_map, key); |
1757 if (!probe->IsTheHole()) { | 1744 if (!probe->IsTheHole()) { |
1758 // TODO(kmillikin): We could check if this was the last aliased | 1745 // TODO(kmillikin): We could check if this was the last aliased |
1759 // parameter, and revert to normal elements in that case. That | 1746 // parameter, and revert to normal elements in that case. That |
1760 // would enable GC of the context. | 1747 // would enable GC of the context. |
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2008 UNREACHABLE(); | 1995 UNREACHABLE(); |
2009 break; | 1996 break; |
2010 } | 1997 } |
2011 | 1998 |
2012 array->set_elements(*elms); | 1999 array->set_elements(*elms); |
2013 array->set_length(Smi::FromInt(number_of_elements)); | 2000 array->set_length(Smi::FromInt(number_of_elements)); |
2014 return array; | 2001 return array; |
2015 } | 2002 } |
2016 | 2003 |
2017 } } // namespace v8::internal | 2004 } } // namespace v8::internal |
OLD | NEW |