| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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/interpreter/constant-array-builder.h" | 5 #include "src/interpreter/constant-array-builder.h" |
| 6 | 6 |
| 7 #include <functional> | 7 #include <functional> |
| 8 #include <set> | 8 #include <set> |
| 9 | 9 |
| 10 #include "src/isolate.h" | 10 #include "src/isolate.h" |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 125 } | 125 } |
| 126 } | 126 } |
| 127 | 127 |
| 128 Handle<FixedArray> ConstantArrayBuilder::ToFixedArray(Isolate* isolate) { | 128 Handle<FixedArray> ConstantArrayBuilder::ToFixedArray(Isolate* isolate) { |
| 129 // First insert reserved SMI values. | 129 // First insert reserved SMI values. |
| 130 for (auto reserved_smi : smi_pairs_) { | 130 for (auto reserved_smi : smi_pairs_) { |
| 131 InsertAllocatedEntry(reserved_smi.second, | 131 InsertAllocatedEntry(reserved_smi.second, |
| 132 handle(reserved_smi.first, isolate)); | 132 handle(reserved_smi.first, isolate)); |
| 133 } | 133 } |
| 134 | 134 |
| 135 Handle<FixedArray> fixed_array = isolate->factory()->NewFixedArray( | 135 Handle<FixedArray> fixed_array = isolate->factory()->NewFixedArrayWithHoles( |
| 136 static_cast<int>(size()), PretenureFlag::TENURED); | 136 static_cast<int>(size()), PretenureFlag::TENURED); |
| 137 int array_index = 0; | 137 int array_index = 0; |
| 138 for (const ConstantArraySlice* slice : idx_slice_) { | 138 for (const ConstantArraySlice* slice : idx_slice_) { |
| 139 if (array_index == fixed_array->length()) { | |
| 140 break; | |
| 141 } | |
| 142 DCHECK(array_index == 0 || | 139 DCHECK(array_index == 0 || |
| 143 base::bits::IsPowerOfTwo32(static_cast<uint32_t>(array_index))); | 140 base::bits::IsPowerOfTwo32(static_cast<uint32_t>(array_index))); |
| 144 #if DEBUG | 141 #if DEBUG |
| 145 // Different slices might contain the same element due to reservations, but | 142 // Different slices might contain the same element due to reservations, but |
| 146 // all elements within a slice should be unique. If this DCHECK fails, then | 143 // all elements within a slice should be unique. If this DCHECK fails, then |
| 147 // the AST nodes are not being internalized within a CanonicalHandleScope. | 144 // the AST nodes are not being internalized within a CanonicalHandleScope. |
| 148 slice->CheckAllElementsAreUnique(); | 145 slice->CheckAllElementsAreUnique(); |
| 149 #endif | 146 #endif |
| 150 // Copy objects from slice into array. | 147 // Copy objects from slice into array. |
| 151 for (size_t i = 0; i < slice->size(); ++i) { | 148 for (size_t i = 0; i < slice->size(); ++i) { |
| 152 fixed_array->set(array_index++, *slice->At(slice->start_index() + i)); | 149 fixed_array->set(array_index++, *slice->At(slice->start_index() + i)); |
| 153 } | 150 } |
| 154 // Insert holes where reservations led to unused slots. | 151 // Leave holes where reservations led to unused slots. |
| 155 size_t padding = | 152 size_t padding = slice->capacity() - slice->size(); |
| 156 std::min(static_cast<size_t>(fixed_array->length() - array_index), | 153 if (static_cast<size_t>(fixed_array->length() - array_index) <= padding) { |
| 157 slice->capacity() - slice->size()); | 154 break; |
| 158 for (size_t i = 0; i < padding; i++) { | |
| 159 fixed_array->set(array_index++, *the_hole_value()); | |
| 160 } | 155 } |
| 156 array_index += padding; |
| 161 } | 157 } |
| 162 DCHECK_EQ(array_index, fixed_array->length()); | 158 DCHECK_GE(array_index, fixed_array->length()); |
| 163 return fixed_array; | 159 return fixed_array; |
| 164 } | 160 } |
| 165 | 161 |
| 166 size_t ConstantArrayBuilder::Insert(Handle<Object> object) { | 162 size_t ConstantArrayBuilder::Insert(Handle<Object> object) { |
| 167 return constants_map_ | 163 return constants_map_ |
| 168 .LookupOrInsert(object.address(), ObjectHash(object.address()), | 164 .LookupOrInsert(object.address(), ObjectHash(object.address()), |
| 169 [&]() { return AllocateIndex(object); }, | 165 [&]() { return AllocateIndex(object); }, |
| 170 ZoneAllocationPolicy(zone_)) | 166 ZoneAllocationPolicy(zone_)) |
| 171 ->value; | 167 ->value; |
| 172 } | 168 } |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 254 return index; | 250 return index; |
| 255 } | 251 } |
| 256 | 252 |
| 257 void ConstantArrayBuilder::DiscardReservedEntry(OperandSize operand_size) { | 253 void ConstantArrayBuilder::DiscardReservedEntry(OperandSize operand_size) { |
| 258 OperandSizeToSlice(operand_size)->Unreserve(); | 254 OperandSizeToSlice(operand_size)->Unreserve(); |
| 259 } | 255 } |
| 260 | 256 |
| 261 } // namespace interpreter | 257 } // namespace interpreter |
| 262 } // namespace internal | 258 } // namespace internal |
| 263 } // namespace v8 | 259 } // namespace v8 |
| OLD | NEW |