| 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 | 
|---|