Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 36 } | 36 } |
| 37 CHECK_EQ(builder.size(), k16BitCapacity); | 37 CHECK_EQ(builder.size(), k16BitCapacity); |
| 38 for (size_t i = 0; i < k16BitCapacity; i++) { | 38 for (size_t i = 0; i < k16BitCapacity; i++) { |
| 39 CHECK_EQ(Handle<Smi>::cast(builder.At(i))->value(), static_cast<int>(i)); | 39 CHECK_EQ(Handle<Smi>::cast(builder.At(i))->value(), static_cast<int>(i)); |
| 40 } | 40 } |
| 41 } | 41 } |
| 42 | 42 |
| 43 TEST_F(ConstantArrayBuilderTest, ToFixedArray) { | 43 TEST_F(ConstantArrayBuilderTest, ToFixedArray) { |
| 44 CanonicalHandleScope canonical(isolate()); | 44 CanonicalHandleScope canonical(isolate()); |
| 45 ConstantArrayBuilder builder(zone(), isolate()->factory()->the_hole_value()); | 45 ConstantArrayBuilder builder(zone(), isolate()->factory()->the_hole_value()); |
| 46 static const size_t kNumberOfElements = 37; | 46 static const int kNumberOfElements = 37; |
| 47 for (size_t i = 0; i < kNumberOfElements; i++) { | 47 for (int i = 0; i < kNumberOfElements; i++) { |
| 48 Handle<Object> object = isolate()->factory()->NewNumberFromSize(i); | 48 Handle<Object> object = isolate()->factory()->NewNumberFromSize(i); |
| 49 builder.Insert(object); | 49 builder.Insert(object); |
| 50 CHECK(builder.At(i)->SameValue(*object)); | 50 CHECK(builder.At(i)->SameValue(*object)); |
| 51 } | 51 } |
| 52 Handle<FixedArray> constant_array = builder.ToFixedArray(isolate()); | 52 Handle<FixedArray> constant_array = builder.ToFixedArray(isolate()); |
| 53 CHECK_EQ(constant_array->length(), kNumberOfElements); | 53 CHECK_EQ(constant_array->length(), kNumberOfElements); |
| 54 for (size_t i = 0; i < kNumberOfElements; i++) { | 54 for (int i = 0; i < kNumberOfElements; i++) { |
| 55 CHECK(constant_array->get(static_cast<int>(i))->SameValue(*builder.At(i))); | 55 CHECK(constant_array->get(i)->SameValue(*builder.At(i))); |
| 56 } | 56 } |
| 57 } | 57 } |
| 58 | 58 |
| 59 TEST_F(ConstantArrayBuilderTest, ToLargeFixedArray) { | 59 TEST_F(ConstantArrayBuilderTest, ToLargeFixedArray) { |
| 60 CanonicalHandleScope canonical(isolate()); | 60 CanonicalHandleScope canonical(isolate()); |
| 61 ConstantArrayBuilder builder(zone(), isolate()->factory()->the_hole_value()); | 61 ConstantArrayBuilder builder(zone(), isolate()->factory()->the_hole_value()); |
| 62 static const size_t kNumberOfElements = 37373; | 62 static const int kNumberOfElements = 37373; |
| 63 for (size_t i = 0; i < kNumberOfElements; i++) { | 63 for (int i = 0; i < kNumberOfElements; i++) { |
| 64 Handle<Object> object = isolate()->factory()->NewNumberFromSize(i); | 64 Handle<Object> object = isolate()->factory()->NewNumberFromSize(i); |
| 65 builder.Insert(object); | 65 builder.Insert(object); |
| 66 CHECK(builder.At(i)->SameValue(*object)); | 66 CHECK(builder.At(i)->SameValue(*object)); |
| 67 } | 67 } |
| 68 Handle<FixedArray> constant_array = builder.ToFixedArray(isolate()); | 68 Handle<FixedArray> constant_array = builder.ToFixedArray(isolate()); |
| 69 CHECK_EQ(constant_array->length(), kNumberOfElements); | 69 CHECK_EQ(constant_array->length(), kNumberOfElements); |
|
Michael Starzinger
2016/11/11 11:45:43
nit: As discussed offline: If the bogus conversion
ulan
2016/11/11 11:47:25
Done.
rmcilroy
2016/11/11 11:48:52
Any reason to do this? It seems like Ulan's approa
Michael Starzinger
2016/11/11 11:54:32
My reasoning was that safe indexed vector accessor
| |
| 70 for (size_t i = 0; i < kNumberOfElements; i++) { | 70 for (int i = 0; i < kNumberOfElements; i++) { |
| 71 CHECK(constant_array->get(static_cast<int>(i))->SameValue(*builder.At(i))); | 71 CHECK(constant_array->get(i)->SameValue(*builder.At(i))); |
| 72 } | 72 } |
| 73 } | 73 } |
| 74 | 74 |
| 75 TEST_F(ConstantArrayBuilderTest, ToLargeFixedArrayWithReservations) { | 75 TEST_F(ConstantArrayBuilderTest, ToLargeFixedArrayWithReservations) { |
| 76 CanonicalHandleScope canonical(isolate()); | 76 CanonicalHandleScope canonical(isolate()); |
| 77 ConstantArrayBuilder builder(zone(), isolate()->factory()->the_hole_value()); | 77 ConstantArrayBuilder builder(zone(), isolate()->factory()->the_hole_value()); |
| 78 static const size_t kNumberOfElements = 37373; | 78 static const int kNumberOfElements = 37373; |
| 79 for (size_t i = 0; i < kNumberOfElements; i++) { | 79 for (int i = 0; i < kNumberOfElements; i++) { |
| 80 builder.CommitReservedEntry(builder.CreateReservedEntry(), | 80 builder.CommitReservedEntry(builder.CreateReservedEntry(), Smi::FromInt(i)); |
| 81 Smi::FromInt(static_cast<int>(i))); | |
| 82 } | 81 } |
| 83 Handle<FixedArray> constant_array = builder.ToFixedArray(isolate()); | 82 Handle<FixedArray> constant_array = builder.ToFixedArray(isolate()); |
| 84 CHECK_EQ(constant_array->length(), kNumberOfElements); | 83 CHECK_EQ(constant_array->length(), kNumberOfElements); |
| 85 for (size_t i = 0; i < kNumberOfElements; i++) { | 84 for (int i = 0; i < kNumberOfElements; i++) { |
| 86 CHECK(constant_array->get(static_cast<int>(i))->SameValue(*builder.At(i))); | 85 CHECK(constant_array->get(i)->SameValue(*builder.At(i))); |
| 87 } | 86 } |
| 88 } | 87 } |
| 89 | 88 |
| 90 TEST_F(ConstantArrayBuilderTest, AllocateEntriesWithIdx8Reservations) { | 89 TEST_F(ConstantArrayBuilderTest, AllocateEntriesWithIdx8Reservations) { |
| 91 CanonicalHandleScope canonical(isolate()); | 90 CanonicalHandleScope canonical(isolate()); |
| 92 for (size_t reserved = 1; reserved < k8BitCapacity; reserved *= 3) { | 91 for (size_t reserved = 1; reserved < k8BitCapacity; reserved *= 3) { |
| 93 ConstantArrayBuilder builder(zone(), | 92 ConstantArrayBuilder builder(zone(), |
| 94 isolate()->factory()->the_hole_value()); | 93 isolate()->factory()->the_hole_value()); |
| 95 for (size_t i = 0; i < reserved; i++) { | 94 for (size_t i = 0; i < reserved; i++) { |
| 96 OperandSize operand_size = builder.CreateReservedEntry(); | 95 OperandSize operand_size = builder.CreateReservedEntry(); |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 197 } | 196 } |
| 198 } | 197 } |
| 199 } | 198 } |
| 200 | 199 |
| 201 TEST_F(ConstantArrayBuilderTest, GapFilledWhenLowReservationCommitted) { | 200 TEST_F(ConstantArrayBuilderTest, GapFilledWhenLowReservationCommitted) { |
| 202 CanonicalHandleScope canonical(isolate()); | 201 CanonicalHandleScope canonical(isolate()); |
| 203 ConstantArrayBuilder builder(zone(), isolate()->factory()->the_hole_value()); | 202 ConstantArrayBuilder builder(zone(), isolate()->factory()->the_hole_value()); |
| 204 for (size_t i = 0; i < k8BitCapacity; i++) { | 203 for (size_t i = 0; i < k8BitCapacity; i++) { |
| 205 OperandSize operand_size = builder.CreateReservedEntry(); | 204 OperandSize operand_size = builder.CreateReservedEntry(); |
| 206 CHECK(OperandSize::kByte == operand_size); | 205 CHECK(OperandSize::kByte == operand_size); |
| 207 CHECK_EQ(builder.size(), 0); | 206 CHECK_EQ(builder.size(), 0u); |
| 208 } | 207 } |
| 209 for (size_t i = 0; i < k8BitCapacity; i++) { | 208 for (size_t i = 0; i < k8BitCapacity; i++) { |
| 210 builder.CommitReservedEntry(builder.CreateReservedEntry(), | 209 builder.CommitReservedEntry(builder.CreateReservedEntry(), |
| 211 Smi::FromInt(static_cast<int>(i))); | 210 Smi::FromInt(static_cast<int>(i))); |
| 212 CHECK_EQ(builder.size(), i + k8BitCapacity + 1); | 211 CHECK_EQ(builder.size(), i + k8BitCapacity + 1); |
| 213 } | 212 } |
| 214 for (size_t i = 0; i < k8BitCapacity; i++) { | 213 for (size_t i = 0; i < k8BitCapacity; i++) { |
| 215 builder.CommitReservedEntry(OperandSize::kByte, | 214 builder.CommitReservedEntry(OperandSize::kByte, |
| 216 Smi::FromInt(static_cast<int>(i))); | 215 Smi::FromInt(static_cast<int>(i))); |
| 217 CHECK_EQ(builder.size(), 2 * k8BitCapacity); | 216 CHECK_EQ(builder.size(), 2 * k8BitCapacity); |
| 218 } | 217 } |
| 219 Handle<FixedArray> constant_array = builder.ToFixedArray(isolate()); | 218 Handle<FixedArray> constant_array = builder.ToFixedArray(isolate()); |
| 220 CHECK_EQ(constant_array->length(), 2 * k8BitCapacity); | 219 CHECK_EQ(constant_array->length(), static_cast<int>(2 * k8BitCapacity)); |
| 221 for (size_t i = 0; i < k8BitCapacity; i++) { | 220 for (size_t i = 0; i < k8BitCapacity; i++) { |
| 222 Object* original = constant_array->get(static_cast<int>(k8BitCapacity + i)); | 221 Object* original = constant_array->get(static_cast<int>(k8BitCapacity + i)); |
| 223 Object* duplicate = constant_array->get(static_cast<int>(i)); | 222 Object* duplicate = constant_array->get(static_cast<int>(i)); |
| 224 CHECK(original->SameValue(duplicate)); | 223 CHECK(original->SameValue(duplicate)); |
| 225 Handle<Object> reference = isolate()->factory()->NewNumberFromSize(i); | 224 Handle<Object> reference = isolate()->factory()->NewNumberFromSize(i); |
| 226 CHECK(original->SameValue(*reference)); | 225 CHECK(original->SameValue(*reference)); |
| 227 } | 226 } |
| 228 } | 227 } |
| 229 | 228 |
| 230 TEST_F(ConstantArrayBuilderTest, GapNotFilledWhenLowReservationDiscarded) { | 229 TEST_F(ConstantArrayBuilderTest, GapNotFilledWhenLowReservationDiscarded) { |
| 231 CanonicalHandleScope canonical(isolate()); | 230 CanonicalHandleScope canonical(isolate()); |
| 232 ConstantArrayBuilder builder(zone(), isolate()->factory()->the_hole_value()); | 231 ConstantArrayBuilder builder(zone(), isolate()->factory()->the_hole_value()); |
| 233 for (size_t i = 0; i < k8BitCapacity; i++) { | 232 for (size_t i = 0; i < k8BitCapacity; i++) { |
| 234 OperandSize operand_size = builder.CreateReservedEntry(); | 233 OperandSize operand_size = builder.CreateReservedEntry(); |
| 235 CHECK(OperandSize::kByte == operand_size); | 234 CHECK(OperandSize::kByte == operand_size); |
| 236 CHECK_EQ(builder.size(), 0); | 235 CHECK_EQ(builder.size(), 0u); |
| 237 } | 236 } |
| 238 for (size_t i = 0; i < k8BitCapacity; i++) { | 237 for (size_t i = 0; i < k8BitCapacity; i++) { |
| 239 Handle<Object> object = isolate()->factory()->NewNumberFromSize(i); | 238 Handle<Object> object = isolate()->factory()->NewNumberFromSize(i); |
| 240 builder.Insert(object); | 239 builder.Insert(object); |
| 241 CHECK_EQ(builder.size(), i + k8BitCapacity + 1); | 240 CHECK_EQ(builder.size(), i + k8BitCapacity + 1); |
| 242 } | 241 } |
| 243 for (size_t i = 0; i < k8BitCapacity; i++) { | 242 for (size_t i = 0; i < k8BitCapacity; i++) { |
| 244 builder.DiscardReservedEntry(OperandSize::kByte); | 243 builder.DiscardReservedEntry(OperandSize::kByte); |
| 245 builder.Insert(builder.At(i + k8BitCapacity)); | 244 builder.Insert(builder.At(i + k8BitCapacity)); |
| 246 CHECK_EQ(builder.size(), 2 * k8BitCapacity); | 245 CHECK_EQ(builder.size(), 2 * k8BitCapacity); |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 258 CanonicalHandleScope canonical(isolate()); | 257 CanonicalHandleScope canonical(isolate()); |
| 259 static int kNumberOfHoles = 128; | 258 static int kNumberOfHoles = 128; |
| 260 ConstantArrayBuilder builder(zone(), isolate()->factory()->the_hole_value()); | 259 ConstantArrayBuilder builder(zone(), isolate()->factory()->the_hole_value()); |
| 261 for (int i = 0; i < kNumberOfHoles; ++i) { | 260 for (int i = 0; i < kNumberOfHoles; ++i) { |
| 262 CHECK_EQ(builder.CreateReservedEntry(), OperandSize::kByte); | 261 CHECK_EQ(builder.CreateReservedEntry(), OperandSize::kByte); |
| 263 } | 262 } |
| 264 for (int i = 0; i < 128; ++i) { | 263 for (int i = 0; i < 128; ++i) { |
| 265 CHECK_EQ(builder.Insert(isolate()->factory()->NewNumber(i)), | 264 CHECK_EQ(builder.Insert(isolate()->factory()->NewNumber(i)), |
| 266 static_cast<size_t>(i)); | 265 static_cast<size_t>(i)); |
| 267 } | 266 } |
| 268 CHECK_EQ(builder.Insert(isolate()->factory()->NewNumber(256)), 256); | 267 CHECK_EQ(builder.Insert(isolate()->factory()->NewNumber(256)), 256u); |
| 269 | 268 |
| 270 Handle<FixedArray> constant_array = builder.ToFixedArray(isolate()); | 269 Handle<FixedArray> constant_array = builder.ToFixedArray(isolate()); |
| 271 CHECK_EQ(constant_array->length(), 257); | 270 CHECK_EQ(constant_array->length(), 257); |
| 272 for (int i = 128; i < 256; i++) { | 271 for (int i = 128; i < 256; i++) { |
| 273 CHECK(constant_array->get(i)->SameValue( | 272 CHECK(constant_array->get(i)->SameValue( |
| 274 *isolate()->factory()->the_hole_value())); | 273 *isolate()->factory()->the_hole_value())); |
| 275 } | 274 } |
| 276 CHECK(!constant_array->get(127)->SameValue( | 275 CHECK(!constant_array->get(127)->SameValue( |
| 277 *isolate()->factory()->the_hole_value())); | 276 *isolate()->factory()->the_hole_value())); |
| 278 CHECK(!constant_array->get(256)->SameValue( | 277 CHECK(!constant_array->get(256)->SameValue( |
| 279 *isolate()->factory()->the_hole_value())); | 278 *isolate()->factory()->the_hole_value())); |
| 280 } | 279 } |
| 281 | 280 |
| 282 TEST_F(ConstantArrayBuilderTest, ReservationsAtAllScales) { | 281 TEST_F(ConstantArrayBuilderTest, ReservationsAtAllScales) { |
| 283 CanonicalHandleScope canonical(isolate()); | 282 CanonicalHandleScope canonical(isolate()); |
| 284 ConstantArrayBuilder builder(zone(), isolate()->factory()->the_hole_value()); | 283 ConstantArrayBuilder builder(zone(), isolate()->factory()->the_hole_value()); |
| 285 for (int i = 0; i < 256; i++) { | 284 for (int i = 0; i < 256; i++) { |
| 286 CHECK_EQ(builder.CreateReservedEntry(), OperandSize::kByte); | 285 CHECK_EQ(builder.CreateReservedEntry(), OperandSize::kByte); |
| 287 } | 286 } |
| 288 for (int i = 256; i < 65536; ++i) { | 287 for (int i = 256; i < 65536; ++i) { |
| 289 CHECK_EQ(builder.CreateReservedEntry(), OperandSize::kShort); | 288 CHECK_EQ(builder.CreateReservedEntry(), OperandSize::kShort); |
| 290 } | 289 } |
| 291 for (int i = 65536; i < 131072; ++i) { | 290 for (int i = 65536; i < 131072; ++i) { |
| 292 CHECK_EQ(builder.CreateReservedEntry(), OperandSize::kQuad); | 291 CHECK_EQ(builder.CreateReservedEntry(), OperandSize::kQuad); |
| 293 } | 292 } |
| 294 CHECK_EQ(builder.CommitReservedEntry(OperandSize::kByte, Smi::FromInt(1)), 0); | 293 CHECK_EQ(builder.CommitReservedEntry(OperandSize::kByte, Smi::FromInt(1)), |
| 294 0u); | |
| 295 CHECK_EQ(builder.CommitReservedEntry(OperandSize::kShort, Smi::FromInt(2)), | 295 CHECK_EQ(builder.CommitReservedEntry(OperandSize::kShort, Smi::FromInt(2)), |
| 296 256); | 296 256u); |
| 297 CHECK_EQ(builder.CommitReservedEntry(OperandSize::kQuad, Smi::FromInt(3)), | 297 CHECK_EQ(builder.CommitReservedEntry(OperandSize::kQuad, Smi::FromInt(3)), |
| 298 65536); | 298 65536u); |
| 299 Handle<FixedArray> constant_array = builder.ToFixedArray(isolate()); | 299 Handle<FixedArray> constant_array = builder.ToFixedArray(isolate()); |
| 300 CHECK_EQ(constant_array->length(), 65537); | 300 CHECK_EQ(constant_array->length(), 65537); |
| 301 int count = 1; | 301 int count = 1; |
| 302 for (int i = 0; i < constant_array->length(); ++i) { | 302 for (int i = 0; i < constant_array->length(); ++i) { |
| 303 Handle<Object> expected; | 303 Handle<Object> expected; |
| 304 if (i == 0 || i == 256 || i == 65536) { | 304 if (i == 0 || i == 256 || i == 65536) { |
| 305 expected = isolate()->factory()->NewNumber(count++); | 305 expected = isolate()->factory()->NewNumber(count++); |
| 306 } else { | 306 } else { |
| 307 expected = isolate()->factory()->the_hole_value(); | 307 expected = isolate()->factory()->the_hole_value(); |
| 308 } | 308 } |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 341 | 341 |
| 342 // Check values after reserved entries are inserted. | 342 // Check values after reserved entries are inserted. |
| 343 for (size_t i = 0; i < k16BitCapacity; i++) { | 343 for (size_t i = 0; i < k16BitCapacity; i++) { |
| 344 CHECK_EQ(Handle<Smi>::cast(builder.At(i))->value(), static_cast<int>(i)); | 344 CHECK_EQ(Handle<Smi>::cast(builder.At(i))->value(), static_cast<int>(i)); |
| 345 } | 345 } |
| 346 } | 346 } |
| 347 | 347 |
| 348 } // namespace interpreter | 348 } // namespace interpreter |
| 349 } // namespace internal | 349 } // namespace internal |
| 350 } // namespace v8 | 350 } // namespace v8 |
| OLD | NEW |