| OLD | NEW |
| 1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 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 #include "src/code-stub-assembler.h" | 4 #include "src/code-stub-assembler.h" |
| 5 #include "src/code-factory.h" | 5 #include "src/code-factory.h" |
| 6 #include "src/frames-inl.h" | 6 #include "src/frames-inl.h" |
| 7 #include "src/frames.h" | 7 #include "src/frames.h" |
| 8 | 8 |
| 9 namespace v8 { | 9 namespace v8 { |
| 10 namespace internal { | 10 namespace internal { |
| (...skipping 1994 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2005 int elements_offset = base_size; | 2005 int elements_offset = base_size; |
| 2006 | 2006 |
| 2007 // Compute space for elements | 2007 // Compute space for elements |
| 2008 base_size += FixedArray::kHeaderSize; | 2008 base_size += FixedArray::kHeaderSize; |
| 2009 Node* size = ElementOffsetFromIndex(capacity, kind, capacity_mode, base_size); | 2009 Node* size = ElementOffsetFromIndex(capacity, kind, capacity_mode, base_size); |
| 2010 | 2010 |
| 2011 Node* array = AllocateUninitializedJSArray(kind, array_map, length, | 2011 Node* array = AllocateUninitializedJSArray(kind, array_map, length, |
| 2012 allocation_site, size); | 2012 allocation_site, size); |
| 2013 | 2013 |
| 2014 Node* elements = InnerAllocate(array, elements_offset); | 2014 Node* elements = InnerAllocate(array, elements_offset); |
| 2015 StoreObjectField(array, JSObject::kElementsOffset, elements); | 2015 StoreObjectFieldNoWriteBarrier(array, JSObject::kElementsOffset, elements); |
| 2016 | 2016 |
| 2017 return {array, elements}; | 2017 return {array, elements}; |
| 2018 } | 2018 } |
| 2019 | 2019 |
| 2020 Node* CodeStubAssembler::AllocateUninitializedJSArray(ElementsKind kind, | 2020 Node* CodeStubAssembler::AllocateUninitializedJSArray(ElementsKind kind, |
| 2021 Node* array_map, | 2021 Node* array_map, |
| 2022 Node* length, | 2022 Node* length, |
| 2023 Node* allocation_site, | 2023 Node* allocation_site, |
| 2024 Node* size_in_bytes) { | 2024 Node* size_in_bytes) { |
| 2025 Node* array = Allocate(size_in_bytes); | 2025 Node* array = Allocate(size_in_bytes); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 2036 if (allocation_site != nullptr) { | 2036 if (allocation_site != nullptr) { |
| 2037 InitializeAllocationMemento(array, JSArray::kSize, allocation_site); | 2037 InitializeAllocationMemento(array, JSArray::kSize, allocation_site); |
| 2038 } | 2038 } |
| 2039 return array; | 2039 return array; |
| 2040 } | 2040 } |
| 2041 | 2041 |
| 2042 Node* CodeStubAssembler::AllocateJSArray(ElementsKind kind, Node* array_map, | 2042 Node* CodeStubAssembler::AllocateJSArray(ElementsKind kind, Node* array_map, |
| 2043 Node* capacity, Node* length, | 2043 Node* capacity, Node* length, |
| 2044 Node* allocation_site, | 2044 Node* allocation_site, |
| 2045 ParameterMode capacity_mode) { | 2045 ParameterMode capacity_mode) { |
| 2046 // Allocate both array and elements object, and initialize the JSArray. | 2046 Node *array = nullptr, *elements = nullptr; |
| 2047 Node *array, *elements; | 2047 int32_t constant_capacity; |
| 2048 std::tie(array, elements) = AllocateUninitializedJSArrayWithElements( | 2048 if (ToInt32Constant(capacity, constant_capacity) && constant_capacity == 0) { |
| 2049 kind, array_map, length, allocation_site, capacity, capacity_mode); | 2049 // Array is empty. Use the shared empty fixed array instead of allocating a |
| 2050 // Setup elements object. | 2050 // new one. |
| 2051 Heap::RootListIndex elements_map_index = | 2051 array = AllocateUninitializedJSArrayWithoutElements(kind, array_map, length, |
| 2052 IsFastDoubleElementsKind(kind) ? Heap::kFixedDoubleArrayMapRootIndex | 2052 nullptr); |
| 2053 : Heap::kFixedArrayMapRootIndex; | 2053 StoreObjectFieldRoot(array, JSArray::kElementsOffset, |
| 2054 DCHECK(Heap::RootIsImmortalImmovable(elements_map_index)); | 2054 Heap::kEmptyFixedArrayRootIndex); |
| 2055 StoreMapNoWriteBarrier(elements, elements_map_index); | 2055 } else { |
| 2056 StoreObjectFieldNoWriteBarrier(elements, FixedArray::kLengthOffset, | 2056 // Allocate both array and elements object, and initialize the JSArray. |
| 2057 ParameterToTagged(capacity, capacity_mode)); | 2057 std::tie(array, elements) = AllocateUninitializedJSArrayWithElements( |
| 2058 | 2058 kind, array_map, length, allocation_site, capacity, capacity_mode); |
| 2059 // Fill in the elements with holes. | 2059 // Setup elements object. |
| 2060 FillFixedArrayWithValue(kind, elements, IntPtrOrSmiConstant(0, capacity_mode), | 2060 Heap::RootListIndex elements_map_index = |
| 2061 capacity, Heap::kTheHoleValueRootIndex, | 2061 IsFastDoubleElementsKind(kind) ? Heap::kFixedDoubleArrayMapRootIndex |
| 2062 capacity_mode); | 2062 : Heap::kFixedArrayMapRootIndex; |
| 2063 DCHECK(Heap::RootIsImmortalImmovable(elements_map_index)); |
| 2064 StoreMapNoWriteBarrier(elements, elements_map_index); |
| 2065 StoreObjectFieldNoWriteBarrier(elements, FixedArray::kLengthOffset, |
| 2066 ParameterToTagged(capacity, capacity_mode)); |
| 2067 // Fill in the elements with holes. |
| 2068 FillFixedArrayWithValue(kind, elements, |
| 2069 IntPtrOrSmiConstant(0, capacity_mode), capacity, |
| 2070 Heap::kTheHoleValueRootIndex, capacity_mode); |
| 2071 } |
| 2063 | 2072 |
| 2064 return array; | 2073 return array; |
| 2065 } | 2074 } |
| 2066 | 2075 |
| 2067 Node* CodeStubAssembler::AllocateFixedArray(ElementsKind kind, | 2076 Node* CodeStubAssembler::AllocateFixedArray(ElementsKind kind, |
| 2068 Node* capacity_node, | 2077 Node* capacity_node, |
| 2069 ParameterMode mode, | 2078 ParameterMode mode, |
| 2070 AllocationFlags flags) { | 2079 AllocationFlags flags) { |
| 2071 CSA_ASSERT(this, IntPtrOrSmiGreaterThan(capacity_node, | 2080 CSA_ASSERT(this, IntPtrOrSmiGreaterThan(capacity_node, |
| 2072 IntPtrOrSmiConstant(0, mode), mode)); | 2081 IntPtrOrSmiConstant(0, mode), mode)); |
| (...skipping 6168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8241 deferred_on_reject); | 8250 deferred_on_reject); |
| 8242 StoreObjectFieldNoWriteBarrier(result, PromiseReactionJobInfo::kDebugIdOffset, | 8251 StoreObjectFieldNoWriteBarrier(result, PromiseReactionJobInfo::kDebugIdOffset, |
| 8243 SmiConstant(kDebugPromiseNoID)); | 8252 SmiConstant(kDebugPromiseNoID)); |
| 8244 StoreObjectFieldNoWriteBarrier(result, PromiseReactionJobInfo::kContextOffset, | 8253 StoreObjectFieldNoWriteBarrier(result, PromiseReactionJobInfo::kContextOffset, |
| 8245 context); | 8254 context); |
| 8246 return result; | 8255 return result; |
| 8247 } | 8256 } |
| 8248 | 8257 |
| 8249 } // namespace internal | 8258 } // namespace internal |
| 8250 } // namespace v8 | 8259 } // namespace v8 |
| OLD | NEW |