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 137 matching lines...) Loading... |
148 | 148 |
149 | 149 |
150 static void CopyObjectToObjectElements(FixedArrayBase* from_base, | 150 static void CopyObjectToObjectElements(FixedArrayBase* from_base, |
151 ElementsKind from_kind, | 151 ElementsKind from_kind, |
152 uint32_t from_start, | 152 uint32_t from_start, |
153 FixedArrayBase* to_base, | 153 FixedArrayBase* to_base, |
154 ElementsKind to_kind, | 154 ElementsKind to_kind, |
155 uint32_t to_start, | 155 uint32_t to_start, |
156 int raw_copy_size) { | 156 int raw_copy_size) { |
157 ASSERT(to_base->map() != HEAP->fixed_cow_array_map()); | 157 ASSERT(to_base->map() != HEAP->fixed_cow_array_map()); |
158 AssertNoAllocation no_allocation; | 158 DisallowHeapAllocation no_allocation; |
159 int copy_size = raw_copy_size; | 159 int copy_size = raw_copy_size; |
160 if (raw_copy_size < 0) { | 160 if (raw_copy_size < 0) { |
161 ASSERT(raw_copy_size == ElementsAccessor::kCopyToEnd || | 161 ASSERT(raw_copy_size == ElementsAccessor::kCopyToEnd || |
162 raw_copy_size == ElementsAccessor::kCopyToEndAndInitializeToHole); | 162 raw_copy_size == ElementsAccessor::kCopyToEndAndInitializeToHole); |
163 copy_size = Min(from_base->length() - from_start, | 163 copy_size = Min(from_base->length() - from_start, |
164 to_base->length() - to_start); | 164 to_base->length() - to_start); |
165 if (raw_copy_size == ElementsAccessor::kCopyToEndAndInitializeToHole) { | 165 if (raw_copy_size == ElementsAccessor::kCopyToEndAndInitializeToHole) { |
166 int start = to_start + copy_size; | 166 int start = to_start + copy_size; |
167 int length = to_base->length() - start; | 167 int length = to_base->length() - start; |
168 if (length > 0) { | 168 if (length > 0) { |
(...skipping 28 matching lines...) Loading... |
197 } | 197 } |
198 | 198 |
199 | 199 |
200 static void CopyDictionaryToObjectElements(FixedArrayBase* from_base, | 200 static void CopyDictionaryToObjectElements(FixedArrayBase* from_base, |
201 uint32_t from_start, | 201 uint32_t from_start, |
202 FixedArrayBase* to_base, | 202 FixedArrayBase* to_base, |
203 ElementsKind to_kind, | 203 ElementsKind to_kind, |
204 uint32_t to_start, | 204 uint32_t to_start, |
205 int raw_copy_size) { | 205 int raw_copy_size) { |
206 SeededNumberDictionary* from = SeededNumberDictionary::cast(from_base); | 206 SeededNumberDictionary* from = SeededNumberDictionary::cast(from_base); |
207 AssertNoAllocation no_allocation; | 207 DisallowHeapAllocation no_allocation; |
208 int copy_size = raw_copy_size; | 208 int copy_size = raw_copy_size; |
209 Heap* heap = from->GetHeap(); | 209 Heap* heap = from->GetHeap(); |
210 if (raw_copy_size < 0) { | 210 if (raw_copy_size < 0) { |
211 ASSERT(raw_copy_size == ElementsAccessor::kCopyToEnd || | 211 ASSERT(raw_copy_size == ElementsAccessor::kCopyToEnd || |
212 raw_copy_size == ElementsAccessor::kCopyToEndAndInitializeToHole); | 212 raw_copy_size == ElementsAccessor::kCopyToEndAndInitializeToHole); |
213 copy_size = from->max_number_key() + 1 - from_start; | 213 copy_size = from->max_number_key() + 1 - from_start; |
214 if (raw_copy_size == ElementsAccessor::kCopyToEndAndInitializeToHole) { | 214 if (raw_copy_size == ElementsAccessor::kCopyToEndAndInitializeToHole) { |
215 int start = to_start + copy_size; | 215 int start = to_start + copy_size; |
216 int length = to_base->length() - start; | 216 int length = to_base->length() - start; |
217 if (length > 0) { | 217 if (length > 0) { |
(...skipping 615 matching lines...) Loading... |
833 | 833 |
834 if (extra == 0) return to; | 834 if (extra == 0) return to; |
835 | 835 |
836 // Allocate the result | 836 // Allocate the result |
837 FixedArray* result; | 837 FixedArray* result; |
838 MaybeObject* maybe_obj = from->GetHeap()->AllocateFixedArray(len0 + extra); | 838 MaybeObject* maybe_obj = from->GetHeap()->AllocateFixedArray(len0 + extra); |
839 if (!maybe_obj->To(&result)) return maybe_obj; | 839 if (!maybe_obj->To(&result)) return maybe_obj; |
840 | 840 |
841 // Fill in the content | 841 // Fill in the content |
842 { | 842 { |
843 AssertNoAllocation no_gc; | 843 DisallowHeapAllocation no_gc; |
844 WriteBarrierMode mode = result->GetWriteBarrierMode(no_gc); | 844 WriteBarrierMode mode = result->GetWriteBarrierMode(no_gc); |
845 for (int i = 0; i < len0; i++) { | 845 for (int i = 0; i < len0; i++) { |
846 Object* e = to->get(i); | 846 Object* e = to->get(i); |
847 ASSERT(e->IsString() || e->IsNumber()); | 847 ASSERT(e->IsString() || e->IsNumber()); |
848 result->set(i, e, mode); | 848 result->set(i, e, mode); |
849 } | 849 } |
850 } | 850 } |
851 // Fill in the extra values. | 851 // Fill in the extra values. |
852 uint32_t index = 0; | 852 uint32_t index = 0; |
853 for (uint32_t y = 0; y < len1; y++) { | 853 for (uint32_t y = 0; y < len1; y++) { |
(...skipping 1183 matching lines...) Loading... |
2037 case FAST_HOLEY_SMI_ELEMENTS: | 2037 case FAST_HOLEY_SMI_ELEMENTS: |
2038 case FAST_SMI_ELEMENTS: { | 2038 case FAST_SMI_ELEMENTS: { |
2039 FixedArray* smi_elms = FixedArray::cast(elms); | 2039 FixedArray* smi_elms = FixedArray::cast(elms); |
2040 for (int index = 0; index < number_of_elements; index++) { | 2040 for (int index = 0; index < number_of_elements; index++) { |
2041 smi_elms->set(index, (*args)[index], SKIP_WRITE_BARRIER); | 2041 smi_elms->set(index, (*args)[index], SKIP_WRITE_BARRIER); |
2042 } | 2042 } |
2043 break; | 2043 break; |
2044 } | 2044 } |
2045 case FAST_HOLEY_ELEMENTS: | 2045 case FAST_HOLEY_ELEMENTS: |
2046 case FAST_ELEMENTS: { | 2046 case FAST_ELEMENTS: { |
2047 AssertNoAllocation no_gc; | 2047 DisallowHeapAllocation no_gc; |
2048 WriteBarrierMode mode = elms->GetWriteBarrierMode(no_gc); | 2048 WriteBarrierMode mode = elms->GetWriteBarrierMode(no_gc); |
2049 FixedArray* object_elms = FixedArray::cast(elms); | 2049 FixedArray* object_elms = FixedArray::cast(elms); |
2050 for (int index = 0; index < number_of_elements; index++) { | 2050 for (int index = 0; index < number_of_elements; index++) { |
2051 object_elms->set(index, (*args)[index], mode); | 2051 object_elms->set(index, (*args)[index], mode); |
2052 } | 2052 } |
2053 break; | 2053 break; |
2054 } | 2054 } |
2055 case FAST_HOLEY_DOUBLE_ELEMENTS: | 2055 case FAST_HOLEY_DOUBLE_ELEMENTS: |
2056 case FAST_DOUBLE_ELEMENTS: { | 2056 case FAST_DOUBLE_ELEMENTS: { |
2057 FixedDoubleArray* double_elms = FixedDoubleArray::cast(elms); | 2057 FixedDoubleArray* double_elms = FixedDoubleArray::cast(elms); |
2058 for (int index = 0; index < number_of_elements; index++) { | 2058 for (int index = 0; index < number_of_elements; index++) { |
2059 double_elms->set(index, (*args)[index]->Number()); | 2059 double_elms->set(index, (*args)[index]->Number()); |
2060 } | 2060 } |
2061 break; | 2061 break; |
2062 } | 2062 } |
2063 default: | 2063 default: |
2064 UNREACHABLE(); | 2064 UNREACHABLE(); |
2065 break; | 2065 break; |
2066 } | 2066 } |
2067 | 2067 |
2068 array->set_elements(elms); | 2068 array->set_elements(elms); |
2069 array->set_length(Smi::FromInt(number_of_elements)); | 2069 array->set_length(Smi::FromInt(number_of_elements)); |
2070 return array; | 2070 return array; |
2071 } | 2071 } |
2072 | 2072 |
2073 } } // namespace v8::internal | 2073 } } // namespace v8::internal |
OLD | NEW |