| 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 | 4 |
| 5 #include "test/unittests/test-utils.h" | 5 #include "test/unittests/test-utils.h" |
| 6 | 6 |
| 7 #include "src/wasm/decoder.h" | 7 #include "src/wasm/decoder.h" |
| 8 #include "src/wasm/wasm-macro-gen.h" | 8 #include "src/wasm/wasm-macro-gen.h" |
| 9 | 9 |
| 10 namespace v8 { | 10 namespace v8 { |
| 11 namespace internal { | 11 namespace internal { |
| 12 namespace wasm { | 12 namespace wasm { |
| 13 | 13 |
| 14 class DecoderTest : public TestWithZone { | 14 class DecoderTest : public TestWithZone { |
| 15 public: | 15 public: |
| 16 DecoderTest() : decoder(nullptr, nullptr) {} | 16 DecoderTest() : decoder(nullptr, nullptr) {} |
| 17 | 17 |
| 18 Decoder decoder; | 18 Decoder decoder; |
| 19 }; | 19 }; |
| 20 | 20 |
| 21 #define CHECK_UINT32V_INLINE(expected, expected_length, ...) \ | 21 #define CHECK_UINT32V_INLINE(expected, expected_length, ...) \ |
| 22 do { \ | 22 do { \ |
| 23 const byte data[] = {__VA_ARGS__}; \ | 23 const byte data[] = {__VA_ARGS__}; \ |
| 24 decoder.Reset(data, data + sizeof(data)); \ | 24 decoder.Reset(data, data + sizeof(data)); \ |
| 25 int length; \ | 25 unsigned length; \ |
| 26 EXPECT_EQ(expected, \ | 26 EXPECT_EQ(expected, \ |
| 27 decoder.checked_read_u32v(decoder.start(), 0, &length)); \ | 27 decoder.checked_read_u32v(decoder.start(), 0, &length)); \ |
| 28 EXPECT_EQ(expected_length, length); \ | 28 EXPECT_EQ(expected_length, length); \ |
| 29 } while (false) | 29 } while (false) |
| 30 | 30 |
| 31 #define CHECK_INT32V_INLINE(expected, expected_length, ...) \ | 31 #define CHECK_INT32V_INLINE(expected, expected_length, ...) \ |
| 32 do { \ | 32 do { \ |
| 33 const byte data[] = {__VA_ARGS__}; \ | 33 const byte data[] = {__VA_ARGS__}; \ |
| 34 decoder.Reset(data, data + sizeof(data)); \ | 34 decoder.Reset(data, data + sizeof(data)); \ |
| 35 int length; \ | 35 unsigned length; \ |
| 36 EXPECT_EQ(expected, \ | 36 EXPECT_EQ(expected, \ |
| 37 decoder.checked_read_i32v(decoder.start(), 0, &length)); \ | 37 decoder.checked_read_i32v(decoder.start(), 0, &length)); \ |
| 38 EXPECT_EQ(expected_length, length); \ | 38 EXPECT_EQ(expected_length, length); \ |
| 39 } while (false) | 39 } while (false) |
| 40 | 40 |
| 41 #define CHECK_UINT64V_INLINE(expected, expected_length, ...) \ | 41 #define CHECK_UINT64V_INLINE(expected, expected_length, ...) \ |
| 42 do { \ | 42 do { \ |
| 43 const byte data[] = {__VA_ARGS__}; \ | 43 const byte data[] = {__VA_ARGS__}; \ |
| 44 decoder.Reset(data, data + sizeof(data)); \ | 44 decoder.Reset(data, data + sizeof(data)); \ |
| 45 int length; \ | 45 unsigned length; \ |
| 46 EXPECT_EQ(expected, \ | 46 EXPECT_EQ(expected, \ |
| 47 decoder.checked_read_u64v(decoder.start(), 0, &length)); \ | 47 decoder.checked_read_u64v(decoder.start(), 0, &length)); \ |
| 48 EXPECT_EQ(expected_length, length); \ | 48 EXPECT_EQ(expected_length, length); \ |
| 49 } while (false) | 49 } while (false) |
| 50 | 50 |
| 51 #define CHECK_INT64V_INLINE(expected, expected_length, ...) \ | 51 #define CHECK_INT64V_INLINE(expected, expected_length, ...) \ |
| 52 do { \ | 52 do { \ |
| 53 const byte data[] = {__VA_ARGS__}; \ | 53 const byte data[] = {__VA_ARGS__}; \ |
| 54 decoder.Reset(data, data + sizeof(data)); \ | 54 decoder.Reset(data, data + sizeof(data)); \ |
| 55 int length; \ | 55 unsigned length; \ |
| 56 EXPECT_EQ(expected, \ | 56 EXPECT_EQ(expected, \ |
| 57 decoder.checked_read_i64v(decoder.start(), 0, &length)); \ | 57 decoder.checked_read_i64v(decoder.start(), 0, &length)); \ |
| 58 EXPECT_EQ(expected_length, length); \ | 58 EXPECT_EQ(expected_length, length); \ |
| 59 } while (false) | 59 } while (false) |
| 60 | 60 |
| 61 TEST_F(DecoderTest, ReadU32v_OneByte) { | 61 TEST_F(DecoderTest, ReadU32v_OneByte) { |
| 62 CHECK_UINT32V_INLINE(0, 1, 0); | 62 CHECK_UINT32V_INLINE(0, 1, 0); |
| 63 CHECK_UINT32V_INLINE(5, 1, 5); | 63 CHECK_UINT32V_INLINE(5, 1, 5); |
| 64 CHECK_UINT32V_INLINE(7, 1, 7); | 64 CHECK_UINT32V_INLINE(7, 1, 7); |
| 65 CHECK_UINT32V_INLINE(9, 1, 9); | 65 CHECK_UINT32V_INLINE(9, 1, 9); |
| (...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 358 } | 358 } |
| 359 | 359 |
| 360 const int32_t max = kMaxInt; | 360 const int32_t max = kMaxInt; |
| 361 for (int i = max; i > max - 10; i--) { | 361 for (int i = max; i > max - 10; i--) { |
| 362 CHECK_INT32V_INLINE(i, 5, U32V_5(i)); | 362 CHECK_INT32V_INLINE(i, 5, U32V_5(i)); |
| 363 } | 363 } |
| 364 } | 364 } |
| 365 | 365 |
| 366 TEST_F(DecoderTest, ReadU32v_off_end1) { | 366 TEST_F(DecoderTest, ReadU32v_off_end1) { |
| 367 static const byte data[] = {U32V_1(11)}; | 367 static const byte data[] = {U32V_1(11)}; |
| 368 int length = 0; | 368 unsigned length = 0; |
| 369 decoder.Reset(data, data); | 369 decoder.Reset(data, data); |
| 370 decoder.checked_read_u32v(decoder.start(), 0, &length); | 370 decoder.checked_read_u32v(decoder.start(), 0, &length); |
| 371 EXPECT_EQ(0, length); | 371 EXPECT_EQ(0, length); |
| 372 EXPECT_FALSE(decoder.ok()); | 372 EXPECT_FALSE(decoder.ok()); |
| 373 } | 373 } |
| 374 | 374 |
| 375 TEST_F(DecoderTest, ReadU32v_off_end2) { | 375 TEST_F(DecoderTest, ReadU32v_off_end2) { |
| 376 static const byte data[] = {U32V_2(1111)}; | 376 static const byte data[] = {U32V_2(1111)}; |
| 377 for (size_t i = 0; i < sizeof(data); i++) { | 377 for (size_t i = 0; i < sizeof(data); i++) { |
| 378 int length = 0; | 378 unsigned length = 0; |
| 379 decoder.Reset(data, data + i); | 379 decoder.Reset(data, data + i); |
| 380 decoder.checked_read_u32v(decoder.start(), 0, &length); | 380 decoder.checked_read_u32v(decoder.start(), 0, &length); |
| 381 EXPECT_EQ(i, length); | 381 EXPECT_EQ(i, length); |
| 382 EXPECT_FALSE(decoder.ok()); | 382 EXPECT_FALSE(decoder.ok()); |
| 383 } | 383 } |
| 384 } | 384 } |
| 385 | 385 |
| 386 TEST_F(DecoderTest, ReadU32v_off_end3) { | 386 TEST_F(DecoderTest, ReadU32v_off_end3) { |
| 387 static const byte data[] = {U32V_3(111111)}; | 387 static const byte data[] = {U32V_3(111111)}; |
| 388 for (size_t i = 0; i < sizeof(data); i++) { | 388 for (size_t i = 0; i < sizeof(data); i++) { |
| 389 int length = 0; | 389 unsigned length = 0; |
| 390 decoder.Reset(data, data + i); | 390 decoder.Reset(data, data + i); |
| 391 decoder.checked_read_u32v(decoder.start(), 0, &length); | 391 decoder.checked_read_u32v(decoder.start(), 0, &length); |
| 392 EXPECT_EQ(i, length); | 392 EXPECT_EQ(i, length); |
| 393 EXPECT_FALSE(decoder.ok()); | 393 EXPECT_FALSE(decoder.ok()); |
| 394 } | 394 } |
| 395 } | 395 } |
| 396 | 396 |
| 397 TEST_F(DecoderTest, ReadU32v_off_end4) { | 397 TEST_F(DecoderTest, ReadU32v_off_end4) { |
| 398 static const byte data[] = {U32V_4(11111111)}; | 398 static const byte data[] = {U32V_4(11111111)}; |
| 399 for (size_t i = 0; i < sizeof(data); i++) { | 399 for (size_t i = 0; i < sizeof(data); i++) { |
| 400 int length = 0; | 400 unsigned length = 0; |
| 401 decoder.Reset(data, data + i); | 401 decoder.Reset(data, data + i); |
| 402 decoder.checked_read_u32v(decoder.start(), 0, &length); | 402 decoder.checked_read_u32v(decoder.start(), 0, &length); |
| 403 EXPECT_EQ(i, length); | 403 EXPECT_EQ(i, length); |
| 404 EXPECT_FALSE(decoder.ok()); | 404 EXPECT_FALSE(decoder.ok()); |
| 405 } | 405 } |
| 406 } | 406 } |
| 407 | 407 |
| 408 TEST_F(DecoderTest, ReadU32v_off_end5) { | 408 TEST_F(DecoderTest, ReadU32v_off_end5) { |
| 409 static const byte data[] = {U32V_5(111111111)}; | 409 static const byte data[] = {U32V_5(111111111)}; |
| 410 for (size_t i = 0; i < sizeof(data); i++) { | 410 for (size_t i = 0; i < sizeof(data); i++) { |
| 411 int length = 0; | 411 unsigned length = 0; |
| 412 decoder.Reset(data, data + i); | 412 decoder.Reset(data, data + i); |
| 413 decoder.checked_read_u32v(decoder.start(), 0, &length); | 413 decoder.checked_read_u32v(decoder.start(), 0, &length); |
| 414 EXPECT_EQ(i, length); | 414 EXPECT_EQ(i, length); |
| 415 EXPECT_FALSE(decoder.ok()); | 415 EXPECT_FALSE(decoder.ok()); |
| 416 } | 416 } |
| 417 } | 417 } |
| 418 | 418 |
| 419 TEST_F(DecoderTest, ReadU32v_extra_bits) { | 419 TEST_F(DecoderTest, ReadU32v_extra_bits) { |
| 420 byte data[] = {0x80, 0x80, 0x80, 0x80, 0x00}; | 420 byte data[] = {0x80, 0x80, 0x80, 0x80, 0x00}; |
| 421 for (int i = 1; i < 16; i++) { | 421 for (int i = 1; i < 16; i++) { |
| 422 data[4] = static_cast<byte>(i << 4); | 422 data[4] = static_cast<byte>(i << 4); |
| 423 int length = 0; | 423 unsigned length = 0; |
| 424 decoder.Reset(data, data + sizeof(data)); | 424 decoder.Reset(data, data + sizeof(data)); |
| 425 decoder.checked_read_u32v(decoder.start(), 0, &length); | 425 decoder.checked_read_u32v(decoder.start(), 0, &length); |
| 426 EXPECT_EQ(5, length); | 426 EXPECT_EQ(5, length); |
| 427 EXPECT_FALSE(decoder.ok()); | 427 EXPECT_FALSE(decoder.ok()); |
| 428 } | 428 } |
| 429 } | 429 } |
| 430 | 430 |
| 431 TEST_F(DecoderTest, ReadI32v_extra_bits_negative) { | 431 TEST_F(DecoderTest, ReadI32v_extra_bits_negative) { |
| 432 // OK for negative signed values to have extra ones. | 432 // OK for negative signed values to have extra ones. |
| 433 int length = 0; | 433 unsigned length = 0; |
| 434 byte data[] = {0xff, 0xff, 0xff, 0xff, 0x7f}; | 434 byte data[] = {0xff, 0xff, 0xff, 0xff, 0x7f}; |
| 435 decoder.Reset(data, data + sizeof(data)); | 435 decoder.Reset(data, data + sizeof(data)); |
| 436 decoder.checked_read_i32v(decoder.start(), 0, &length); | 436 decoder.checked_read_i32v(decoder.start(), 0, &length); |
| 437 EXPECT_EQ(5, length); | 437 EXPECT_EQ(5, length); |
| 438 EXPECT_TRUE(decoder.ok()); | 438 EXPECT_TRUE(decoder.ok()); |
| 439 } | 439 } |
| 440 | 440 |
| 441 TEST_F(DecoderTest, ReadI32v_extra_bits_positive) { | 441 TEST_F(DecoderTest, ReadI32v_extra_bits_positive) { |
| 442 // Not OK for positive signed values to have extra ones. | 442 // Not OK for positive signed values to have extra ones. |
| 443 int length = 0; | 443 unsigned length = 0; |
| 444 byte data[] = {0x80, 0x80, 0x80, 0x80, 0x77}; | 444 byte data[] = {0x80, 0x80, 0x80, 0x80, 0x77}; |
| 445 decoder.Reset(data, data + sizeof(data)); | 445 decoder.Reset(data, data + sizeof(data)); |
| 446 decoder.checked_read_i32v(decoder.start(), 0, &length); | 446 decoder.checked_read_i32v(decoder.start(), 0, &length); |
| 447 EXPECT_EQ(5, length); | 447 EXPECT_EQ(5, length); |
| 448 EXPECT_FALSE(decoder.ok()); | 448 EXPECT_FALSE(decoder.ok()); |
| 449 } | 449 } |
| 450 | 450 |
| 451 TEST_F(DecoderTest, ReadU32v_Bits) { | 451 TEST_F(DecoderTest, ReadU32v_Bits) { |
| 452 // A more exhaustive test. | 452 // A more exhaustive test. |
| 453 const int kMaxSize = 5; | 453 const int kMaxSize = 5; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 470 for (int j = 0; j < kMaxSize; j++) { | 470 for (int j = 0; j < kMaxSize; j++) { |
| 471 data[j] = static_cast<byte>((val >> (7 * j)) & MASK_7); | 471 data[j] = static_cast<byte>((val >> (7 * j)) & MASK_7); |
| 472 } | 472 } |
| 473 for (int j = 0; j < length - 1; j++) { | 473 for (int j = 0; j < length - 1; j++) { |
| 474 data[j] |= 0x80; | 474 data[j] |= 0x80; |
| 475 } | 475 } |
| 476 | 476 |
| 477 // foreach buffer size 0...5 | 477 // foreach buffer size 0...5 |
| 478 for (int limit = 0; limit <= kMaxSize; limit++) { | 478 for (int limit = 0; limit <= kMaxSize; limit++) { |
| 479 decoder.Reset(data, data + limit); | 479 decoder.Reset(data, data + limit); |
| 480 int rlen; | 480 unsigned rlen; |
| 481 uint32_t result = decoder.checked_read_u32v(data, 0, &rlen); | 481 uint32_t result = decoder.checked_read_u32v(data, 0, &rlen); |
| 482 if (limit < length) { | 482 if (limit < length) { |
| 483 EXPECT_FALSE(decoder.ok()); | 483 EXPECT_FALSE(decoder.ok()); |
| 484 } else { | 484 } else { |
| 485 EXPECT_TRUE(decoder.ok()); | 485 EXPECT_TRUE(decoder.ok()); |
| 486 EXPECT_EQ(val, result); | 486 EXPECT_EQ(val, result); |
| 487 EXPECT_EQ(length, rlen); | 487 EXPECT_EQ(length, rlen); |
| 488 } | 488 } |
| 489 } | 489 } |
| 490 } | 490 } |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 526 byte data[kMaxSize]; | 526 byte data[kMaxSize]; |
| 527 | 527 |
| 528 for (int i = 0; i < 64; i++) { | 528 for (int i = 0; i < 64; i++) { |
| 529 const uint64_t val = 1ull << i; | 529 const uint64_t val = 1ull << i; |
| 530 int index = i / 7; | 530 int index = i / 7; |
| 531 data[index] = 1 << (i % 7); | 531 data[index] = 1 << (i % 7); |
| 532 memset(data, 0x80, index); | 532 memset(data, 0x80, index); |
| 533 | 533 |
| 534 for (int limit = 0; limit <= kMaxSize; limit++) { | 534 for (int limit = 0; limit <= kMaxSize; limit++) { |
| 535 decoder.Reset(data, data + limit); | 535 decoder.Reset(data, data + limit); |
| 536 int length; | 536 unsigned length; |
| 537 uint64_t result = decoder.checked_read_u64v(data, 0, &length); | 537 uint64_t result = decoder.checked_read_u64v(data, 0, &length); |
| 538 if (limit <= index) { | 538 if (limit <= index) { |
| 539 EXPECT_FALSE(decoder.ok()); | 539 EXPECT_FALSE(decoder.ok()); |
| 540 } else { | 540 } else { |
| 541 EXPECT_TRUE(decoder.ok()); | 541 EXPECT_TRUE(decoder.ok()); |
| 542 EXPECT_EQ(val, result); | 542 EXPECT_EQ(val, result); |
| 543 EXPECT_EQ(index + 1, length); | 543 EXPECT_EQ(index + 1, length); |
| 544 } | 544 } |
| 545 } | 545 } |
| 546 } | 546 } |
| (...skipping 20 matching lines...) Expand all Loading... |
| 567 for (int j = 0; j < kMaxSize; j++) { | 567 for (int j = 0; j < kMaxSize; j++) { |
| 568 data[j] = static_cast<byte>((val >> (7 * j)) & MASK_7); | 568 data[j] = static_cast<byte>((val >> (7 * j)) & MASK_7); |
| 569 } | 569 } |
| 570 for (int j = 0; j < length - 1; j++) { | 570 for (int j = 0; j < length - 1; j++) { |
| 571 data[j] |= 0x80; | 571 data[j] |= 0x80; |
| 572 } | 572 } |
| 573 | 573 |
| 574 // foreach buffer size 0...10 | 574 // foreach buffer size 0...10 |
| 575 for (int limit = 0; limit <= kMaxSize; limit++) { | 575 for (int limit = 0; limit <= kMaxSize; limit++) { |
| 576 decoder.Reset(data, data + limit); | 576 decoder.Reset(data, data + limit); |
| 577 int rlen; | 577 unsigned rlen; |
| 578 uint64_t result = decoder.checked_read_u64v(data, 0, &rlen); | 578 uint64_t result = decoder.checked_read_u64v(data, 0, &rlen); |
| 579 if (limit < length) { | 579 if (limit < length) { |
| 580 EXPECT_FALSE(decoder.ok()); | 580 EXPECT_FALSE(decoder.ok()); |
| 581 } else { | 581 } else { |
| 582 EXPECT_TRUE(decoder.ok()); | 582 EXPECT_TRUE(decoder.ok()); |
| 583 EXPECT_EQ(val, result); | 583 EXPECT_EQ(val, result); |
| 584 EXPECT_EQ(length, rlen); | 584 EXPECT_EQ(length, rlen); |
| 585 } | 585 } |
| 586 } | 586 } |
| 587 } | 587 } |
| (...skipping 21 matching lines...) Expand all Loading... |
| 609 for (int j = 0; j < kMaxSize; j++) { | 609 for (int j = 0; j < kMaxSize; j++) { |
| 610 data[j] = static_cast<byte>((val >> (7 * j)) & MASK_7); | 610 data[j] = static_cast<byte>((val >> (7 * j)) & MASK_7); |
| 611 } | 611 } |
| 612 for (int j = 0; j < length - 1; j++) { | 612 for (int j = 0; j < length - 1; j++) { |
| 613 data[j] |= 0x80; | 613 data[j] |= 0x80; |
| 614 } | 614 } |
| 615 | 615 |
| 616 // foreach buffer size 0...10 | 616 // foreach buffer size 0...10 |
| 617 for (int limit = 0; limit <= kMaxSize; limit++) { | 617 for (int limit = 0; limit <= kMaxSize; limit++) { |
| 618 decoder.Reset(data, data + limit); | 618 decoder.Reset(data, data + limit); |
| 619 int rlen; | 619 unsigned rlen; |
| 620 int64_t result = decoder.checked_read_i64v(data, 0, &rlen); | 620 int64_t result = decoder.checked_read_i64v(data, 0, &rlen); |
| 621 if (limit < length) { | 621 if (limit < length) { |
| 622 EXPECT_FALSE(decoder.ok()); | 622 EXPECT_FALSE(decoder.ok()); |
| 623 } else { | 623 } else { |
| 624 EXPECT_TRUE(decoder.ok()); | 624 EXPECT_TRUE(decoder.ok()); |
| 625 EXPECT_EQ(val, result); | 625 EXPECT_EQ(val, result); |
| 626 EXPECT_EQ(length, rlen); | 626 EXPECT_EQ(length, rlen); |
| 627 } | 627 } |
| 628 } | 628 } |
| 629 } | 629 } |
| 630 } | 630 } |
| 631 } | 631 } |
| 632 | 632 |
| 633 TEST_F(DecoderTest, ReadU64v_extra_bits) { | 633 TEST_F(DecoderTest, ReadU64v_extra_bits) { |
| 634 byte data[] = {0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00}; | 634 byte data[] = {0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00}; |
| 635 for (int i = 1; i < 128; i++) { | 635 for (int i = 1; i < 128; i++) { |
| 636 data[9] = static_cast<byte>(i << 1); | 636 data[9] = static_cast<byte>(i << 1); |
| 637 int length = 0; | 637 unsigned length = 0; |
| 638 decoder.Reset(data, data + sizeof(data)); | 638 decoder.Reset(data, data + sizeof(data)); |
| 639 decoder.checked_read_u64v(decoder.start(), 0, &length); | 639 decoder.checked_read_u64v(decoder.start(), 0, &length); |
| 640 EXPECT_EQ(10, length); | 640 EXPECT_EQ(10, length); |
| 641 EXPECT_FALSE(decoder.ok()); | 641 EXPECT_FALSE(decoder.ok()); |
| 642 } | 642 } |
| 643 } | 643 } |
| 644 | 644 |
| 645 TEST_F(DecoderTest, ReadI64v_extra_bits_negative) { | 645 TEST_F(DecoderTest, ReadI64v_extra_bits_negative) { |
| 646 // OK for negative signed values to have extra ones. | 646 // OK for negative signed values to have extra ones. |
| 647 int length = 0; | 647 unsigned length = 0; |
| 648 byte data[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f}; | 648 byte data[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f}; |
| 649 decoder.Reset(data, data + sizeof(data)); | 649 decoder.Reset(data, data + sizeof(data)); |
| 650 decoder.checked_read_i64v(decoder.start(), 0, &length); | 650 decoder.checked_read_i64v(decoder.start(), 0, &length); |
| 651 EXPECT_EQ(10, length); | 651 EXPECT_EQ(10, length); |
| 652 EXPECT_TRUE(decoder.ok()); | 652 EXPECT_TRUE(decoder.ok()); |
| 653 } | 653 } |
| 654 | 654 |
| 655 TEST_F(DecoderTest, ReadI64v_extra_bits_positive) { | 655 TEST_F(DecoderTest, ReadI64v_extra_bits_positive) { |
| 656 // Not OK for positive signed values to have extra ones. | 656 // Not OK for positive signed values to have extra ones. |
| 657 int length = 0; | 657 unsigned length = 0; |
| 658 byte data[] = {0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x77}; | 658 byte data[] = {0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x77}; |
| 659 decoder.Reset(data, data + sizeof(data)); | 659 decoder.Reset(data, data + sizeof(data)); |
| 660 decoder.checked_read_i64v(decoder.start(), 0, &length); | 660 decoder.checked_read_i64v(decoder.start(), 0, &length); |
| 661 EXPECT_EQ(10, length); | 661 EXPECT_EQ(10, length); |
| 662 EXPECT_FALSE(decoder.ok()); | 662 EXPECT_FALSE(decoder.ok()); |
| 663 } | 663 } |
| 664 | 664 |
| 665 } // namespace wasm | 665 } // namespace wasm |
| 666 } // namespace internal | 666 } // namespace internal |
| 667 } // namespace v8 | 667 } // namespace v8 |
| OLD | NEW |