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/elements.h" | 5 #include "src/elements.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/factory.h" | 9 #include "src/factory.h" |
10 #include "src/isolate-inl.h" | 10 #include "src/isolate-inl.h" |
(...skipping 586 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
597 bool HasElement(Handle<JSObject> holder, uint32_t index, | 597 bool HasElement(Handle<JSObject> holder, uint32_t index, |
598 Handle<FixedArrayBase> backing_store, | 598 Handle<FixedArrayBase> backing_store, |
599 PropertyFilter filter) final { | 599 PropertyFilter filter) final { |
600 return Subclass::HasElementImpl(holder->GetIsolate(), holder, index, | 600 return Subclass::HasElementImpl(holder->GetIsolate(), holder, index, |
601 backing_store, filter); | 601 backing_store, filter); |
602 } | 602 } |
603 | 603 |
604 static bool HasElementImpl(Isolate* isolate, Handle<JSObject> holder, | 604 static bool HasElementImpl(Isolate* isolate, Handle<JSObject> holder, |
605 uint32_t index, | 605 uint32_t index, |
606 Handle<FixedArrayBase> backing_store, | 606 Handle<FixedArrayBase> backing_store, |
607 PropertyFilter filter) { | 607 PropertyFilter filter = ALL_PROPERTIES) { |
608 return Subclass::GetEntryForIndexImpl(isolate, *holder, *backing_store, | 608 return Subclass::GetEntryForIndexImpl(isolate, *holder, *backing_store, |
609 index, filter) != kMaxUInt32; | 609 index, filter) != kMaxUInt32; |
610 } | 610 } |
611 | 611 |
612 bool HasAccessors(JSObject* holder) final { | 612 bool HasAccessors(JSObject* holder) final { |
613 return Subclass::HasAccessorsImpl(holder, holder->elements()); | 613 return Subclass::HasAccessorsImpl(holder, holder->elements()); |
614 } | 614 } |
615 | 615 |
616 static bool HasAccessorsImpl(JSObject* holder, | 616 static bool HasAccessorsImpl(JSObject* holder, |
617 FixedArrayBase* backing_store) { | 617 FixedArrayBase* backing_store) { |
618 return false; | 618 return false; |
619 } | 619 } |
620 | 620 |
621 Handle<Object> Get(Handle<JSObject> holder, uint32_t entry) final { | 621 Handle<Object> Get(Handle<JSObject> holder, uint32_t entry) final { |
622 return Subclass::GetImpl(holder, entry); | 622 return Subclass::GetInternalImpl(holder, entry); |
623 } | 623 } |
624 | 624 |
625 static Handle<Object> GetImpl(Handle<JSObject> holder, uint32_t entry) { | 625 static Handle<Object> GetInternalImpl(Handle<JSObject> holder, |
626 return Subclass::GetImpl(holder->elements(), entry); | 626 uint32_t entry) { |
| 627 return Subclass::GetImpl(holder->GetIsolate(), holder->elements(), entry); |
627 } | 628 } |
628 | 629 |
629 static Handle<Object> GetImpl(FixedArrayBase* backing_store, uint32_t entry) { | 630 static Handle<Object> GetImpl(Isolate* isolate, FixedArrayBase* backing_store, |
630 Isolate* isolate = backing_store->GetIsolate(); | 631 uint32_t entry) { |
631 uint32_t index = GetIndexForEntryImpl(backing_store, entry); | 632 uint32_t index = GetIndexForEntryImpl(backing_store, entry); |
632 return handle(BackingStore::cast(backing_store)->get(index), isolate); | 633 return handle(BackingStore::cast(backing_store)->get(index), isolate); |
633 } | 634 } |
634 | 635 |
635 void Set(Handle<JSObject> holder, uint32_t entry, Object* value) final { | 636 void Set(Handle<JSObject> holder, uint32_t entry, Object* value) final { |
636 Subclass::SetImpl(holder, entry, value); | 637 Subclass::SetImpl(holder, entry, value); |
637 } | 638 } |
638 | 639 |
639 void Reconfigure(Handle<JSObject> object, Handle<FixedArrayBase> store, | 640 void Reconfigure(Handle<JSObject> object, Handle<FixedArrayBase> store, |
640 uint32_t entry, Handle<Object> value, | 641 uint32_t entry, Handle<Object> value, |
(...skipping 384 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1025 uint32_t index; | 1026 uint32_t index; |
1026 if (!key->ToUint32(&index)) continue; | 1027 if (!key->ToUint32(&index)) continue; |
1027 | 1028 |
1028 uint32_t entry = Subclass::GetEntryForIndexImpl( | 1029 uint32_t entry = Subclass::GetEntryForIndexImpl( |
1029 isolate, *object, object->elements(), index, filter); | 1030 isolate, *object, object->elements(), index, filter); |
1030 if (entry == kMaxUInt32) continue; | 1031 if (entry == kMaxUInt32) continue; |
1031 | 1032 |
1032 PropertyDetails details = Subclass::GetDetailsImpl(*object, entry); | 1033 PropertyDetails details = Subclass::GetDetailsImpl(*object, entry); |
1033 | 1034 |
1034 if (details.kind() == kData) { | 1035 if (details.kind() == kData) { |
1035 value = Subclass::GetImpl(object, entry); | 1036 value = Subclass::GetImpl(isolate, object->elements(), entry); |
1036 } else { | 1037 } else { |
1037 LookupIterator it(isolate, object, index, LookupIterator::OWN); | 1038 LookupIterator it(isolate, object, index, LookupIterator::OWN); |
1038 ASSIGN_RETURN_ON_EXCEPTION_VALUE( | 1039 ASSIGN_RETURN_ON_EXCEPTION_VALUE( |
1039 isolate, value, Object::GetProperty(&it), Nothing<bool>()); | 1040 isolate, value, Object::GetProperty(&it), Nothing<bool>()); |
1040 } | 1041 } |
1041 if (get_entries) { | 1042 if (get_entries) { |
1042 value = MakeEntryPair(isolate, index, value); | 1043 value = MakeEntryPair(isolate, index, value); |
1043 } | 1044 } |
1044 values_or_entries->set(count++, *value); | 1045 values_or_entries->set(count++, *value); |
1045 } | 1046 } |
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1250 } | 1251 } |
1251 | 1252 |
1252 static PropertyDetails GetDetailsImpl(JSObject* holder, uint32_t entry) { | 1253 static PropertyDetails GetDetailsImpl(JSObject* holder, uint32_t entry) { |
1253 return PropertyDetails(NONE, DATA, 0, PropertyCellType::kNoCell); | 1254 return PropertyDetails(NONE, DATA, 0, PropertyCellType::kNoCell); |
1254 } | 1255 } |
1255 | 1256 |
1256 PropertyDetails GetDetails(JSObject* holder, uint32_t entry) final { | 1257 PropertyDetails GetDetails(JSObject* holder, uint32_t entry) final { |
1257 return Subclass::GetDetailsImpl(holder, entry); | 1258 return Subclass::GetDetailsImpl(holder, entry); |
1258 } | 1259 } |
1259 | 1260 |
| 1261 Handle<FixedArray> CreateListFromArray(Isolate* isolate, |
| 1262 Handle<JSArray> array) final { |
| 1263 return Subclass::CreateListFromArrayImpl(isolate, array); |
| 1264 }; |
| 1265 |
| 1266 static Handle<FixedArray> CreateListFromArrayImpl(Isolate* isolate, |
| 1267 Handle<JSArray> array) { |
| 1268 UNREACHABLE(); |
| 1269 return Handle<FixedArray>(); |
| 1270 } |
| 1271 |
1260 private: | 1272 private: |
1261 DISALLOW_COPY_AND_ASSIGN(ElementsAccessorBase); | 1273 DISALLOW_COPY_AND_ASSIGN(ElementsAccessorBase); |
1262 }; | 1274 }; |
1263 | 1275 |
1264 | 1276 |
1265 class DictionaryElementsAccessor | 1277 class DictionaryElementsAccessor |
1266 : public ElementsAccessorBase<DictionaryElementsAccessor, | 1278 : public ElementsAccessorBase<DictionaryElementsAccessor, |
1267 ElementsKindTraits<DICTIONARY_ELEMENTS> > { | 1279 ElementsKindTraits<DICTIONARY_ELEMENTS> > { |
1268 public: | 1280 public: |
1269 explicit DictionaryElementsAccessor(const char* name) | 1281 explicit DictionaryElementsAccessor(const char* name) |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1375 if (details.type() == ACCESSOR_CONSTANT) return true; | 1387 if (details.type() == ACCESSOR_CONSTANT) return true; |
1376 } | 1388 } |
1377 return false; | 1389 return false; |
1378 } | 1390 } |
1379 | 1391 |
1380 static Object* GetRaw(FixedArrayBase* store, uint32_t entry) { | 1392 static Object* GetRaw(FixedArrayBase* store, uint32_t entry) { |
1381 SeededNumberDictionary* backing_store = SeededNumberDictionary::cast(store); | 1393 SeededNumberDictionary* backing_store = SeededNumberDictionary::cast(store); |
1382 return backing_store->ValueAt(entry); | 1394 return backing_store->ValueAt(entry); |
1383 } | 1395 } |
1384 | 1396 |
1385 static Handle<Object> GetImpl(Handle<JSObject> holder, uint32_t entry) { | 1397 static Handle<Object> GetImpl(Isolate* isolate, FixedArrayBase* backing_store, |
1386 return GetImpl(holder->elements(), entry); | 1398 uint32_t entry) { |
1387 } | 1399 return handle(GetRaw(backing_store, entry), isolate); |
1388 | |
1389 static Handle<Object> GetImpl(FixedArrayBase* backing_store, uint32_t entry) { | |
1390 return handle(GetRaw(backing_store, entry), backing_store->GetIsolate()); | |
1391 } | 1400 } |
1392 | 1401 |
1393 static inline void SetImpl(Handle<JSObject> holder, uint32_t entry, | 1402 static inline void SetImpl(Handle<JSObject> holder, uint32_t entry, |
1394 Object* value) { | 1403 Object* value) { |
1395 SetImpl(holder->elements(), entry, value); | 1404 SetImpl(holder->elements(), entry, value); |
1396 } | 1405 } |
1397 | 1406 |
1398 static inline void SetImpl(FixedArrayBase* backing_store, uint32_t entry, | 1407 static inline void SetImpl(FixedArrayBase* backing_store, uint32_t entry, |
1399 Object* value) { | 1408 Object* value) { |
1400 SeededNumberDictionary::cast(backing_store)->ValueAtPut(entry, value); | 1409 SeededNumberDictionary::cast(backing_store)->ValueAtPut(entry, value); |
(...skipping 362 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1763 Handle<SeededNumberDictionary> dictionary = | 1772 Handle<SeededNumberDictionary> dictionary = |
1764 SeededNumberDictionary::New(isolate, capacity); | 1773 SeededNumberDictionary::New(isolate, capacity); |
1765 | 1774 |
1766 PropertyDetails details = PropertyDetails::Empty(); | 1775 PropertyDetails details = PropertyDetails::Empty(); |
1767 bool used_as_prototype = object->map()->is_prototype_map(); | 1776 bool used_as_prototype = object->map()->is_prototype_map(); |
1768 int j = 0; | 1777 int j = 0; |
1769 for (int i = 0; j < capacity; i++) { | 1778 for (int i = 0; j < capacity; i++) { |
1770 if (IsHoleyElementsKind(kind)) { | 1779 if (IsHoleyElementsKind(kind)) { |
1771 if (BackingStore::cast(*store)->is_the_hole(isolate, i)) continue; | 1780 if (BackingStore::cast(*store)->is_the_hole(isolate, i)) continue; |
1772 } | 1781 } |
1773 Handle<Object> value = Subclass::GetImpl(*store, i); | 1782 Handle<Object> value = Subclass::GetImpl(isolate, *store, i); |
1774 dictionary = SeededNumberDictionary::AddNumberEntry( | 1783 dictionary = SeededNumberDictionary::AddNumberEntry( |
1775 dictionary, i, value, details, used_as_prototype); | 1784 dictionary, i, value, details, used_as_prototype); |
1776 j++; | 1785 j++; |
1777 } | 1786 } |
1778 return dictionary; | 1787 return dictionary; |
1779 } | 1788 } |
1780 | 1789 |
1781 static void DeleteAtEnd(Handle<JSObject> obj, | 1790 static void DeleteAtEnd(Handle<JSObject> obj, |
1782 Handle<BackingStore> backing_store, uint32_t entry) { | 1791 Handle<BackingStore> backing_store, uint32_t entry) { |
1783 uint32_t length = static_cast<uint32_t>(backing_store->length()); | 1792 uint32_t length = static_cast<uint32_t>(backing_store->length()); |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1924 | 1933 |
1925 static void AddElementsToKeyAccumulatorImpl(Handle<JSObject> receiver, | 1934 static void AddElementsToKeyAccumulatorImpl(Handle<JSObject> receiver, |
1926 KeyAccumulator* accumulator, | 1935 KeyAccumulator* accumulator, |
1927 AddKeyConversion convert) { | 1936 AddKeyConversion convert) { |
1928 Isolate* isolate = accumulator->isolate(); | 1937 Isolate* isolate = accumulator->isolate(); |
1929 Handle<FixedArrayBase> elements(receiver->elements(), isolate); | 1938 Handle<FixedArrayBase> elements(receiver->elements(), isolate); |
1930 uint32_t length = Subclass::GetMaxNumberOfEntries(*receiver, *elements); | 1939 uint32_t length = Subclass::GetMaxNumberOfEntries(*receiver, *elements); |
1931 for (uint32_t i = 0; i < length; i++) { | 1940 for (uint32_t i = 0; i < length; i++) { |
1932 if (IsFastPackedElementsKind(KindTraits::Kind) || | 1941 if (IsFastPackedElementsKind(KindTraits::Kind) || |
1933 HasEntryImpl(isolate, *elements, i)) { | 1942 HasEntryImpl(isolate, *elements, i)) { |
1934 accumulator->AddKey(Subclass::GetImpl(*elements, i), convert); | 1943 accumulator->AddKey(Subclass::GetImpl(isolate, *elements, i), convert); |
1935 } | 1944 } |
1936 } | 1945 } |
1937 } | 1946 } |
1938 | 1947 |
1939 static void ValidateContents(Handle<JSObject> holder, int length) { | 1948 static void ValidateContents(Handle<JSObject> holder, int length) { |
1940 #if DEBUG | 1949 #if DEBUG |
1941 Isolate* isolate = holder->GetIsolate(); | 1950 Isolate* isolate = holder->GetIsolate(); |
1942 Heap* heap = isolate->heap(); | 1951 Heap* heap = isolate->heap(); |
1943 HandleScope scope(isolate); | 1952 HandleScope scope(isolate); |
1944 Handle<FixedArrayBase> elements(holder->elements(), isolate); | 1953 Handle<FixedArrayBase> elements(holder->elements(), isolate); |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2065 static Maybe<bool> CollectValuesOrEntriesImpl( | 2074 static Maybe<bool> CollectValuesOrEntriesImpl( |
2066 Isolate* isolate, Handle<JSObject> object, | 2075 Isolate* isolate, Handle<JSObject> object, |
2067 Handle<FixedArray> values_or_entries, bool get_entries, int* nof_items, | 2076 Handle<FixedArray> values_or_entries, bool get_entries, int* nof_items, |
2068 PropertyFilter filter) { | 2077 PropertyFilter filter) { |
2069 Handle<BackingStore> elements(BackingStore::cast(object->elements()), | 2078 Handle<BackingStore> elements(BackingStore::cast(object->elements()), |
2070 isolate); | 2079 isolate); |
2071 int count = 0; | 2080 int count = 0; |
2072 uint32_t length = elements->length(); | 2081 uint32_t length = elements->length(); |
2073 for (uint32_t index = 0; index < length; ++index) { | 2082 for (uint32_t index = 0; index < length; ++index) { |
2074 if (!HasEntryImpl(isolate, *elements, index)) continue; | 2083 if (!HasEntryImpl(isolate, *elements, index)) continue; |
2075 Handle<Object> value = Subclass::GetImpl(*elements, index); | 2084 Handle<Object> value = Subclass::GetImpl(isolate, *elements, index); |
2076 if (get_entries) { | 2085 if (get_entries) { |
2077 value = MakeEntryPair(isolate, index, value); | 2086 value = MakeEntryPair(isolate, index, value); |
2078 } | 2087 } |
2079 values_or_entries->set(count++, *value); | 2088 values_or_entries->set(count++, *value); |
2080 } | 2089 } |
2081 *nof_items = count; | 2090 *nof_items = count; |
2082 return Just(true); | 2091 return Just(true); |
2083 } | 2092 } |
2084 | 2093 |
2085 static void MoveElements(Isolate* isolate, Handle<JSArray> receiver, | 2094 static void MoveElements(Isolate* isolate, Handle<JSArray> receiver, |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2255 | 2264 |
2256 for (uint32_t k = start_from; k < length; ++k) { | 2265 for (uint32_t k = start_from; k < length; ++k) { |
2257 if (elements->get(k)->IsNaN()) return Just(true); | 2266 if (elements->get(k)->IsNaN()) return Just(true); |
2258 } | 2267 } |
2259 return Just(false); | 2268 return Just(false); |
2260 } | 2269 } |
2261 } | 2270 } |
2262 } | 2271 } |
2263 } | 2272 } |
2264 | 2273 |
| 2274 static Handle<FixedArray> CreateListFromArrayImpl(Isolate* isolate, |
| 2275 Handle<JSArray> array) { |
| 2276 uint32_t length = 0; |
| 2277 array->length()->ToArrayLength(&length); |
| 2278 Handle<FixedArray> result = isolate->factory()->NewFixedArray(length); |
| 2279 Handle<FixedArrayBase> elements(array->elements(), isolate); |
| 2280 for (uint32_t i = 0; i < length; i++) { |
| 2281 if (!Subclass::HasElementImpl(isolate, array, i, elements)) continue; |
| 2282 Handle<Object> value; |
| 2283 value = Subclass::GetImpl(isolate, *elements, i); |
| 2284 if (value->IsName()) { |
| 2285 value = isolate->factory()->InternalizeName(Handle<Name>::cast(value)); |
| 2286 } |
| 2287 result->set(i, *value); |
| 2288 } |
| 2289 return result; |
| 2290 } |
| 2291 |
2265 private: | 2292 private: |
2266 // SpliceShrinkStep might modify the backing_store. | 2293 // SpliceShrinkStep might modify the backing_store. |
2267 static void SpliceShrinkStep(Isolate* isolate, Handle<JSArray> receiver, | 2294 static void SpliceShrinkStep(Isolate* isolate, Handle<JSArray> receiver, |
2268 Handle<FixedArrayBase> backing_store, | 2295 Handle<FixedArrayBase> backing_store, |
2269 uint32_t start, uint32_t delete_count, | 2296 uint32_t start, uint32_t delete_count, |
2270 uint32_t add_count, uint32_t len, | 2297 uint32_t add_count, uint32_t len, |
2271 uint32_t new_length) { | 2298 uint32_t new_length) { |
2272 const int move_left_count = len - delete_count - start; | 2299 const int move_left_count = len - delete_count - start; |
2273 const int move_left_dst_index = start + add_count; | 2300 const int move_left_dst_index = start + add_count; |
2274 Subclass::MoveElements(isolate, receiver, backing_store, | 2301 Subclass::MoveElements(isolate, receiver, backing_store, |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2313 if (IsFastSmiOrObjectElementsKind(kind)) { | 2340 if (IsFastSmiOrObjectElementsKind(kind)) { |
2314 HandleScope scope(isolate); | 2341 HandleScope scope(isolate); |
2315 JSObject::EnsureWritableFastElements(receiver); | 2342 JSObject::EnsureWritableFastElements(receiver); |
2316 } | 2343 } |
2317 Handle<FixedArrayBase> backing_store(receiver->elements(), isolate); | 2344 Handle<FixedArrayBase> backing_store(receiver->elements(), isolate); |
2318 uint32_t length = | 2345 uint32_t length = |
2319 static_cast<uint32_t>(Smi::cast(receiver->length())->value()); | 2346 static_cast<uint32_t>(Smi::cast(receiver->length())->value()); |
2320 DCHECK(length > 0); | 2347 DCHECK(length > 0); |
2321 int new_length = length - 1; | 2348 int new_length = length - 1; |
2322 int remove_index = remove_position == AT_START ? 0 : new_length; | 2349 int remove_index = remove_position == AT_START ? 0 : new_length; |
2323 Handle<Object> result = Subclass::GetImpl(*backing_store, remove_index); | 2350 Handle<Object> result = |
| 2351 Subclass::GetImpl(isolate, *backing_store, remove_index); |
2324 if (remove_position == AT_START) { | 2352 if (remove_position == AT_START) { |
2325 Subclass::MoveElements(isolate, receiver, backing_store, 0, 1, new_length, | 2353 Subclass::MoveElements(isolate, receiver, backing_store, 0, 1, new_length, |
2326 0, 0); | 2354 0, 0); |
2327 } | 2355 } |
2328 Subclass::SetLengthImpl(isolate, receiver, new_length, backing_store); | 2356 Subclass::SetLengthImpl(isolate, receiver, new_length, backing_store); |
2329 | 2357 |
2330 if (IsHoleyElementsKind(kind) && result->IsTheHole(isolate)) { | 2358 if (IsHoleyElementsKind(kind) && result->IsTheHole(isolate)) { |
2331 return isolate->factory()->undefined_value(); | 2359 return isolate->factory()->undefined_value(); |
2332 } | 2360 } |
2333 return result; | 2361 return result; |
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2534 ElementsKindTraits<FAST_HOLEY_ELEMENTS> >(name) {} | 2562 ElementsKindTraits<FAST_HOLEY_ELEMENTS> >(name) {} |
2535 }; | 2563 }; |
2536 | 2564 |
2537 template <typename Subclass, typename KindTraits> | 2565 template <typename Subclass, typename KindTraits> |
2538 class FastDoubleElementsAccessor | 2566 class FastDoubleElementsAccessor |
2539 : public FastElementsAccessor<Subclass, KindTraits> { | 2567 : public FastElementsAccessor<Subclass, KindTraits> { |
2540 public: | 2568 public: |
2541 explicit FastDoubleElementsAccessor(const char* name) | 2569 explicit FastDoubleElementsAccessor(const char* name) |
2542 : FastElementsAccessor<Subclass, KindTraits>(name) {} | 2570 : FastElementsAccessor<Subclass, KindTraits>(name) {} |
2543 | 2571 |
2544 static Handle<Object> GetImpl(Handle<JSObject> holder, uint32_t entry) { | 2572 static Handle<Object> GetImpl(Isolate* isolate, FixedArrayBase* backing_store, |
2545 return GetImpl(holder->elements(), entry); | 2573 uint32_t entry) { |
2546 } | |
2547 | |
2548 static Handle<Object> GetImpl(FixedArrayBase* backing_store, uint32_t entry) { | |
2549 Isolate* isolate = backing_store->GetIsolate(); | |
2550 return FixedDoubleArray::get(FixedDoubleArray::cast(backing_store), entry, | 2574 return FixedDoubleArray::get(FixedDoubleArray::cast(backing_store), entry, |
2551 isolate); | 2575 isolate); |
2552 } | 2576 } |
2553 | 2577 |
2554 static inline void SetImpl(Handle<JSObject> holder, uint32_t entry, | 2578 static inline void SetImpl(Handle<JSObject> holder, uint32_t entry, |
2555 Object* value) { | 2579 Object* value) { |
2556 SetImpl(holder->elements(), entry, value); | 2580 SetImpl(holder->elements(), entry, value); |
2557 } | 2581 } |
2558 | 2582 |
2559 static inline void SetImpl(FixedArrayBase* backing_store, uint32_t entry, | 2583 static inline void SetImpl(FixedArrayBase* backing_store, uint32_t entry, |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2686 static inline void SetImpl(FixedArrayBase* backing_store, uint32_t entry, | 2710 static inline void SetImpl(FixedArrayBase* backing_store, uint32_t entry, |
2687 Object* value) { | 2711 Object* value) { |
2688 BackingStore::cast(backing_store)->SetValue(entry, value); | 2712 BackingStore::cast(backing_store)->SetValue(entry, value); |
2689 } | 2713 } |
2690 | 2714 |
2691 static inline void SetImpl(FixedArrayBase* backing_store, uint32_t entry, | 2715 static inline void SetImpl(FixedArrayBase* backing_store, uint32_t entry, |
2692 Object* value, WriteBarrierMode mode) { | 2716 Object* value, WriteBarrierMode mode) { |
2693 BackingStore::cast(backing_store)->SetValue(entry, value); | 2717 BackingStore::cast(backing_store)->SetValue(entry, value); |
2694 } | 2718 } |
2695 | 2719 |
2696 static Handle<Object> GetImpl(Handle<JSObject> holder, uint32_t entry) { | 2720 static Handle<Object> GetImpl(Isolate* isolate, FixedArrayBase* backing_store, |
2697 return GetImpl(holder->elements(), entry); | 2721 uint32_t entry) { |
2698 } | |
2699 | |
2700 static Handle<Object> GetImpl(FixedArrayBase* backing_store, uint32_t entry) { | |
2701 return BackingStore::get(BackingStore::cast(backing_store), entry); | 2722 return BackingStore::get(BackingStore::cast(backing_store), entry); |
2702 } | 2723 } |
2703 | 2724 |
2704 static PropertyDetails GetDetailsImpl(JSObject* holder, uint32_t entry) { | 2725 static PropertyDetails GetDetailsImpl(JSObject* holder, uint32_t entry) { |
2705 return PropertyDetails(DONT_DELETE, DATA, 0, PropertyCellType::kNoCell); | 2726 return PropertyDetails(DONT_DELETE, DATA, 0, PropertyCellType::kNoCell); |
2706 } | 2727 } |
2707 | 2728 |
2708 static PropertyDetails GetDetailsImpl(FixedArrayBase* backing_store, | 2729 static PropertyDetails GetDetailsImpl(FixedArrayBase* backing_store, |
2709 uint32_t entry) { | 2730 uint32_t entry) { |
2710 return PropertyDetails(DONT_DELETE, DATA, 0, PropertyCellType::kNoCell); | 2731 return PropertyDetails(DONT_DELETE, DATA, 0, PropertyCellType::kNoCell); |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2754 } | 2775 } |
2755 | 2776 |
2756 static uint32_t NumberOfElementsImpl(JSObject* receiver, | 2777 static uint32_t NumberOfElementsImpl(JSObject* receiver, |
2757 FixedArrayBase* backing_store) { | 2778 FixedArrayBase* backing_store) { |
2758 return AccessorClass::GetCapacityImpl(receiver, backing_store); | 2779 return AccessorClass::GetCapacityImpl(receiver, backing_store); |
2759 } | 2780 } |
2760 | 2781 |
2761 static void AddElementsToKeyAccumulatorImpl(Handle<JSObject> receiver, | 2782 static void AddElementsToKeyAccumulatorImpl(Handle<JSObject> receiver, |
2762 KeyAccumulator* accumulator, | 2783 KeyAccumulator* accumulator, |
2763 AddKeyConversion convert) { | 2784 AddKeyConversion convert) { |
| 2785 Isolate* isolate = receiver->GetIsolate(); |
2764 Handle<FixedArrayBase> elements(receiver->elements()); | 2786 Handle<FixedArrayBase> elements(receiver->elements()); |
2765 uint32_t length = AccessorClass::GetCapacityImpl(*receiver, *elements); | 2787 uint32_t length = AccessorClass::GetCapacityImpl(*receiver, *elements); |
2766 for (uint32_t i = 0; i < length; i++) { | 2788 for (uint32_t i = 0; i < length; i++) { |
2767 Handle<Object> value = AccessorClass::GetImpl(*elements, i); | 2789 Handle<Object> value = AccessorClass::GetImpl(isolate, *elements, i); |
2768 accumulator->AddKey(value, convert); | 2790 accumulator->AddKey(value, convert); |
2769 } | 2791 } |
2770 } | 2792 } |
2771 | 2793 |
2772 static Maybe<bool> CollectValuesOrEntriesImpl( | 2794 static Maybe<bool> CollectValuesOrEntriesImpl( |
2773 Isolate* isolate, Handle<JSObject> object, | 2795 Isolate* isolate, Handle<JSObject> object, |
2774 Handle<FixedArray> values_or_entries, bool get_entries, int* nof_items, | 2796 Handle<FixedArray> values_or_entries, bool get_entries, int* nof_items, |
2775 PropertyFilter filter) { | 2797 PropertyFilter filter) { |
2776 int count = 0; | 2798 int count = 0; |
2777 if ((filter & ONLY_CONFIGURABLE) == 0) { | 2799 if ((filter & ONLY_CONFIGURABLE) == 0) { |
2778 Handle<FixedArrayBase> elements(object->elements()); | 2800 Handle<FixedArrayBase> elements(object->elements()); |
2779 uint32_t length = AccessorClass::GetCapacityImpl(*object, *elements); | 2801 uint32_t length = AccessorClass::GetCapacityImpl(*object, *elements); |
2780 for (uint32_t index = 0; index < length; ++index) { | 2802 for (uint32_t index = 0; index < length; ++index) { |
2781 Handle<Object> value = AccessorClass::GetImpl(*elements, index); | 2803 Handle<Object> value = |
| 2804 AccessorClass::GetImpl(isolate, *elements, index); |
2782 if (get_entries) { | 2805 if (get_entries) { |
2783 value = MakeEntryPair(isolate, index, value); | 2806 value = MakeEntryPair(isolate, index, value); |
2784 } | 2807 } |
2785 values_or_entries->set(count++, *value); | 2808 values_or_entries->set(count++, *value); |
2786 } | 2809 } |
2787 } | 2810 } |
2788 *nof_items = count; | 2811 *nof_items = count; |
2789 return Just(true); | 2812 return Just(true); |
2790 } | 2813 } |
2791 | 2814 |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2894 | 2917 |
2895 template <typename Subclass, typename ArgumentsAccessor, typename KindTraits> | 2918 template <typename Subclass, typename ArgumentsAccessor, typename KindTraits> |
2896 class SloppyArgumentsElementsAccessor | 2919 class SloppyArgumentsElementsAccessor |
2897 : public ElementsAccessorBase<Subclass, KindTraits> { | 2920 : public ElementsAccessorBase<Subclass, KindTraits> { |
2898 public: | 2921 public: |
2899 explicit SloppyArgumentsElementsAccessor(const char* name) | 2922 explicit SloppyArgumentsElementsAccessor(const char* name) |
2900 : ElementsAccessorBase<Subclass, KindTraits>(name) { | 2923 : ElementsAccessorBase<Subclass, KindTraits>(name) { |
2901 USE(KindTraits::Kind); | 2924 USE(KindTraits::Kind); |
2902 } | 2925 } |
2903 | 2926 |
2904 static Handle<Object> GetImpl(Handle<JSObject> holder, uint32_t entry) { | 2927 static Handle<Object> GetImpl(Isolate* isolate, FixedArrayBase* parameters, |
2905 return GetImpl(holder->elements(), entry); | 2928 uint32_t entry) { |
2906 } | |
2907 | |
2908 static Handle<Object> GetImpl(FixedArrayBase* parameters, uint32_t entry) { | |
2909 Isolate* isolate = parameters->GetIsolate(); | |
2910 Handle<FixedArray> parameter_map(FixedArray::cast(parameters), isolate); | 2929 Handle<FixedArray> parameter_map(FixedArray::cast(parameters), isolate); |
2911 uint32_t length = parameter_map->length() - 2; | 2930 uint32_t length = parameter_map->length() - 2; |
2912 if (entry < length) { | 2931 if (entry < length) { |
2913 DisallowHeapAllocation no_gc; | 2932 DisallowHeapAllocation no_gc; |
2914 Object* probe = parameter_map->get(entry + 2); | 2933 Object* probe = parameter_map->get(entry + 2); |
2915 Context* context = Context::cast(parameter_map->get(0)); | 2934 Context* context = Context::cast(parameter_map->get(0)); |
2916 int context_entry = Smi::cast(probe)->value(); | 2935 int context_entry = Smi::cast(probe)->value(); |
2917 DCHECK(!context->get(context_entry)->IsTheHole(isolate)); | 2936 DCHECK(!context->get(context_entry)->IsTheHole(isolate)); |
2918 return handle(context->get(context_entry), isolate); | 2937 return handle(context->get(context_entry), isolate); |
2919 } else { | 2938 } else { |
2920 // Object is not mapped, defer to the arguments. | 2939 // Object is not mapped, defer to the arguments. |
2921 Handle<Object> result = ArgumentsAccessor::GetImpl( | 2940 Handle<Object> result = ArgumentsAccessor::GetImpl( |
2922 FixedArray::cast(parameter_map->get(1)), entry - length); | 2941 isolate, FixedArray::cast(parameter_map->get(1)), entry - length); |
2923 // Elements of the arguments object in slow mode might be slow aliases. | 2942 // Elements of the arguments object in slow mode might be slow aliases. |
2924 if (result->IsAliasedArgumentsEntry()) { | 2943 if (result->IsAliasedArgumentsEntry()) { |
2925 DisallowHeapAllocation no_gc; | 2944 DisallowHeapAllocation no_gc; |
2926 AliasedArgumentsEntry* alias = AliasedArgumentsEntry::cast(*result); | 2945 AliasedArgumentsEntry* alias = AliasedArgumentsEntry::cast(*result); |
2927 Context* context = Context::cast(parameter_map->get(0)); | 2946 Context* context = Context::cast(parameter_map->get(0)); |
2928 int context_entry = alias->aliased_context_slot(); | 2947 int context_entry = alias->aliased_context_slot(); |
2929 DCHECK(!context->get(context_entry)->IsTheHole(isolate)); | 2948 DCHECK(!context->get(context_entry)->IsTheHole(isolate)); |
2930 return handle(context->get(context_entry), isolate); | 2949 return handle(context->get(context_entry), isolate); |
2931 } | 2950 } |
2932 return result; | 2951 return result; |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3010 } | 3029 } |
3011 | 3030 |
3012 static void AddElementsToKeyAccumulatorImpl(Handle<JSObject> receiver, | 3031 static void AddElementsToKeyAccumulatorImpl(Handle<JSObject> receiver, |
3013 KeyAccumulator* accumulator, | 3032 KeyAccumulator* accumulator, |
3014 AddKeyConversion convert) { | 3033 AddKeyConversion convert) { |
3015 Isolate* isolate = accumulator->isolate(); | 3034 Isolate* isolate = accumulator->isolate(); |
3016 Handle<FixedArrayBase> elements(receiver->elements(), isolate); | 3035 Handle<FixedArrayBase> elements(receiver->elements(), isolate); |
3017 uint32_t length = GetCapacityImpl(*receiver, *elements); | 3036 uint32_t length = GetCapacityImpl(*receiver, *elements); |
3018 for (uint32_t entry = 0; entry < length; entry++) { | 3037 for (uint32_t entry = 0; entry < length; entry++) { |
3019 if (!HasEntryImpl(isolate, *elements, entry)) continue; | 3038 if (!HasEntryImpl(isolate, *elements, entry)) continue; |
3020 Handle<Object> value = GetImpl(*elements, entry); | 3039 Handle<Object> value = GetImpl(isolate, *elements, entry); |
3021 accumulator->AddKey(value, convert); | 3040 accumulator->AddKey(value, convert); |
3022 } | 3041 } |
3023 } | 3042 } |
3024 | 3043 |
3025 static bool HasEntryImpl(Isolate* isolate, FixedArrayBase* parameters, | 3044 static bool HasEntryImpl(Isolate* isolate, FixedArrayBase* parameters, |
3026 uint32_t entry) { | 3045 uint32_t entry) { |
3027 FixedArray* parameter_map = FixedArray::cast(parameters); | 3046 FixedArray* parameter_map = FixedArray::cast(parameters); |
3028 uint32_t length = parameter_map->length() - 2; | 3047 uint32_t length = parameter_map->length() - 2; |
3029 if (entry < length) { | 3048 if (entry < length) { |
3030 return HasParameterMapArg(parameter_map, entry); | 3049 return HasParameterMapArg(parameter_map, entry); |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3146 bool search_for_hole = value->IsUndefined(isolate); | 3165 bool search_for_hole = value->IsUndefined(isolate); |
3147 | 3166 |
3148 for (uint32_t k = start_from; k < length; ++k) { | 3167 for (uint32_t k = start_from; k < length; ++k) { |
3149 uint32_t entry = GetEntryForIndexImpl(isolate, *object, *parameter_map, k, | 3168 uint32_t entry = GetEntryForIndexImpl(isolate, *object, *parameter_map, k, |
3150 ALL_PROPERTIES); | 3169 ALL_PROPERTIES); |
3151 if (entry == kMaxUInt32) { | 3170 if (entry == kMaxUInt32) { |
3152 if (search_for_hole) return Just(true); | 3171 if (search_for_hole) return Just(true); |
3153 continue; | 3172 continue; |
3154 } | 3173 } |
3155 | 3174 |
3156 Handle<Object> element_k = GetImpl(*parameter_map, entry); | 3175 Handle<Object> element_k = |
| 3176 Subclass::GetImpl(isolate, *parameter_map, entry); |
3157 | 3177 |
3158 if (element_k->IsAccessorPair()) { | 3178 if (element_k->IsAccessorPair()) { |
3159 LookupIterator it(isolate, object, k, LookupIterator::OWN); | 3179 LookupIterator it(isolate, object, k, LookupIterator::OWN); |
3160 DCHECK(it.IsFound()); | 3180 DCHECK(it.IsFound()); |
3161 DCHECK_EQ(it.state(), LookupIterator::ACCESSOR); | 3181 DCHECK_EQ(it.state(), LookupIterator::ACCESSOR); |
3162 ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, element_k, | 3182 ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, element_k, |
3163 Object::GetPropertyWithAccessor(&it), | 3183 Object::GetPropertyWithAccessor(&it), |
3164 Nothing<bool>()); | 3184 Nothing<bool>()); |
3165 | 3185 |
3166 if (value->SameValueZero(*element_k)) return Just(true); | 3186 if (value->SameValueZero(*element_k)) return Just(true); |
(...skipping 18 matching lines...) Expand all Loading... |
3185 Handle<FixedArray> parameter_map(FixedArray::cast(object->elements()), | 3205 Handle<FixedArray> parameter_map(FixedArray::cast(object->elements()), |
3186 isolate); | 3206 isolate); |
3187 | 3207 |
3188 for (uint32_t k = start_from; k < length; ++k) { | 3208 for (uint32_t k = start_from; k < length; ++k) { |
3189 uint32_t entry = GetEntryForIndexImpl(isolate, *object, *parameter_map, k, | 3209 uint32_t entry = GetEntryForIndexImpl(isolate, *object, *parameter_map, k, |
3190 ALL_PROPERTIES); | 3210 ALL_PROPERTIES); |
3191 if (entry == kMaxUInt32) { | 3211 if (entry == kMaxUInt32) { |
3192 continue; | 3212 continue; |
3193 } | 3213 } |
3194 | 3214 |
3195 Handle<Object> element_k = GetImpl(*parameter_map, entry); | 3215 Handle<Object> element_k = |
| 3216 Subclass::GetImpl(isolate, *parameter_map, entry); |
3196 | 3217 |
3197 if (element_k->IsAccessorPair()) { | 3218 if (element_k->IsAccessorPair()) { |
3198 LookupIterator it(isolate, object, k, LookupIterator::OWN); | 3219 LookupIterator it(isolate, object, k, LookupIterator::OWN); |
3199 DCHECK(it.IsFound()); | 3220 DCHECK(it.IsFound()); |
3200 DCHECK_EQ(it.state(), LookupIterator::ACCESSOR); | 3221 DCHECK_EQ(it.state(), LookupIterator::ACCESSOR); |
3201 ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, element_k, | 3222 ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, element_k, |
3202 Object::GetPropertyWithAccessor(&it), | 3223 Object::GetPropertyWithAccessor(&it), |
3203 Nothing<int64_t>()); | 3224 Nothing<int64_t>()); |
3204 | 3225 |
3205 if (value->StrictEquals(*element_k)) { | 3226 if (value->StrictEquals(*element_k)) { |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3330 Handle<JSArray> result_array = isolate->factory()->NewJSArray( | 3351 Handle<JSArray> result_array = isolate->factory()->NewJSArray( |
3331 FAST_HOLEY_ELEMENTS, result_len, result_len); | 3352 FAST_HOLEY_ELEMENTS, result_len, result_len); |
3332 DisallowHeapAllocation no_gc; | 3353 DisallowHeapAllocation no_gc; |
3333 FixedArray* elements = FixedArray::cast(result_array->elements()); | 3354 FixedArray* elements = FixedArray::cast(result_array->elements()); |
3334 FixedArray* parameters = FixedArray::cast(receiver->elements()); | 3355 FixedArray* parameters = FixedArray::cast(receiver->elements()); |
3335 uint32_t insertion_index = 0; | 3356 uint32_t insertion_index = 0; |
3336 for (uint32_t i = start; i < end; i++) { | 3357 for (uint32_t i = start; i < end; i++) { |
3337 uint32_t entry = GetEntryForIndexImpl(isolate, *receiver, parameters, i, | 3358 uint32_t entry = GetEntryForIndexImpl(isolate, *receiver, parameters, i, |
3338 ALL_PROPERTIES); | 3359 ALL_PROPERTIES); |
3339 if (entry != kMaxUInt32 && HasEntryImpl(isolate, parameters, entry)) { | 3360 if (entry != kMaxUInt32 && HasEntryImpl(isolate, parameters, entry)) { |
3340 elements->set(insertion_index, *GetImpl(parameters, entry)); | 3361 elements->set(insertion_index, *GetImpl(isolate, parameters, entry)); |
3341 } else { | 3362 } else { |
3342 elements->set_the_hole(isolate, insertion_index); | 3363 elements->set_the_hole(isolate, insertion_index); |
3343 } | 3364 } |
3344 insertion_index++; | 3365 insertion_index++; |
3345 } | 3366 } |
3346 return result_array; | 3367 return result_array; |
3347 } | 3368 } |
3348 | 3369 |
3349 static Handle<SeededNumberDictionary> NormalizeImpl( | 3370 static Handle<SeededNumberDictionary> NormalizeImpl( |
3350 Handle<JSObject> object, Handle<FixedArrayBase> elements) { | 3371 Handle<JSObject> object, Handle<FixedArrayBase> elements) { |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3430 | 3451 |
3431 template <typename Subclass, typename BackingStoreAccessor, typename KindTraits> | 3452 template <typename Subclass, typename BackingStoreAccessor, typename KindTraits> |
3432 class StringWrapperElementsAccessor | 3453 class StringWrapperElementsAccessor |
3433 : public ElementsAccessorBase<Subclass, KindTraits> { | 3454 : public ElementsAccessorBase<Subclass, KindTraits> { |
3434 public: | 3455 public: |
3435 explicit StringWrapperElementsAccessor(const char* name) | 3456 explicit StringWrapperElementsAccessor(const char* name) |
3436 : ElementsAccessorBase<Subclass, KindTraits>(name) { | 3457 : ElementsAccessorBase<Subclass, KindTraits>(name) { |
3437 USE(KindTraits::Kind); | 3458 USE(KindTraits::Kind); |
3438 } | 3459 } |
3439 | 3460 |
| 3461 static Handle<Object> GetInternalImpl(Handle<JSObject> holder, |
| 3462 uint32_t entry) { |
| 3463 return GetImpl(holder, entry); |
| 3464 } |
| 3465 |
3440 static Handle<Object> GetImpl(Handle<JSObject> holder, uint32_t entry) { | 3466 static Handle<Object> GetImpl(Handle<JSObject> holder, uint32_t entry) { |
3441 Isolate* isolate = holder->GetIsolate(); | 3467 Isolate* isolate = holder->GetIsolate(); |
3442 Handle<String> string(GetString(*holder), isolate); | 3468 Handle<String> string(GetString(*holder), isolate); |
3443 uint32_t length = static_cast<uint32_t>(string->length()); | 3469 uint32_t length = static_cast<uint32_t>(string->length()); |
3444 if (entry < length) { | 3470 if (entry < length) { |
3445 return isolate->factory()->LookupSingleCharacterStringFromCode( | 3471 return isolate->factory()->LookupSingleCharacterStringFromCode( |
3446 String::Flatten(string)->Get(entry)); | 3472 String::Flatten(string)->Get(entry)); |
3447 } | 3473 } |
3448 return BackingStoreAccessor::GetImpl(holder, entry - length); | 3474 return BackingStoreAccessor::GetImpl(isolate, holder->elements(), |
| 3475 entry - length); |
| 3476 } |
| 3477 |
| 3478 static Handle<Object> GetImpl(Isolate* isolate, FixedArrayBase* elements, |
| 3479 uint32_t entry) { |
| 3480 UNREACHABLE(); |
| 3481 return Handle<Object>(); |
3449 } | 3482 } |
3450 | 3483 |
3451 static PropertyDetails GetDetailsImpl(JSObject* holder, uint32_t entry) { | 3484 static PropertyDetails GetDetailsImpl(JSObject* holder, uint32_t entry) { |
3452 uint32_t length = static_cast<uint32_t>(GetString(holder)->length()); | 3485 uint32_t length = static_cast<uint32_t>(GetString(holder)->length()); |
3453 if (entry < length) { | 3486 if (entry < length) { |
3454 PropertyAttributes attributes = | 3487 PropertyAttributes attributes = |
3455 static_cast<PropertyAttributes>(READ_ONLY | DONT_DELETE); | 3488 static_cast<PropertyAttributes>(READ_ONLY | DONT_DELETE); |
3456 return PropertyDetails(attributes, v8::internal::DATA, 0, | 3489 return PropertyDetails(attributes, v8::internal::DATA, 0, |
3457 PropertyCellType::kNoCell); | 3490 PropertyCellType::kNoCell); |
3458 } | 3491 } |
(...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3823 insertion_index += len; | 3856 insertion_index += len; |
3824 } | 3857 } |
3825 | 3858 |
3826 DCHECK_EQ(insertion_index, result_len); | 3859 DCHECK_EQ(insertion_index, result_len); |
3827 return result_array; | 3860 return result_array; |
3828 } | 3861 } |
3829 | 3862 |
3830 ElementsAccessor** ElementsAccessor::elements_accessors_ = NULL; | 3863 ElementsAccessor** ElementsAccessor::elements_accessors_ = NULL; |
3831 } // namespace internal | 3864 } // namespace internal |
3832 } // namespace v8 | 3865 } // namespace v8 |
OLD | NEW |