Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(61)

Side by Side Diff: test/unittests/interpreter/constant-array-builder-unittest.cc

Issue 2167763003: [Interpreter] Avoid allocating pairs array in VisitDeclarations. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@int_merge_binary
Patch Set: Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 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/factory.h" 7 #include "src/factory.h"
8 #include "src/handles-inl.h" 8 #include "src/handles-inl.h"
9 #include "src/interpreter/constant-array-builder.h" 9 #include "src/interpreter/constant-array-builder.h"
10 #include "src/isolate.h" 10 #include "src/isolate.h"
(...skipping 25 matching lines...) Expand all
36 CHECK_EQ(builder.size(), k16BitCapacity); 36 CHECK_EQ(builder.size(), k16BitCapacity);
37 for (size_t i = 0; i < k16BitCapacity; i++) { 37 for (size_t i = 0; i < k16BitCapacity; i++) {
38 CHECK_EQ(Handle<Smi>::cast(builder.At(i))->value(), i); 38 CHECK_EQ(Handle<Smi>::cast(builder.At(i))->value(), i);
39 } 39 }
40 } 40 }
41 41
42 TEST_F(ConstantArrayBuilderTest, AllocateEntriesWithIdx8Reservations) { 42 TEST_F(ConstantArrayBuilderTest, AllocateEntriesWithIdx8Reservations) {
43 for (size_t reserved = 1; reserved < k8BitCapacity; reserved *= 3) { 43 for (size_t reserved = 1; reserved < k8BitCapacity; reserved *= 3) {
44 ConstantArrayBuilder builder(isolate(), zone()); 44 ConstantArrayBuilder builder(isolate(), zone());
45 for (size_t i = 0; i < reserved; i++) { 45 for (size_t i = 0; i < reserved; i++) {
46 OperandSize operand_size = builder.CreateReservedEntry(); 46 OperandSize operand_size = builder.CreateDiscardableReservedEntry();
47 CHECK(operand_size == OperandSize::kByte); 47 CHECK(operand_size == OperandSize::kByte);
48 } 48 }
49 for (size_t i = 0; i < 2 * k8BitCapacity; i++) { 49 for (size_t i = 0; i < 2 * k8BitCapacity; i++) {
50 Handle<Object> object = isolate()->factory()->NewNumberFromSize(i); 50 Handle<Object> object = isolate()->factory()->NewNumberFromSize(i);
51 builder.Insert(object); 51 builder.Insert(object);
52 if (i + reserved < k8BitCapacity) { 52 if (i + reserved < k8BitCapacity) {
53 CHECK_LE(builder.size(), k8BitCapacity); 53 CHECK_LE(builder.size(), k8BitCapacity);
54 CHECK_EQ(builder.size(), i + 1); 54 CHECK_EQ(builder.size(), i + 1);
55 CHECK(builder.At(i)->SameValue(*object)); 55 CHECK(builder.At(i)->SameValue(*object));
56 } else { 56 } else {
(...skipping 30 matching lines...) Expand all
87 Smi* smi = Smi::FromInt(static_cast<int>(i - reserved)); 87 Smi* smi = Smi::FromInt(static_cast<int>(i - reserved));
88 CHECK(Handle<Smi>::cast(builder.At(i))->SameValue(smi)); 88 CHECK(Handle<Smi>::cast(builder.At(i))->SameValue(smi));
89 } 89 }
90 for (size_t i = 0; i < reserved; i++) { 90 for (size_t i = 0; i < reserved; i++) {
91 size_t index = k8BitCapacity - reserved + i; 91 size_t index = k8BitCapacity - reserved + i;
92 CHECK(builder.At(index)->IsTheHole(isolate())); 92 CHECK(builder.At(index)->IsTheHole(isolate()));
93 } 93 }
94 94
95 // Now make reservations, and commit them with unique entries. 95 // Now make reservations, and commit them with unique entries.
96 for (size_t i = 0; i < duplicates_in_idx8_space; i++) { 96 for (size_t i = 0; i < duplicates_in_idx8_space; i++) {
97 OperandSize operand_size = builder.CreateReservedEntry(); 97 OperandSize operand_size = builder.CreateDiscardableReservedEntry();
98 CHECK(operand_size == OperandSize::kByte); 98 CHECK(operand_size == OperandSize::kByte);
99 } 99 }
100 for (size_t i = 0; i < duplicates_in_idx8_space; i++) { 100 for (size_t i = 0; i < duplicates_in_idx8_space; i++) {
101 Handle<Object> object = 101 Handle<Object> object =
102 isolate()->factory()->NewNumberFromSize(2 * k8BitCapacity + i); 102 isolate()->factory()->NewNumberFromSize(2 * k8BitCapacity + i);
103 size_t index = builder.CommitReservedEntry(OperandSize::kByte, object); 103 size_t index = builder.CommitReservedEntry(OperandSize::kByte, object);
104 CHECK_EQ(static_cast<int>(index), k8BitCapacity - reserved + i); 104 CHECK_EQ(static_cast<int>(index), k8BitCapacity - reserved + i);
105 CHECK(builder.At(static_cast<int>(index))->SameValue(*object)); 105 CHECK(builder.At(static_cast<int>(index))->SameValue(*object));
106 } 106 }
107 CHECK_EQ(builder.size(), 2 * k8BitCapacity + reserved); 107 CHECK_EQ(builder.size(), 2 * k8BitCapacity + reserved);
108 } 108 }
109 } 109 }
110 110
111 TEST_F(ConstantArrayBuilderTest, AllocateEntriesWithWideReservations) { 111 TEST_F(ConstantArrayBuilderTest, AllocateEntriesWithWideReservations) {
112 for (size_t reserved = 1; reserved < k8BitCapacity; reserved *= 3) { 112 for (size_t reserved = 1; reserved < k8BitCapacity; reserved *= 3) {
113 ConstantArrayBuilder builder(isolate(), zone()); 113 ConstantArrayBuilder builder(isolate(), zone());
114 for (size_t i = 0; i < k8BitCapacity; i++) { 114 for (size_t i = 0; i < k8BitCapacity; i++) {
115 Handle<Object> object = isolate()->factory()->NewNumberFromSize(i); 115 Handle<Object> object = isolate()->factory()->NewNumberFromSize(i);
116 builder.Insert(object); 116 builder.Insert(object);
117 CHECK(builder.At(i)->SameValue(*object)); 117 CHECK(builder.At(i)->SameValue(*object));
118 CHECK_EQ(builder.size(), i + 1); 118 CHECK_EQ(builder.size(), i + 1);
119 } 119 }
120 for (size_t i = 0; i < reserved; i++) { 120 for (size_t i = 0; i < reserved; i++) {
121 OperandSize operand_size = builder.CreateReservedEntry(); 121 OperandSize operand_size = builder.CreateDiscardableReservedEntry();
122 CHECK(operand_size == OperandSize::kShort); 122 CHECK(operand_size == OperandSize::kShort);
123 CHECK_EQ(builder.size(), k8BitCapacity); 123 CHECK_EQ(builder.size(), k8BitCapacity);
124 } 124 }
125 for (size_t i = 0; i < reserved; i++) { 125 for (size_t i = 0; i < reserved; i++) {
126 builder.DiscardReservedEntry(OperandSize::kShort); 126 builder.DiscardReservedEntry(OperandSize::kShort);
127 CHECK_EQ(builder.size(), k8BitCapacity); 127 CHECK_EQ(builder.size(), k8BitCapacity);
128 } 128 }
129 for (size_t i = 0; i < reserved; i++) { 129 for (size_t i = 0; i < reserved; i++) {
130 OperandSize operand_size = builder.CreateReservedEntry(); 130 OperandSize operand_size = builder.CreateDiscardableReservedEntry();
131 CHECK(operand_size == OperandSize::kShort); 131 CHECK(operand_size == OperandSize::kShort);
132 Handle<Object> object = isolate()->factory()->NewNumberFromSize(i); 132 Handle<Object> object = isolate()->factory()->NewNumberFromSize(i);
133 builder.CommitReservedEntry(operand_size, object); 133 builder.CommitReservedEntry(operand_size, object);
134 CHECK_EQ(builder.size(), k8BitCapacity); 134 CHECK_EQ(builder.size(), k8BitCapacity);
135 } 135 }
136 for (size_t i = k8BitCapacity; i < k8BitCapacity + reserved; i++) { 136 for (size_t i = k8BitCapacity; i < k8BitCapacity + reserved; i++) {
137 OperandSize operand_size = builder.CreateReservedEntry(); 137 OperandSize operand_size = builder.CreateDiscardableReservedEntry();
138 CHECK(operand_size == OperandSize::kShort); 138 CHECK(operand_size == OperandSize::kShort);
139 Handle<Object> object = isolate()->factory()->NewNumberFromSize(i); 139 Handle<Object> object = isolate()->factory()->NewNumberFromSize(i);
140 builder.CommitReservedEntry(operand_size, object); 140 builder.CommitReservedEntry(operand_size, object);
141 CHECK_EQ(builder.size(), i + 1); 141 CHECK_EQ(builder.size(), i + 1);
142 } 142 }
143 } 143 }
144 } 144 }
145 145
146 146
147 TEST_F(ConstantArrayBuilderTest, ToFixedArray) { 147 TEST_F(ConstantArrayBuilderTest, ToFixedArray) {
(...skipping 22 matching lines...) Expand all
170 Handle<FixedArray> constant_array = builder.ToFixedArray(); 170 Handle<FixedArray> constant_array = builder.ToFixedArray();
171 CHECK_EQ(constant_array->length(), kNumberOfElements); 171 CHECK_EQ(constant_array->length(), kNumberOfElements);
172 for (size_t i = 0; i < kNumberOfElements; i++) { 172 for (size_t i = 0; i < kNumberOfElements; i++) {
173 CHECK(constant_array->get(static_cast<int>(i))->SameValue(*builder.At(i))); 173 CHECK(constant_array->get(static_cast<int>(i))->SameValue(*builder.At(i)));
174 } 174 }
175 } 175 }
176 176
177 TEST_F(ConstantArrayBuilderTest, GapFilledWhenLowReservationCommitted) { 177 TEST_F(ConstantArrayBuilderTest, GapFilledWhenLowReservationCommitted) {
178 ConstantArrayBuilder builder(isolate(), zone()); 178 ConstantArrayBuilder builder(isolate(), zone());
179 for (size_t i = 0; i < k8BitCapacity; i++) { 179 for (size_t i = 0; i < k8BitCapacity; i++) {
180 OperandSize operand_size = builder.CreateReservedEntry(); 180 OperandSize operand_size = builder.CreateDiscardableReservedEntry();
181 CHECK(OperandSize::kByte == operand_size); 181 CHECK(OperandSize::kByte == operand_size);
182 CHECK_EQ(builder.size(), 0); 182 CHECK_EQ(builder.size(), 0);
183 } 183 }
184 for (size_t i = 0; i < k8BitCapacity; i++) { 184 for (size_t i = 0; i < k8BitCapacity; i++) {
185 Handle<Object> object = isolate()->factory()->NewNumberFromSize(i); 185 Handle<Object> object = isolate()->factory()->NewNumberFromSize(i);
186 builder.Insert(object); 186 builder.Insert(object);
187 CHECK_EQ(builder.size(), i + k8BitCapacity + 1); 187 CHECK_EQ(builder.size(), i + k8BitCapacity + 1);
188 } 188 }
189 for (size_t i = 0; i < k8BitCapacity; i++) { 189 for (size_t i = 0; i < k8BitCapacity; i++) {
190 builder.CommitReservedEntry(OperandSize::kByte, 190 builder.CommitReservedEntry(OperandSize::kByte,
191 builder.At(i + k8BitCapacity)); 191 builder.At(i + k8BitCapacity));
192 CHECK_EQ(builder.size(), 2 * k8BitCapacity); 192 CHECK_EQ(builder.size(), 2 * k8BitCapacity);
193 } 193 }
194 for (size_t i = 0; i < k8BitCapacity; i++) { 194 for (size_t i = 0; i < k8BitCapacity; i++) {
195 Handle<Object> original = builder.At(k8BitCapacity + i); 195 Handle<Object> original = builder.At(k8BitCapacity + i);
196 Handle<Object> duplicate = builder.At(i); 196 Handle<Object> duplicate = builder.At(i);
197 CHECK(original->SameValue(*duplicate)); 197 CHECK(original->SameValue(*duplicate));
198 Handle<Object> reference = isolate()->factory()->NewNumberFromSize(i); 198 Handle<Object> reference = isolate()->factory()->NewNumberFromSize(i);
199 CHECK(original->SameValue(*reference)); 199 CHECK(original->SameValue(*reference));
200 } 200 }
201 } 201 }
202 202
203 TEST_F(ConstantArrayBuilderTest, GapNotFilledWhenLowReservationDiscarded) { 203 TEST_F(ConstantArrayBuilderTest, GapNotFilledWhenLowReservationDiscarded) {
204 ConstantArrayBuilder builder(isolate(), zone()); 204 ConstantArrayBuilder builder(isolate(), zone());
205 for (size_t i = 0; i < k8BitCapacity; i++) { 205 for (size_t i = 0; i < k8BitCapacity; i++) {
206 OperandSize operand_size = builder.CreateReservedEntry(); 206 OperandSize operand_size = builder.CreateDiscardableReservedEntry();
207 CHECK(OperandSize::kByte == operand_size); 207 CHECK(OperandSize::kByte == operand_size);
208 CHECK_EQ(builder.size(), 0); 208 CHECK_EQ(builder.size(), 0);
209 } 209 }
210 for (size_t i = 0; i < k8BitCapacity; i++) { 210 for (size_t i = 0; i < k8BitCapacity; i++) {
211 Handle<Object> object = isolate()->factory()->NewNumberFromSize(i); 211 Handle<Object> object = isolate()->factory()->NewNumberFromSize(i);
212 builder.Insert(object); 212 builder.Insert(object);
213 CHECK_EQ(builder.size(), i + k8BitCapacity + 1); 213 CHECK_EQ(builder.size(), i + k8BitCapacity + 1);
214 } 214 }
215 for (size_t i = 0; i < k8BitCapacity; i++) { 215 for (size_t i = 0; i < k8BitCapacity; i++) {
216 builder.DiscardReservedEntry(OperandSize::kByte); 216 builder.DiscardReservedEntry(OperandSize::kByte);
217 builder.Insert(builder.At(i + k8BitCapacity)); 217 builder.Insert(builder.At(i + k8BitCapacity));
218 CHECK_EQ(builder.size(), 2 * k8BitCapacity); 218 CHECK_EQ(builder.size(), 2 * k8BitCapacity);
219 } 219 }
220 for (size_t i = 0; i < k8BitCapacity; i++) { 220 for (size_t i = 0; i < k8BitCapacity; i++) {
221 Handle<Object> reference = isolate()->factory()->NewNumberFromSize(i); 221 Handle<Object> reference = isolate()->factory()->NewNumberFromSize(i);
222 Handle<Object> original = builder.At(k8BitCapacity + i); 222 Handle<Object> original = builder.At(k8BitCapacity + i);
223 CHECK(original->SameValue(*reference)); 223 CHECK(original->SameValue(*reference));
224 Handle<Object> duplicate = builder.At(i); 224 Handle<Object> duplicate = builder.At(i);
225 CHECK(duplicate->SameValue(*isolate()->factory()->the_hole_value())); 225 CHECK(duplicate->SameValue(*isolate()->factory()->the_hole_value()));
226 } 226 }
227 } 227 }
228 228
229 TEST_F(ConstantArrayBuilderTest, HolesWithUnusedReservations) { 229 TEST_F(ConstantArrayBuilderTest, HolesWithUnusedReservations) {
230 static int kNumberOfHoles = 128; 230 static int kNumberOfHoles = 128;
231 ConstantArrayBuilder builder(isolate(), zone()); 231 ConstantArrayBuilder builder(isolate(), zone());
232 for (int i = 0; i < kNumberOfHoles; ++i) { 232 for (int i = 0; i < kNumberOfHoles; ++i) {
233 CHECK_EQ(builder.CreateReservedEntry(), OperandSize::kByte); 233 CHECK_EQ(builder.CreateDiscardableReservedEntry(), OperandSize::kByte);
234 } 234 }
235 for (int i = 0; i < 128; ++i) { 235 for (int i = 0; i < 128; ++i) {
236 CHECK_EQ(builder.Insert(isolate()->factory()->NewNumber(i)), i); 236 CHECK_EQ(builder.Insert(isolate()->factory()->NewNumber(i)), i);
237 } 237 }
238 CHECK_EQ(builder.Insert(isolate()->factory()->NewNumber(256)), 256); 238 CHECK_EQ(builder.Insert(isolate()->factory()->NewNumber(256)), 256);
239 239
240 Handle<FixedArray> constant_array = builder.ToFixedArray(); 240 Handle<FixedArray> constant_array = builder.ToFixedArray();
241 CHECK_EQ(constant_array->length(), 257); 241 CHECK_EQ(constant_array->length(), 257);
242 for (int i = 128; i < 256; i++) { 242 for (int i = 128; i < 256; i++) {
243 CHECK(constant_array->get(i)->SameValue( 243 CHECK(constant_array->get(i)->SameValue(
244 *isolate()->factory()->the_hole_value())); 244 *isolate()->factory()->the_hole_value()));
245 } 245 }
246 CHECK(!constant_array->get(127)->SameValue( 246 CHECK(!constant_array->get(127)->SameValue(
247 *isolate()->factory()->the_hole_value())); 247 *isolate()->factory()->the_hole_value()));
248 CHECK(!constant_array->get(256)->SameValue( 248 CHECK(!constant_array->get(256)->SameValue(
249 *isolate()->factory()->the_hole_value())); 249 *isolate()->factory()->the_hole_value()));
250 } 250 }
251 251
252 TEST_F(ConstantArrayBuilderTest, ReservationsAtAllScales) { 252 TEST_F(ConstantArrayBuilderTest, ReservationsAtAllScales) {
253 ConstantArrayBuilder builder(isolate(), zone()); 253 ConstantArrayBuilder builder(isolate(), zone());
254 for (int i = 0; i < 256; i++) { 254 for (int i = 0; i < 256; i++) {
255 CHECK_EQ(builder.CreateReservedEntry(), OperandSize::kByte); 255 CHECK_EQ(builder.CreateDiscardableReservedEntry(), OperandSize::kByte);
256 } 256 }
257 for (int i = 256; i < 65536; ++i) { 257 for (int i = 256; i < 65536; ++i) {
258 CHECK_EQ(builder.CreateReservedEntry(), OperandSize::kShort); 258 CHECK_EQ(builder.CreateDiscardableReservedEntry(), OperandSize::kShort);
259 } 259 }
260 for (int i = 65536; i < 131072; ++i) { 260 for (int i = 65536; i < 131072; ++i) {
261 CHECK_EQ(builder.CreateReservedEntry(), OperandSize::kQuad); 261 CHECK_EQ(builder.CreateDiscardableReservedEntry(), OperandSize::kQuad);
262 } 262 }
263 CHECK_EQ(builder.CommitReservedEntry(OperandSize::kByte, 263 CHECK_EQ(builder.CommitReservedEntry(OperandSize::kByte,
264 isolate()->factory()->NewNumber(1)), 264 isolate()->factory()->NewNumber(1)),
265 0); 265 0);
266 CHECK_EQ(builder.CommitReservedEntry(OperandSize::kShort, 266 CHECK_EQ(builder.CommitReservedEntry(OperandSize::kShort,
267 isolate()->factory()->NewNumber(2)), 267 isolate()->factory()->NewNumber(2)),
268 256); 268 256);
269 CHECK_EQ(builder.CommitReservedEntry(OperandSize::kQuad, 269 CHECK_EQ(builder.CommitReservedEntry(OperandSize::kQuad,
270 isolate()->factory()->NewNumber(3)), 270 isolate()->factory()->NewNumber(3)),
271 65536); 271 65536);
272 Handle<FixedArray> constant_array = builder.ToFixedArray(); 272 Handle<FixedArray> constant_array = builder.ToFixedArray();
273 CHECK_EQ(constant_array->length(), 65537); 273 CHECK_EQ(constant_array->length(), 65537);
274 int count = 1; 274 int count = 1;
275 for (int i = 0; i < constant_array->length(); ++i) { 275 for (int i = 0; i < constant_array->length(); ++i) {
276 Handle<Object> expected; 276 Handle<Object> expected;
277 if (i == 0 || i == 256 || i == 65536) { 277 if (i == 0 || i == 256 || i == 65536) {
278 expected = isolate()->factory()->NewNumber(count++); 278 expected = isolate()->factory()->NewNumber(count++);
279 } else { 279 } else {
280 expected = isolate()->factory()->the_hole_value(); 280 expected = isolate()->factory()->the_hole_value();
281 } 281 }
282 CHECK(constant_array->get(i)->SameValue(*expected)); 282 CHECK(constant_array->get(i)->SameValue(*expected));
283 } 283 }
284 } 284 }
285 285
286 TEST_F(ConstantArrayBuilderTest, AllocateEntriesWithFixedReservations) {
287 ConstantArrayBuilder builder(isolate(), zone());
288 for (size_t i = 0; i < k16BitCapacity; i++) {
289 if ((i % 2) == 0) {
290 CHECK_EQ(i, builder.ReserveEntry());
291 } else {
292 builder.Insert(handle(Smi::FromInt(static_cast<int>(i)), isolate()));
293 }
294 }
295 CHECK_EQ(builder.size(), k16BitCapacity);
296
297 // Check values before reserved entries are inserted.
298 for (size_t i = 0; i < k16BitCapacity; i++) {
299 if ((i % 2) == 0) {
300 // Check reserved values are the hole.
301 Handle<Object> empty = builder.At(i);
302 CHECK(empty->SameValue(isolate()->heap()->the_hole_value()));
303 } else {
304 CHECK_EQ(Handle<Smi>::cast(builder.At(i))->value(), i);
305 }
306 }
307
308 // Insert reserved entries.
309 for (size_t i = 0; i < k16BitCapacity; i += 2) {
310 builder.InsertReservedEntry(
311 i, handle(Smi::FromInt(static_cast<int>(i)), isolate()));
312 }
313
314 // Check values after reserved entries are inserted.
315 for (size_t i = 0; i < k16BitCapacity; i++) {
316 CHECK_EQ(Handle<Smi>::cast(builder.At(i))->value(), i);
317 }
318 }
319
286 } // namespace interpreter 320 } // namespace interpreter
287 } // namespace internal 321 } // namespace internal
288 } // namespace v8 322 } // namespace v8
OLDNEW
« src/interpreter/constant-array-builder.cc ('K') | « src/interpreter/constant-array-builder.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698