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/builtins.h" | 5 #include "src/builtins.h" |
6 | 6 |
7 #include "src/api.h" | 7 #include "src/api.h" |
8 #include "src/api-natives.h" | 8 #include "src/api-natives.h" |
9 #include "src/arguments.h" | 9 #include "src/arguments.h" |
10 #include "src/base/once.h" | 10 #include "src/base/once.h" |
(...skipping 817 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
828 SeededNumberDictionary::cast(array->elements())); | 828 SeededNumberDictionary::cast(array->elements())); |
829 int capacity = dictionary->Capacity(); | 829 int capacity = dictionary->Capacity(); |
830 for (int i = 0; i < capacity; i++) { | 830 for (int i = 0; i < capacity; i++) { |
831 Handle<Object> key(dictionary->KeyAt(i), array->GetIsolate()); | 831 Handle<Object> key(dictionary->KeyAt(i), array->GetIsolate()); |
832 if (dictionary->IsKey(*key)) { | 832 if (dictionary->IsKey(*key)) { |
833 element_count++; | 833 element_count++; |
834 } | 834 } |
835 } | 835 } |
836 break; | 836 break; |
837 } | 837 } |
838 case FAST_SLOPPY_ARGUMENTS_ELEMENTS: | |
839 case SLOW_SLOPPY_ARGUMENTS_ELEMENTS: | |
840 #define TYPED_ARRAY_CASE(Type, type, TYPE, ctype, size) case TYPE##_ELEMENTS: | 838 #define TYPED_ARRAY_CASE(Type, type, TYPE, ctype, size) case TYPE##_ELEMENTS: |
841 | 839 |
842 TYPED_ARRAYS(TYPED_ARRAY_CASE) | 840 TYPED_ARRAYS(TYPED_ARRAY_CASE) |
843 #undef TYPED_ARRAY_CASE | 841 #undef TYPED_ARRAY_CASE |
844 // External arrays are always dense. | 842 // External arrays are always dense. |
845 return length; | 843 return length; |
| 844 case NO_ELEMENTS: |
| 845 return 0; |
| 846 case FAST_SLOPPY_ARGUMENTS_ELEMENTS: |
| 847 case SLOW_SLOPPY_ARGUMENTS_ELEMENTS: |
| 848 case FAST_STRING_WRAPPER_ELEMENTS: |
| 849 case SLOW_STRING_WRAPPER_ELEMENTS: |
| 850 UNREACHABLE(); |
| 851 return 0; |
846 } | 852 } |
847 // As an estimate, we assume that the prototype doesn't contain any | 853 // As an estimate, we assume that the prototype doesn't contain any |
848 // inherited elements. | 854 // inherited elements. |
849 return element_count; | 855 return element_count; |
850 } | 856 } |
851 | 857 |
852 | 858 |
853 template <class ExternalArrayClass, class ElementType> | 859 template <class ExternalArrayClass, class ElementType> |
854 bool IterateTypedArrayElements(Isolate* isolate, Handle<JSObject> receiver, | 860 bool IterateTypedArrayElements(Isolate* isolate, Handle<JSObject> receiver, |
855 bool elements_are_ints, | 861 bool elements_are_ints, |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
976 case FAST_SLOPPY_ARGUMENTS_ELEMENTS: | 982 case FAST_SLOPPY_ARGUMENTS_ELEMENTS: |
977 case SLOW_SLOPPY_ARGUMENTS_ELEMENTS: { | 983 case SLOW_SLOPPY_ARGUMENTS_ELEMENTS: { |
978 ElementsAccessor* accessor = object->GetElementsAccessor(); | 984 ElementsAccessor* accessor = object->GetElementsAccessor(); |
979 for (uint32_t i = 0; i < range; i++) { | 985 for (uint32_t i = 0; i < range; i++) { |
980 if (accessor->HasElement(object, i)) { | 986 if (accessor->HasElement(object, i)) { |
981 indices->Add(i); | 987 indices->Add(i); |
982 } | 988 } |
983 } | 989 } |
984 break; | 990 break; |
985 } | 991 } |
| 992 case FAST_STRING_WRAPPER_ELEMENTS: |
| 993 case SLOW_STRING_WRAPPER_ELEMENTS: { |
| 994 DCHECK(object->IsJSValue()); |
| 995 Handle<JSValue> js_value = Handle<JSValue>::cast(object); |
| 996 DCHECK(js_value->value()->IsString()); |
| 997 Handle<String> string(String::cast(js_value->value()), isolate); |
| 998 uint32_t length = static_cast<uint32_t>(string->length()); |
| 999 uint32_t i = 0; |
| 1000 uint32_t limit = Min(length, range); |
| 1001 for (; i < limit; i++) { |
| 1002 indices->Add(i); |
| 1003 } |
| 1004 ElementsAccessor* accessor = object->GetElementsAccessor(); |
| 1005 for (; i < range; i++) { |
| 1006 if (accessor->HasElement(object, i)) { |
| 1007 indices->Add(i); |
| 1008 } |
| 1009 } |
| 1010 break; |
| 1011 } |
| 1012 case NO_ELEMENTS: |
| 1013 break; |
986 } | 1014 } |
987 | 1015 |
988 PrototypeIterator iter(isolate, object); | 1016 PrototypeIterator iter(isolate, object); |
989 if (!iter.IsAtEnd()) { | 1017 if (!iter.IsAtEnd()) { |
990 // The prototype will usually have no inherited element indices, | 1018 // The prototype will usually have no inherited element indices, |
991 // but we have to check. | 1019 // but we have to check. |
992 CollectElementIndices(PrototypeIterator::GetCurrent<JSObject>(iter), range, | 1020 CollectElementIndices(PrototypeIterator::GetCurrent<JSObject>(iter), range, |
993 indices); | 1021 indices); |
994 } | 1022 } |
995 } | 1023 } |
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1211 case SLOW_SLOPPY_ARGUMENTS_ELEMENTS: { | 1239 case SLOW_SLOPPY_ARGUMENTS_ELEMENTS: { |
1212 for (uint32_t index = 0; index < length; index++) { | 1240 for (uint32_t index = 0; index < length; index++) { |
1213 HandleScope loop_scope(isolate); | 1241 HandleScope loop_scope(isolate); |
1214 Handle<Object> element; | 1242 Handle<Object> element; |
1215 ASSIGN_RETURN_ON_EXCEPTION_VALUE( | 1243 ASSIGN_RETURN_ON_EXCEPTION_VALUE( |
1216 isolate, element, Object::GetElement(isolate, array, index), false); | 1244 isolate, element, Object::GetElement(isolate, array, index), false); |
1217 if (!visitor->visit(index, element)) return false; | 1245 if (!visitor->visit(index, element)) return false; |
1218 } | 1246 } |
1219 break; | 1247 break; |
1220 } | 1248 } |
| 1249 case NO_ELEMENTS: |
| 1250 break; |
| 1251 case FAST_STRING_WRAPPER_ELEMENTS: |
| 1252 case SLOW_STRING_WRAPPER_ELEMENTS: |
| 1253 // |array| is guaranteed to be an array or typed array. |
| 1254 UNREACHABLE(); |
| 1255 break; |
1221 } | 1256 } |
1222 visitor->increase_index_offset(length); | 1257 visitor->increase_index_offset(length); |
1223 return true; | 1258 return true; |
1224 } | 1259 } |
1225 | 1260 |
1226 | 1261 |
1227 bool HasConcatSpreadableModifier(Isolate* isolate, Handle<JSArray> obj) { | 1262 bool HasConcatSpreadableModifier(Isolate* isolate, Handle<JSArray> obj) { |
1228 DCHECK(isolate->IsFastArrayConstructorPrototypeChainIntact()); | 1263 DCHECK(isolate->IsFastArrayConstructorPrototypeChainIntact()); |
1229 if (!FLAG_harmony_concat_spreadable) return false; | 1264 if (!FLAG_harmony_concat_spreadable) return false; |
1230 Handle<Symbol> key(isolate->factory()->is_concat_spreadable_symbol()); | 1265 Handle<Symbol> key(isolate->factory()->is_concat_spreadable_symbol()); |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1360 } | 1395 } |
1361 int32_t int_value = Smi::cast(element)->value(); | 1396 int32_t int_value = Smi::cast(element)->value(); |
1362 double_storage->set(j, int_value); | 1397 double_storage->set(j, int_value); |
1363 j++; | 1398 j++; |
1364 } | 1399 } |
1365 break; | 1400 break; |
1366 } | 1401 } |
1367 case FAST_HOLEY_ELEMENTS: | 1402 case FAST_HOLEY_ELEMENTS: |
1368 case FAST_ELEMENTS: | 1403 case FAST_ELEMENTS: |
1369 case DICTIONARY_ELEMENTS: | 1404 case DICTIONARY_ELEMENTS: |
| 1405 case NO_ELEMENTS: |
1370 DCHECK_EQ(0u, length); | 1406 DCHECK_EQ(0u, length); |
1371 break; | 1407 break; |
1372 default: | 1408 default: |
1373 UNREACHABLE(); | 1409 UNREACHABLE(); |
1374 } | 1410 } |
1375 } | 1411 } |
1376 if (failure) break; | 1412 if (failure) break; |
1377 } | 1413 } |
1378 } | 1414 } |
1379 if (!failure) { | 1415 if (!failure) { |
(...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1721 Handle<JSReceiver> receiver; | 1757 Handle<JSReceiver> receiver; |
1722 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, receiver, | 1758 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, receiver, |
1723 Object::ToObject(isolate, object)); | 1759 Object::ToObject(isolate, object)); |
1724 Handle<FixedArray> keys; | 1760 Handle<FixedArray> keys; |
1725 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 1761 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
1726 isolate, keys, | 1762 isolate, keys, |
1727 JSReceiver::GetKeys(receiver, JSReceiver::OWN_ONLY, ENUMERABLE_STRINGS, | 1763 JSReceiver::GetKeys(receiver, JSReceiver::OWN_ONLY, ENUMERABLE_STRINGS, |
1728 CONVERT_TO_STRING)); | 1764 CONVERT_TO_STRING)); |
1729 | 1765 |
1730 for (int i = 0; i < keys->length(); ++i) { | 1766 for (int i = 0; i < keys->length(); ++i) { |
1731 auto key = Handle<Name>::cast(FixedArray::get(keys, i)); | 1767 auto key = Handle<Name>::cast(FixedArray::get(*keys, i, isolate)); |
1732 Handle<Object> value; | 1768 Handle<Object> value; |
1733 | 1769 |
1734 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 1770 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
1735 isolate, value, Object::GetPropertyOrElement(receiver, key, STRICT)); | 1771 isolate, value, Object::GetPropertyOrElement(receiver, key, STRICT)); |
1736 | 1772 |
1737 keys->set(i, *value); | 1773 keys->set(i, *value); |
1738 } | 1774 } |
1739 | 1775 |
1740 return *isolate->factory()->NewJSArrayWithElements(keys); | 1776 return *isolate->factory()->NewJSArrayWithElements(keys); |
1741 } | 1777 } |
1742 | 1778 |
1743 | 1779 |
1744 BUILTIN(ObjectEntries) { | 1780 BUILTIN(ObjectEntries) { |
1745 HandleScope scope(isolate); | 1781 HandleScope scope(isolate); |
1746 Handle<Object> object = args.atOrUndefined(isolate, 1); | 1782 Handle<Object> object = args.atOrUndefined(isolate, 1); |
1747 Handle<JSReceiver> receiver; | 1783 Handle<JSReceiver> receiver; |
1748 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, receiver, | 1784 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, receiver, |
1749 Object::ToObject(isolate, object)); | 1785 Object::ToObject(isolate, object)); |
1750 Handle<FixedArray> keys; | 1786 Handle<FixedArray> keys; |
1751 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 1787 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
1752 isolate, keys, | 1788 isolate, keys, |
1753 JSReceiver::GetKeys(receiver, JSReceiver::OWN_ONLY, ENUMERABLE_STRINGS, | 1789 JSReceiver::GetKeys(receiver, JSReceiver::OWN_ONLY, ENUMERABLE_STRINGS, |
1754 CONVERT_TO_STRING)); | 1790 CONVERT_TO_STRING)); |
1755 | 1791 |
1756 for (int i = 0; i < keys->length(); ++i) { | 1792 for (int i = 0; i < keys->length(); ++i) { |
1757 auto key = Handle<Name>::cast(FixedArray::get(keys, i)); | 1793 auto key = Handle<Name>::cast(FixedArray::get(*keys, i, isolate)); |
1758 Handle<Object> value; | 1794 Handle<Object> value; |
1759 | 1795 |
1760 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 1796 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
1761 isolate, value, Object::GetPropertyOrElement(receiver, key, STRICT)); | 1797 isolate, value, Object::GetPropertyOrElement(receiver, key, STRICT)); |
1762 | 1798 |
1763 auto entry_storage = isolate->factory()->NewUninitializedFixedArray(2); | 1799 auto entry_storage = isolate->factory()->NewUninitializedFixedArray(2); |
1764 entry_storage->set(0, *key); | 1800 entry_storage->set(0, *key); |
1765 entry_storage->set(1, *value); | 1801 entry_storage->set(1, *value); |
1766 auto entry = isolate->factory()->NewJSArrayWithElements(entry_storage); | 1802 auto entry = isolate->factory()->NewJSArrayWithElements(entry_storage); |
1767 keys->set(i, *entry); | 1803 keys->set(i, *entry); |
(...skipping 2387 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4155 BUILTIN_LIST_C(DEFINE_BUILTIN_ACCESSOR_C) | 4191 BUILTIN_LIST_C(DEFINE_BUILTIN_ACCESSOR_C) |
4156 BUILTIN_LIST_A(DEFINE_BUILTIN_ACCESSOR_A) | 4192 BUILTIN_LIST_A(DEFINE_BUILTIN_ACCESSOR_A) |
4157 BUILTIN_LIST_H(DEFINE_BUILTIN_ACCESSOR_H) | 4193 BUILTIN_LIST_H(DEFINE_BUILTIN_ACCESSOR_H) |
4158 BUILTIN_LIST_DEBUG_A(DEFINE_BUILTIN_ACCESSOR_A) | 4194 BUILTIN_LIST_DEBUG_A(DEFINE_BUILTIN_ACCESSOR_A) |
4159 #undef DEFINE_BUILTIN_ACCESSOR_C | 4195 #undef DEFINE_BUILTIN_ACCESSOR_C |
4160 #undef DEFINE_BUILTIN_ACCESSOR_A | 4196 #undef DEFINE_BUILTIN_ACCESSOR_A |
4161 | 4197 |
4162 | 4198 |
4163 } // namespace internal | 4199 } // namespace internal |
4164 } // namespace v8 | 4200 } // namespace v8 |
OLD | NEW |