| 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/v8.h" | 5 #include "src/v8.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/elements.h" | 9 #include "src/elements.h" |
| 10 #include "src/objects.h" | 10 #include "src/objects.h" |
| (...skipping 748 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 759 // | 759 // |
| 760 // Details: The idea is that allocations actually happen only in case of | 760 // Details: The idea is that allocations actually happen only in case of |
| 761 // copying from object with fast double elements to object with object | 761 // copying from object with fast double elements to object with object |
| 762 // elements. In all the other cases there are no allocations performed and | 762 // elements. In all the other cases there are no allocations performed and |
| 763 // handle creation causes noticeable performance degradation of the builtin. | 763 // handle creation causes noticeable performance degradation of the builtin. |
| 764 ElementsAccessorSubclass::CopyElementsImpl( | 764 ElementsAccessorSubclass::CopyElementsImpl( |
| 765 from, from_start, *to, from_kind, to_start, packed_size, copy_size); | 765 from, from_start, *to, from_kind, to_start, packed_size, copy_size); |
| 766 } | 766 } |
| 767 | 767 |
| 768 virtual MaybeHandle<FixedArray> AddElementsToFixedArray( | 768 virtual MaybeHandle<FixedArray> AddElementsToFixedArray( |
| 769 Handle<Object> receiver, | 769 Handle<Object> receiver, Handle<JSObject> holder, Handle<FixedArray> to, |
| 770 Handle<JSObject> holder, | 770 Handle<FixedArrayBase> from, |
| 771 Handle<FixedArray> to, | 771 FixedArray::KeyFilter filter) FINAL OVERRIDE { |
| 772 Handle<FixedArrayBase> from) FINAL OVERRIDE { | |
| 773 int len0 = to->length(); | 772 int len0 = to->length(); |
| 774 #ifdef ENABLE_SLOW_DCHECKS | 773 #ifdef ENABLE_SLOW_DCHECKS |
| 775 if (FLAG_enable_slow_asserts) { | 774 if (FLAG_enable_slow_asserts) { |
| 776 for (int i = 0; i < len0; i++) { | 775 for (int i = 0; i < len0; i++) { |
| 777 DCHECK(!to->get(i)->IsTheHole()); | 776 DCHECK(!to->get(i)->IsTheHole()); |
| 778 } | 777 } |
| 779 } | 778 } |
| 780 #endif | 779 #endif |
| 781 | 780 |
| 782 // Optimize if 'other' is empty. | 781 // Optimize if 'other' is empty. |
| 783 // We cannot optimize if 'this' is empty, as other may have holes. | 782 // We cannot optimize if 'this' is empty, as other may have holes. |
| 784 uint32_t len1 = ElementsAccessorSubclass::GetCapacityImpl(from); | 783 uint32_t len1 = ElementsAccessorSubclass::GetCapacityImpl(from); |
| 785 if (len1 == 0) return to; | 784 if (len1 == 0) return to; |
| 786 | 785 |
| 787 Isolate* isolate = from->GetIsolate(); | 786 Isolate* isolate = from->GetIsolate(); |
| 788 | 787 |
| 789 // Compute how many elements are not in other. | 788 // Compute how many elements are not in other. |
| 790 uint32_t extra = 0; | 789 uint32_t extra = 0; |
| 791 for (uint32_t y = 0; y < len1; y++) { | 790 for (uint32_t y = 0; y < len1; y++) { |
| 792 uint32_t key = ElementsAccessorSubclass::GetKeyForIndexImpl(from, y); | 791 uint32_t key = ElementsAccessorSubclass::GetKeyForIndexImpl(from, y); |
| 793 if (ElementsAccessorSubclass::HasElementImpl( | 792 if (ElementsAccessorSubclass::HasElementImpl( |
| 794 receiver, holder, key, from)) { | 793 receiver, holder, key, from)) { |
| 795 Handle<Object> value; | 794 Handle<Object> value; |
| 796 ASSIGN_RETURN_ON_EXCEPTION( | 795 ASSIGN_RETURN_ON_EXCEPTION( |
| 797 isolate, value, | 796 isolate, value, |
| 798 ElementsAccessorSubclass::GetImpl(receiver, holder, key, from), | 797 ElementsAccessorSubclass::GetImpl(receiver, holder, key, from), |
| 799 FixedArray); | 798 FixedArray); |
| 800 | 799 |
| 801 DCHECK(!value->IsTheHole()); | 800 DCHECK(!value->IsTheHole()); |
| 801 if (filter == FixedArray::NON_SYMBOL_KEYS && value->IsSymbol()) { |
| 802 continue; |
| 803 } |
| 802 if (!HasKey(to, value)) { | 804 if (!HasKey(to, value)) { |
| 803 extra++; | 805 extra++; |
| 804 } | 806 } |
| 805 } | 807 } |
| 806 } | 808 } |
| 807 | 809 |
| 808 if (extra == 0) return to; | 810 if (extra == 0) return to; |
| 809 | 811 |
| 810 // Allocate the result | 812 // Allocate the result |
| 811 Handle<FixedArray> result = isolate->factory()->NewFixedArray(len0 + extra); | 813 Handle<FixedArray> result = isolate->factory()->NewFixedArray(len0 + extra); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 825 for (uint32_t y = 0; y < len1; y++) { | 827 for (uint32_t y = 0; y < len1; y++) { |
| 826 uint32_t key = | 828 uint32_t key = |
| 827 ElementsAccessorSubclass::GetKeyForIndexImpl(from, y); | 829 ElementsAccessorSubclass::GetKeyForIndexImpl(from, y); |
| 828 if (ElementsAccessorSubclass::HasElementImpl( | 830 if (ElementsAccessorSubclass::HasElementImpl( |
| 829 receiver, holder, key, from)) { | 831 receiver, holder, key, from)) { |
| 830 Handle<Object> value; | 832 Handle<Object> value; |
| 831 ASSIGN_RETURN_ON_EXCEPTION( | 833 ASSIGN_RETURN_ON_EXCEPTION( |
| 832 isolate, value, | 834 isolate, value, |
| 833 ElementsAccessorSubclass::GetImpl(receiver, holder, key, from), | 835 ElementsAccessorSubclass::GetImpl(receiver, holder, key, from), |
| 834 FixedArray); | 836 FixedArray); |
| 837 if (filter == FixedArray::NON_SYMBOL_KEYS && value->IsSymbol()) { |
| 838 continue; |
| 839 } |
| 835 if (!value->IsTheHole() && !HasKey(to, value)) { | 840 if (!value->IsTheHole() && !HasKey(to, value)) { |
| 836 result->set(len0 + index, *value); | 841 result->set(len0 + index, *value); |
| 837 index++; | 842 index++; |
| 838 } | 843 } |
| 839 } | 844 } |
| 840 } | 845 } |
| 841 DCHECK(extra == index); | 846 DCHECK(extra == index); |
| 842 return result; | 847 return result; |
| 843 } | 848 } |
| 844 | 849 |
| (...skipping 1066 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1911 UNREACHABLE(); | 1916 UNREACHABLE(); |
| 1912 break; | 1917 break; |
| 1913 } | 1918 } |
| 1914 | 1919 |
| 1915 array->set_elements(*elms); | 1920 array->set_elements(*elms); |
| 1916 array->set_length(Smi::FromInt(number_of_elements)); | 1921 array->set_length(Smi::FromInt(number_of_elements)); |
| 1917 return array; | 1922 return array; |
| 1918 } | 1923 } |
| 1919 | 1924 |
| 1920 } } // namespace v8::internal | 1925 } } // namespace v8::internal |
| OLD | NEW |