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 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
119 } | 119 } |
120 } | 120 } |
121 | 121 |
122 Handle<FixedArray> ConstantArrayBuilder::ToFixedArray(Isolate* isolate) { | 122 Handle<FixedArray> ConstantArrayBuilder::ToFixedArray(Isolate* isolate) { |
123 // First insert reserved SMI values. | 123 // First insert reserved SMI values. |
124 for (auto reserved_smi : smi_pairs_) { | 124 for (auto reserved_smi : smi_pairs_) { |
125 InsertAllocatedEntry(reserved_smi.second, | 125 InsertAllocatedEntry(reserved_smi.second, |
126 handle(reserved_smi.first, isolate)); | 126 handle(reserved_smi.first, isolate)); |
127 } | 127 } |
128 | 128 |
129 Handle<FixedArray> fixed_array = isolate->factory()->NewFixedArray( | 129 Handle<FixedArray> fixed_array = isolate->factory()->NewFixedArrayWithHoles( |
130 static_cast<int>(size()), PretenureFlag::TENURED); | 130 static_cast<int>(size()), PretenureFlag::TENURED); |
131 int array_index = 0; | 131 int array_index = 0; |
132 for (const ConstantArraySlice* slice : idx_slice_) { | 132 for (const ConstantArraySlice* slice : idx_slice_) { |
133 if (array_index == fixed_array->length()) { | 133 if (array_index >= fixed_array->length()) break; |
134 break; | 134 |
135 } | |
136 DCHECK(array_index == 0 || | 135 DCHECK(array_index == 0 || |
137 base::bits::IsPowerOfTwo32(static_cast<uint32_t>(array_index))); | 136 base::bits::IsPowerOfTwo32(static_cast<uint32_t>(array_index))); |
138 // Different slices might contain the same element due to reservations, but | 137 // Different slices might contain the same element due to reservations, but |
139 // all elements within a slice should be unique. If this DCHECK fails, then | 138 // all elements within a slice should be unique. If this DCHECK fails, then |
140 // the AST nodes are not being internalized within a CanonicalHandleScope. | 139 // the AST nodes are not being internalized within a CanonicalHandleScope. |
141 DCHECK(slice->AllElementsAreUnique()); | 140 DCHECK(slice->AllElementsAreUnique()); |
142 // Copy objects from slice into array. | 141 // Copy objects from slice into array. |
143 for (size_t i = 0; i < slice->size(); ++i) { | 142 for (size_t i = 0; i < slice->size(); ++i) { |
144 fixed_array->set(array_index++, *slice->At(slice->start_index() + i)); | 143 fixed_array->set(array_index++, *slice->At(slice->start_index() + i)); |
145 } | 144 } |
146 // Insert holes where reservations led to unused slots. | 145 // Leave holes where reservations led to unused slots. |
147 size_t padding = | 146 array_index += slice->capacity() - slice->size(); |
148 std::min(static_cast<size_t>(fixed_array->length() - array_index), | |
149 slice->capacity() - slice->size()); | |
150 for (size_t i = 0; i < padding; i++) { | |
151 fixed_array->set(array_index++, *the_hole_value()); | |
152 } | |
153 } | 147 } |
154 DCHECK_EQ(array_index, fixed_array->length()); | |
Leszek Swirski
2016/12/16 16:50:54
I would keep this check, as a DCHECK_GE
| |
155 return fixed_array; | 148 return fixed_array; |
156 } | 149 } |
157 | 150 |
158 size_t ConstantArrayBuilder::Insert(Handle<Object> object) { | 151 size_t ConstantArrayBuilder::Insert(Handle<Object> object) { |
159 return constants_map_ | 152 return constants_map_ |
160 .LookupOrInsert(object.address(), ObjectHash(object.address()), | 153 .LookupOrInsert(object.address(), ObjectHash(object.address()), |
161 [&]() { return AllocateIndex(object); }, | 154 [&]() { return AllocateIndex(object); }, |
162 ZoneAllocationPolicy(zone_)) | 155 ZoneAllocationPolicy(zone_)) |
163 ->value; | 156 ->value; |
164 } | 157 } |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
246 return index; | 239 return index; |
247 } | 240 } |
248 | 241 |
249 void ConstantArrayBuilder::DiscardReservedEntry(OperandSize operand_size) { | 242 void ConstantArrayBuilder::DiscardReservedEntry(OperandSize operand_size) { |
250 OperandSizeToSlice(operand_size)->Unreserve(); | 243 OperandSizeToSlice(operand_size)->Unreserve(); |
251 } | 244 } |
252 | 245 |
253 } // namespace interpreter | 246 } // namespace interpreter |
254 } // namespace internal | 247 } // namespace internal |
255 } // namespace v8 | 248 } // namespace v8 |
OLD | NEW |