Home | History | Annotate | Download | only in wasm
      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
      3 // found in the LICENSE file.
      4 
      5 #include "test/unittests/test-utils.h"
      6 
      7 #include "src/objects-inl.h"
      8 #include "src/wasm/decoder.h"
      9 #include "src/wasm/wasm-macro-gen.h"
     10 
     11 namespace v8 {
     12 namespace internal {
     13 namespace wasm {
     14 
     15 class DecoderTest : public TestWithZone {
     16  public:
     17   DecoderTest() : decoder(nullptr, nullptr) {}
     18 
     19   Decoder decoder;
     20 };
     21 
     22 #define CHECK_UINT32V_INLINE(expected, expected_length, ...)           \
     23   do {                                                                 \
     24     const byte data[] = {__VA_ARGS__};                                 \
     25     decoder.Reset(data, data + sizeof(data));                          \
     26     unsigned length;                                                   \
     27     EXPECT_EQ(expected,                                                \
     28               decoder.checked_read_u32v(decoder.start(), 0, &length)); \
     29     EXPECT_EQ(expected_length, length);                                \
     30   } while (false)
     31 
     32 #define CHECK_INT32V_INLINE(expected, expected_length, ...)            \
     33   do {                                                                 \
     34     const byte data[] = {__VA_ARGS__};                                 \
     35     decoder.Reset(data, data + sizeof(data));                          \
     36     unsigned length;                                                   \
     37     EXPECT_EQ(expected,                                                \
     38               decoder.checked_read_i32v(decoder.start(), 0, &length)); \
     39     EXPECT_EQ(expected_length, length);                                \
     40   } while (false)
     41 
     42 #define CHECK_UINT64V_INLINE(expected, expected_length, ...)           \
     43   do {                                                                 \
     44     const byte data[] = {__VA_ARGS__};                                 \
     45     decoder.Reset(data, data + sizeof(data));                          \
     46     unsigned length;                                                   \
     47     EXPECT_EQ(expected,                                                \
     48               decoder.checked_read_u64v(decoder.start(), 0, &length)); \
     49     EXPECT_EQ(expected_length, length);                                \
     50   } while (false)
     51 
     52 #define CHECK_INT64V_INLINE(expected, expected_length, ...)            \
     53   do {                                                                 \
     54     const byte data[] = {__VA_ARGS__};                                 \
     55     decoder.Reset(data, data + sizeof(data));                          \
     56     unsigned length;                                                   \
     57     EXPECT_EQ(expected,                                                \
     58               decoder.checked_read_i64v(decoder.start(), 0, &length)); \
     59     EXPECT_EQ(expected_length, length);                                \
     60   } while (false)
     61 
     62 TEST_F(DecoderTest, ReadU32v_OneByte) {
     63   CHECK_UINT32V_INLINE(0, 1, 0);
     64   CHECK_UINT32V_INLINE(5, 1, 5);
     65   CHECK_UINT32V_INLINE(7, 1, 7);
     66   CHECK_UINT32V_INLINE(9, 1, 9);
     67   CHECK_UINT32V_INLINE(37, 1, 37);
     68   CHECK_UINT32V_INLINE(69, 1, 69);
     69   CHECK_UINT32V_INLINE(110, 1, 110);
     70   CHECK_UINT32V_INLINE(125, 1, 125);
     71   CHECK_UINT32V_INLINE(126, 1, 126);
     72   CHECK_UINT32V_INLINE(127, 1, 127);
     73 }
     74 
     75 TEST_F(DecoderTest, ReadU32v_TwoByte) {
     76   CHECK_UINT32V_INLINE(0, 1, 0, 0);
     77   CHECK_UINT32V_INLINE(10, 1, 10, 0);
     78   CHECK_UINT32V_INLINE(27, 1, 27, 0);
     79   CHECK_UINT32V_INLINE(100, 1, 100, 0);
     80 
     81   CHECK_UINT32V_INLINE(444, 2, U32V_2(444));
     82   CHECK_UINT32V_INLINE(544, 2, U32V_2(544));
     83   CHECK_UINT32V_INLINE(1311, 2, U32V_2(1311));
     84   CHECK_UINT32V_INLINE(2333, 2, U32V_2(2333));
     85 
     86   for (uint32_t i = 0; i < 1 << 14; i = i * 13 + 1) {
     87     CHECK_UINT32V_INLINE(i, 2, U32V_2(i));
     88   }
     89 
     90   const uint32_t max = (1 << 14) - 1;
     91   CHECK_UINT32V_INLINE(max, 2, U32V_2(max));
     92 }
     93 
     94 TEST_F(DecoderTest, ReadU32v_ThreeByte) {
     95   CHECK_UINT32V_INLINE(0, 1, 0, 0, 0, 0);
     96   CHECK_UINT32V_INLINE(10, 1, 10, 0, 0, 0);
     97   CHECK_UINT32V_INLINE(27, 1, 27, 0, 0, 0);
     98   CHECK_UINT32V_INLINE(100, 1, 100, 0, 0, 0);
     99 
    100   CHECK_UINT32V_INLINE(11, 3, U32V_3(11));
    101   CHECK_UINT32V_INLINE(101, 3, U32V_3(101));
    102   CHECK_UINT32V_INLINE(446, 3, U32V_3(446));
    103   CHECK_UINT32V_INLINE(546, 3, U32V_3(546));
    104   CHECK_UINT32V_INLINE(1319, 3, U32V_3(1319));
    105   CHECK_UINT32V_INLINE(2338, 3, U32V_3(2338));
    106   CHECK_UINT32V_INLINE(8191, 3, U32V_3(8191));
    107   CHECK_UINT32V_INLINE(9999, 3, U32V_3(9999));
    108   CHECK_UINT32V_INLINE(14444, 3, U32V_3(14444));
    109   CHECK_UINT32V_INLINE(314444, 3, U32V_3(314444));
    110   CHECK_UINT32V_INLINE(614444, 3, U32V_3(614444));
    111 
    112   const uint32_t max = (1 << 21) - 1;
    113 
    114   for (uint32_t i = 0; i <= max; i = i * 13 + 3) {
    115     CHECK_UINT32V_INLINE(i, 3, U32V_3(i), 0);
    116   }
    117 
    118   CHECK_UINT32V_INLINE(max, 3, U32V_3(max));
    119 }
    120 
    121 TEST_F(DecoderTest, ReadU32v_FourByte) {
    122   CHECK_UINT32V_INLINE(0, 1, 0, 0, 0, 0, 0);
    123   CHECK_UINT32V_INLINE(10, 1, 10, 0, 0, 0, 0);
    124   CHECK_UINT32V_INLINE(27, 1, 27, 0, 0, 0, 0);
    125   CHECK_UINT32V_INLINE(100, 1, 100, 0, 0, 0, 0);
    126 
    127   CHECK_UINT32V_INLINE(13, 4, U32V_4(13));
    128   CHECK_UINT32V_INLINE(107, 4, U32V_4(107));
    129   CHECK_UINT32V_INLINE(449, 4, U32V_4(449));
    130   CHECK_UINT32V_INLINE(541, 4, U32V_4(541));
    131   CHECK_UINT32V_INLINE(1317, 4, U32V_4(1317));
    132   CHECK_UINT32V_INLINE(2334, 4, U32V_4(2334));
    133   CHECK_UINT32V_INLINE(8191, 4, U32V_4(8191));
    134   CHECK_UINT32V_INLINE(9994, 4, U32V_4(9994));
    135   CHECK_UINT32V_INLINE(14442, 4, U32V_4(14442));
    136   CHECK_UINT32V_INLINE(314442, 4, U32V_4(314442));
    137   CHECK_UINT32V_INLINE(614442, 4, U32V_4(614442));
    138   CHECK_UINT32V_INLINE(1614442, 4, U32V_4(1614442));
    139   CHECK_UINT32V_INLINE(5614442, 4, U32V_4(5614442));
    140   CHECK_UINT32V_INLINE(19614442, 4, U32V_4(19614442));
    141 
    142   const uint32_t max = (1 << 28) - 1;
    143 
    144   for (uint32_t i = 0; i <= max; i = i * 13 + 5) {
    145     CHECK_UINT32V_INLINE(i, 4, U32V_4(i), 0);
    146   }
    147 
    148   CHECK_UINT32V_INLINE(max, 4, U32V_4(max));
    149 }
    150 
    151 TEST_F(DecoderTest, ReadU32v_FiveByte) {
    152   CHECK_UINT32V_INLINE(0, 1, 0, 0, 0, 0, 0);
    153   CHECK_UINT32V_INLINE(10, 1, 10, 0, 0, 0, 0);
    154   CHECK_UINT32V_INLINE(27, 1, 27, 0, 0, 0, 0);
    155   CHECK_UINT32V_INLINE(100, 1, 100, 0, 0, 0, 0);
    156 
    157   CHECK_UINT32V_INLINE(13, 5, U32V_5(13));
    158   CHECK_UINT32V_INLINE(107, 5, U32V_5(107));
    159   CHECK_UINT32V_INLINE(449, 5, U32V_5(449));
    160   CHECK_UINT32V_INLINE(541, 5, U32V_5(541));
    161   CHECK_UINT32V_INLINE(1317, 5, U32V_5(1317));
    162   CHECK_UINT32V_INLINE(2334, 5, U32V_5(2334));
    163   CHECK_UINT32V_INLINE(8191, 5, U32V_5(8191));
    164   CHECK_UINT32V_INLINE(9994, 5, U32V_5(9994));
    165   CHECK_UINT32V_INLINE(24442, 5, U32V_5(24442));
    166   CHECK_UINT32V_INLINE(414442, 5, U32V_5(414442));
    167   CHECK_UINT32V_INLINE(714442, 5, U32V_5(714442));
    168   CHECK_UINT32V_INLINE(1614442, 5, U32V_5(1614442));
    169   CHECK_UINT32V_INLINE(6614442, 5, U32V_5(6614442));
    170   CHECK_UINT32V_INLINE(89614442, 5, U32V_5(89614442));
    171   CHECK_UINT32V_INLINE(2219614442u, 5, U32V_5(2219614442u));
    172   CHECK_UINT32V_INLINE(3219614442u, 5, U32V_5(3219614442u));
    173   CHECK_UINT32V_INLINE(4019614442u, 5, U32V_5(4019614442u));
    174 
    175   const uint32_t max = 0xFFFFFFFFu;
    176 
    177   for (uint32_t i = 1; i < 32; i++) {
    178     uint32_t val = 0x983489aau << i;
    179     CHECK_UINT32V_INLINE(val, 5, U32V_5(val), 0);
    180   }
    181 
    182   CHECK_UINT32V_INLINE(max, 5, U32V_5(max));
    183 }
    184 
    185 TEST_F(DecoderTest, ReadU32v_various) {
    186   for (int i = 0; i < 10; i++) {
    187     uint32_t x = 0xCCCCCCCCu * i;
    188     for (int width = 0; width < 32; width++) {
    189       uint32_t val = x >> width;
    190 
    191       CHECK_UINT32V_INLINE(val & MASK_7, 1, U32V_1(val));
    192       CHECK_UINT32V_INLINE(val & MASK_14, 2, U32V_2(val));
    193       CHECK_UINT32V_INLINE(val & MASK_21, 3, U32V_3(val));
    194       CHECK_UINT32V_INLINE(val & MASK_28, 4, U32V_4(val));
    195       CHECK_UINT32V_INLINE(val, 5, U32V_5(val));
    196     }
    197   }
    198 }
    199 
    200 TEST_F(DecoderTest, ReadI32v_OneByte) {
    201   CHECK_INT32V_INLINE(0, 1, 0);
    202   CHECK_INT32V_INLINE(4, 1, 4);
    203   CHECK_INT32V_INLINE(6, 1, 6);
    204   CHECK_INT32V_INLINE(9, 1, 9);
    205   CHECK_INT32V_INLINE(33, 1, 33);
    206   CHECK_INT32V_INLINE(61, 1, 61);
    207   CHECK_INT32V_INLINE(63, 1, 63);
    208 
    209   CHECK_INT32V_INLINE(-1, 1, 127);
    210   CHECK_INT32V_INLINE(-2, 1, 126);
    211   CHECK_INT32V_INLINE(-11, 1, 117);
    212   CHECK_INT32V_INLINE(-62, 1, 66);
    213   CHECK_INT32V_INLINE(-63, 1, 65);
    214   CHECK_INT32V_INLINE(-64, 1, 64);
    215 }
    216 
    217 TEST_F(DecoderTest, ReadI32v_TwoByte) {
    218   CHECK_INT32V_INLINE(0, 2, U32V_2(0));
    219   CHECK_INT32V_INLINE(9, 2, U32V_2(9));
    220   CHECK_INT32V_INLINE(61, 2, U32V_2(61));
    221   CHECK_INT32V_INLINE(63, 2, U32V_2(63));
    222 
    223   CHECK_INT32V_INLINE(-1, 2, U32V_2(-1));
    224   CHECK_INT32V_INLINE(-2, 2, U32V_2(-2));
    225   CHECK_INT32V_INLINE(-63, 2, U32V_2(-63));
    226   CHECK_INT32V_INLINE(-64, 2, U32V_2(-64));
    227 
    228   CHECK_INT32V_INLINE(-200, 2, U32V_2(-200));
    229   CHECK_INT32V_INLINE(-1002, 2, U32V_2(-1002));
    230   CHECK_INT32V_INLINE(-2004, 2, U32V_2(-2004));
    231   CHECK_INT32V_INLINE(-4077, 2, U32V_2(-4077));
    232 
    233   CHECK_INT32V_INLINE(207, 2, U32V_2(207));
    234   CHECK_INT32V_INLINE(1009, 2, U32V_2(1009));
    235   CHECK_INT32V_INLINE(2003, 2, U32V_2(2003));
    236   CHECK_INT32V_INLINE(4072, 2, U32V_2(4072));
    237 
    238   const int32_t min = 0 - (1 << 13);
    239   for (int i = min; i < min + 10; i++) {
    240     CHECK_INT32V_INLINE(i, 2, U32V_2(i));
    241   }
    242 
    243   const int32_t max = (1 << 13) - 1;
    244   for (int i = max; i > max - 10; i--) {
    245     CHECK_INT32V_INLINE(i, 2, U32V_2(i));
    246   }
    247 }
    248 
    249 TEST_F(DecoderTest, ReadI32v_ThreeByte) {
    250   CHECK_INT32V_INLINE(0, 3, U32V_3(0));
    251   CHECK_INT32V_INLINE(9, 3, U32V_3(9));
    252   CHECK_INT32V_INLINE(61, 3, U32V_3(61));
    253   CHECK_INT32V_INLINE(63, 3, U32V_3(63));
    254 
    255   CHECK_INT32V_INLINE(-1, 3, U32V_3(-1));
    256   CHECK_INT32V_INLINE(-2, 3, U32V_3(-2));
    257   CHECK_INT32V_INLINE(-63, 3, U32V_3(-63));
    258   CHECK_INT32V_INLINE(-64, 3, U32V_3(-64));
    259 
    260   CHECK_INT32V_INLINE(-207, 3, U32V_3(-207));
    261   CHECK_INT32V_INLINE(-1012, 3, U32V_3(-1012));
    262   CHECK_INT32V_INLINE(-4067, 3, U32V_3(-4067));
    263   CHECK_INT32V_INLINE(-14067, 3, U32V_3(-14067));
    264   CHECK_INT32V_INLINE(-234061, 3, U32V_3(-234061));
    265 
    266   CHECK_INT32V_INLINE(237, 3, U32V_3(237));
    267   CHECK_INT32V_INLINE(1309, 3, U32V_3(1309));
    268   CHECK_INT32V_INLINE(4372, 3, U32V_3(4372));
    269   CHECK_INT32V_INLINE(64372, 3, U32V_3(64372));
    270   CHECK_INT32V_INLINE(374372, 3, U32V_3(374372));
    271 
    272   const int32_t min = 0 - (1 << 20);
    273   for (int i = min; i < min + 10; i++) {
    274     CHECK_INT32V_INLINE(i, 3, U32V_3(i));
    275   }
    276 
    277   const int32_t max = (1 << 20) - 1;
    278   for (int i = max; i > max - 10; i--) {
    279     CHECK_INT32V_INLINE(i, 3, U32V_3(i));
    280   }
    281 }
    282 
    283 TEST_F(DecoderTest, ReadI32v_FourByte) {
    284   CHECK_INT32V_INLINE(0, 4, U32V_4(0));
    285   CHECK_INT32V_INLINE(9, 4, U32V_4(9));
    286   CHECK_INT32V_INLINE(61, 4, U32V_4(61));
    287   CHECK_INT32V_INLINE(63, 4, U32V_4(63));
    288 
    289   CHECK_INT32V_INLINE(-1, 4, U32V_4(-1));
    290   CHECK_INT32V_INLINE(-2, 4, U32V_4(-2));
    291   CHECK_INT32V_INLINE(-63, 4, U32V_4(-63));
    292   CHECK_INT32V_INLINE(-64, 4, U32V_4(-64));
    293 
    294   CHECK_INT32V_INLINE(-267, 4, U32V_4(-267));
    295   CHECK_INT32V_INLINE(-1612, 4, U32V_4(-1612));
    296   CHECK_INT32V_INLINE(-4667, 4, U32V_4(-4667));
    297   CHECK_INT32V_INLINE(-16067, 4, U32V_4(-16067));
    298   CHECK_INT32V_INLINE(-264061, 4, U32V_4(-264061));
    299   CHECK_INT32V_INLINE(-1264061, 4, U32V_4(-1264061));
    300   CHECK_INT32V_INLINE(-6264061, 4, U32V_4(-6264061));
    301   CHECK_INT32V_INLINE(-8264061, 4, U32V_4(-8264061));
    302 
    303   CHECK_INT32V_INLINE(277, 4, U32V_4(277));
    304   CHECK_INT32V_INLINE(1709, 4, U32V_4(1709));
    305   CHECK_INT32V_INLINE(4772, 4, U32V_4(4772));
    306   CHECK_INT32V_INLINE(67372, 4, U32V_4(67372));
    307   CHECK_INT32V_INLINE(374372, 4, U32V_4(374372));
    308   CHECK_INT32V_INLINE(2374372, 4, U32V_4(2374372));
    309   CHECK_INT32V_INLINE(7374372, 4, U32V_4(7374372));
    310   CHECK_INT32V_INLINE(9374372, 4, U32V_4(9374372));
    311 
    312   const int32_t min = 0 - (1 << 27);
    313   for (int i = min; i < min + 10; i++) {
    314     CHECK_INT32V_INLINE(i, 4, U32V_4(i));
    315   }
    316 
    317   const int32_t max = (1 << 27) - 1;
    318   for (int i = max; i > max - 10; i--) {
    319     CHECK_INT32V_INLINE(i, 4, U32V_4(i));
    320   }
    321 }
    322 
    323 TEST_F(DecoderTest, ReadI32v_FiveByte) {
    324   CHECK_INT32V_INLINE(0, 5, U32V_5(0));
    325   CHECK_INT32V_INLINE(16, 5, U32V_5(16));
    326   CHECK_INT32V_INLINE(94, 5, U32V_5(94));
    327   CHECK_INT32V_INLINE(127, 5, U32V_5(127));
    328 
    329   CHECK_INT32V_INLINE(-1, 5, U32V_5(-1));
    330   CHECK_INT32V_INLINE(-2, 5, U32V_5(-2));
    331   CHECK_INT32V_INLINE(-63, 5, U32V_5(-63));
    332   CHECK_INT32V_INLINE(-64, 5, U32V_5(-64));
    333 
    334   CHECK_INT32V_INLINE(-257, 5, U32V_5(-257));
    335   CHECK_INT32V_INLINE(-1512, 5, U32V_5(-1512));
    336   CHECK_INT32V_INLINE(-4567, 5, U32V_5(-4567));
    337   CHECK_INT32V_INLINE(-15067, 5, U32V_5(-15067));
    338   CHECK_INT32V_INLINE(-254061, 5, U32V_5(-254061));
    339   CHECK_INT32V_INLINE(-1364061, 5, U32V_5(-1364061));
    340   CHECK_INT32V_INLINE(-6364061, 5, U32V_5(-6364061));
    341   CHECK_INT32V_INLINE(-8364061, 5, U32V_5(-8364061));
    342   CHECK_INT32V_INLINE(-28364061, 5, U32V_5(-28364061));
    343   CHECK_INT32V_INLINE(-228364061, 5, U32V_5(-228364061));
    344 
    345   CHECK_INT32V_INLINE(227, 5, U32V_5(227));
    346   CHECK_INT32V_INLINE(1209, 5, U32V_5(1209));
    347   CHECK_INT32V_INLINE(4272, 5, U32V_5(4272));
    348   CHECK_INT32V_INLINE(62372, 5, U32V_5(62372));
    349   CHECK_INT32V_INLINE(324372, 5, U32V_5(324372));
    350   CHECK_INT32V_INLINE(2274372, 5, U32V_5(2274372));
    351   CHECK_INT32V_INLINE(7274372, 5, U32V_5(7274372));
    352   CHECK_INT32V_INLINE(9274372, 5, U32V_5(9274372));
    353   CHECK_INT32V_INLINE(42374372, 5, U32V_5(42374372));
    354   CHECK_INT32V_INLINE(429374372, 5, U32V_5(429374372));
    355 
    356   const int32_t min = kMinInt;
    357   for (int i = min; i < min + 10; i++) {
    358     CHECK_INT32V_INLINE(i, 5, U32V_5(i));
    359   }
    360 
    361   const int32_t max = kMaxInt;
    362   for (int i = max; i > max - 10; i--) {
    363     CHECK_INT32V_INLINE(i, 5, U32V_5(i));
    364   }
    365 }
    366 
    367 TEST_F(DecoderTest, ReadU32v_off_end1) {
    368   static const byte data[] = {U32V_1(11)};
    369   unsigned length = 0;
    370   decoder.Reset(data, data);
    371   decoder.checked_read_u32v(decoder.start(), 0, &length);
    372   EXPECT_EQ(0, length);
    373   EXPECT_FALSE(decoder.ok());
    374 }
    375 
    376 TEST_F(DecoderTest, ReadU32v_off_end2) {
    377   static const byte data[] = {U32V_2(1111)};
    378   for (size_t i = 0; i < sizeof(data); i++) {
    379     unsigned length = 0;
    380     decoder.Reset(data, data + i);
    381     decoder.checked_read_u32v(decoder.start(), 0, &length);
    382     EXPECT_EQ(i, length);
    383     EXPECT_FALSE(decoder.ok());
    384   }
    385 }
    386 
    387 TEST_F(DecoderTest, ReadU32v_off_end3) {
    388   static const byte data[] = {U32V_3(111111)};
    389   for (size_t i = 0; i < sizeof(data); i++) {
    390     unsigned length = 0;
    391     decoder.Reset(data, data + i);
    392     decoder.checked_read_u32v(decoder.start(), 0, &length);
    393     EXPECT_EQ(i, length);
    394     EXPECT_FALSE(decoder.ok());
    395   }
    396 }
    397 
    398 TEST_F(DecoderTest, ReadU32v_off_end4) {
    399   static const byte data[] = {U32V_4(11111111)};
    400   for (size_t i = 0; i < sizeof(data); i++) {
    401     unsigned length = 0;
    402     decoder.Reset(data, data + i);
    403     decoder.checked_read_u32v(decoder.start(), 0, &length);
    404     EXPECT_EQ(i, length);
    405     EXPECT_FALSE(decoder.ok());
    406   }
    407 }
    408 
    409 TEST_F(DecoderTest, ReadU32v_off_end5) {
    410   static const byte data[] = {U32V_5(111111111)};
    411   for (size_t i = 0; i < sizeof(data); i++) {
    412     unsigned length = 0;
    413     decoder.Reset(data, data + i);
    414     decoder.checked_read_u32v(decoder.start(), 0, &length);
    415     EXPECT_EQ(i, length);
    416     EXPECT_FALSE(decoder.ok());
    417   }
    418 }
    419 
    420 TEST_F(DecoderTest, ReadU32v_extra_bits) {
    421   byte data[] = {0x80, 0x80, 0x80, 0x80, 0x00};
    422   for (int i = 1; i < 16; i++) {
    423     data[4] = static_cast<byte>(i << 4);
    424     unsigned length = 0;
    425     decoder.Reset(data, data + sizeof(data));
    426     decoder.checked_read_u32v(decoder.start(), 0, &length);
    427     EXPECT_EQ(5, length);
    428     EXPECT_FALSE(decoder.ok());
    429   }
    430 }
    431 
    432 TEST_F(DecoderTest, ReadI32v_extra_bits_negative) {
    433   // OK for negative signed values to have extra ones.
    434   unsigned length = 0;
    435   byte data[] = {0xff, 0xff, 0xff, 0xff, 0x7f};
    436   decoder.Reset(data, data + sizeof(data));
    437   decoder.checked_read_i32v(decoder.start(), 0, &length);
    438   EXPECT_EQ(5, length);
    439   EXPECT_TRUE(decoder.ok());
    440 }
    441 
    442 TEST_F(DecoderTest, ReadI32v_extra_bits_positive) {
    443   // Not OK for positive signed values to have extra ones.
    444   unsigned length = 0;
    445   byte data[] = {0x80, 0x80, 0x80, 0x80, 0x77};
    446   decoder.Reset(data, data + sizeof(data));
    447   decoder.checked_read_i32v(decoder.start(), 0, &length);
    448   EXPECT_EQ(5, length);
    449   EXPECT_FALSE(decoder.ok());
    450 }
    451 
    452 TEST_F(DecoderTest, ReadU32v_Bits) {
    453   // A more exhaustive test.
    454   const int kMaxSize = 5;
    455   const uint32_t kVals[] = {
    456       0xaabbccdd, 0x11223344, 0x33445566, 0xffeeddcc, 0xF0F0F0F0, 0x0F0F0F0F,
    457       0xEEEEEEEE, 0xAAAAAAAA, 0x12345678, 0x9abcdef0, 0x80309488, 0x729ed997,
    458       0xc4a0cf81, 0x16c6eb85, 0x4206db8e, 0xf3b089d5, 0xaa2e223e, 0xf99e29c8,
    459       0x4a4357d8, 0x1890b1c1, 0x8d80a085, 0xacb6ae4c, 0x1b827e10, 0xeb5c7bd9,
    460       0xbb1bc146, 0xdf57a33l};
    461   byte data[kMaxSize];
    462 
    463   // foreach value in above array
    464   for (size_t v = 0; v < arraysize(kVals); v++) {
    465     // foreach length 1...32
    466     for (int i = 1; i <= 32; i++) {
    467       uint32_t val = kVals[v];
    468       if (i < 32) val &= ((1 << i) - 1);
    469 
    470       int length = 1 + i / 7;
    471       for (int j = 0; j < kMaxSize; j++) {
    472         data[j] = static_cast<byte>((val >> (7 * j)) & MASK_7);
    473       }
    474       for (int j = 0; j < length - 1; j++) {
    475         data[j] |= 0x80;
    476       }
    477 
    478       // foreach buffer size 0...5
    479       for (int limit = 0; limit <= kMaxSize; limit++) {
    480         decoder.Reset(data, data + limit);
    481         unsigned rlen;
    482         uint32_t result = decoder.checked_read_u32v(data, 0, &rlen);
    483         if (limit < length) {
    484           EXPECT_FALSE(decoder.ok());
    485         } else {
    486           EXPECT_TRUE(decoder.ok());
    487           EXPECT_EQ(val, result);
    488           EXPECT_EQ(length, rlen);
    489         }
    490       }
    491     }
    492   }
    493 }
    494 
    495 TEST_F(DecoderTest, ReadU64v_OneByte) {
    496   CHECK_UINT64V_INLINE(0, 1, 0);
    497   CHECK_UINT64V_INLINE(6, 1, 6);
    498   CHECK_UINT64V_INLINE(8, 1, 8);
    499   CHECK_UINT64V_INLINE(12, 1, 12);
    500   CHECK_UINT64V_INLINE(33, 1, 33);
    501   CHECK_UINT64V_INLINE(59, 1, 59);
    502   CHECK_UINT64V_INLINE(110, 1, 110);
    503   CHECK_UINT64V_INLINE(125, 1, 125);
    504   CHECK_UINT64V_INLINE(126, 1, 126);
    505   CHECK_UINT64V_INLINE(127, 1, 127);
    506 }
    507 
    508 TEST_F(DecoderTest, ReadI64v_OneByte) {
    509   CHECK_INT64V_INLINE(0, 1, 0);
    510   CHECK_INT64V_INLINE(4, 1, 4);
    511   CHECK_INT64V_INLINE(6, 1, 6);
    512   CHECK_INT64V_INLINE(9, 1, 9);
    513   CHECK_INT64V_INLINE(33, 1, 33);
    514   CHECK_INT64V_INLINE(61, 1, 61);
    515   CHECK_INT64V_INLINE(63, 1, 63);
    516 
    517   CHECK_INT64V_INLINE(-1, 1, 127);
    518   CHECK_INT64V_INLINE(-2, 1, 126);
    519   CHECK_INT64V_INLINE(-11, 1, 117);
    520   CHECK_INT64V_INLINE(-62, 1, 66);
    521   CHECK_INT64V_INLINE(-63, 1, 65);
    522   CHECK_INT64V_INLINE(-64, 1, 64);
    523 }
    524 
    525 TEST_F(DecoderTest, ReadU64v_PowerOf2) {
    526   const int kMaxSize = 10;
    527   byte data[kMaxSize];
    528 
    529   for (int i = 0; i < 64; i++) {
    530     const uint64_t val = 1ull << i;
    531     int index = i / 7;
    532     data[index] = 1 << (i % 7);
    533     memset(data, 0x80, index);
    534 
    535     for (int limit = 0; limit <= kMaxSize; limit++) {
    536       decoder.Reset(data, data + limit);
    537       unsigned length;
    538       uint64_t result = decoder.checked_read_u64v(data, 0, &length);
    539       if (limit <= index) {
    540         EXPECT_FALSE(decoder.ok());
    541       } else {
    542         EXPECT_TRUE(decoder.ok());
    543         EXPECT_EQ(val, result);
    544         EXPECT_EQ(index + 1, length);
    545       }
    546     }
    547   }
    548 }
    549 
    550 TEST_F(DecoderTest, ReadU64v_Bits) {
    551   const int kMaxSize = 10;
    552   const uint64_t kVals[] = {
    553       0xaabbccdd11223344ull, 0x33445566ffeeddccull, 0xF0F0F0F0F0F0F0F0ull,
    554       0x0F0F0F0F0F0F0F0Full, 0xEEEEEEEEEEEEEEEEull, 0xAAAAAAAAAAAAAAAAull,
    555       0x123456789abcdef0ull, 0x80309488729ed997ull, 0xc4a0cf8116c6eb85ull,
    556       0x4206db8ef3b089d5ull, 0xaa2e223ef99e29c8ull, 0x4a4357d81890b1c1ull,
    557       0x8d80a085acb6ae4cull, 0x1b827e10eb5c7bd9ull, 0xbb1bc146df57a338ull};
    558   byte data[kMaxSize];
    559 
    560   // foreach value in above array
    561   for (size_t v = 0; v < arraysize(kVals); v++) {
    562     // foreach length 1...64
    563     for (int i = 1; i <= 64; i++) {
    564       uint64_t val = kVals[v];
    565       if (i < 64) val &= ((1ull << i) - 1);
    566 
    567       int length = 1 + i / 7;
    568       for (int j = 0; j < kMaxSize; j++) {
    569         data[j] = static_cast<byte>((val >> (7 * j)) & MASK_7);
    570       }
    571       for (int j = 0; j < length - 1; j++) {
    572         data[j] |= 0x80;
    573       }
    574 
    575       // foreach buffer size 0...10
    576       for (int limit = 0; limit <= kMaxSize; limit++) {
    577         decoder.Reset(data, data + limit);
    578         unsigned rlen;
    579         uint64_t result = decoder.checked_read_u64v(data, 0, &rlen);
    580         if (limit < length) {
    581           EXPECT_FALSE(decoder.ok());
    582         } else {
    583           EXPECT_TRUE(decoder.ok());
    584           EXPECT_EQ(val, result);
    585           EXPECT_EQ(length, rlen);
    586         }
    587       }
    588     }
    589   }
    590 }
    591 
    592 TEST_F(DecoderTest, ReadI64v_Bits) {
    593   const int kMaxSize = 10;
    594   // Exhaustive signedness test.
    595   const uint64_t kVals[] = {
    596       0xaabbccdd11223344ull, 0x33445566ffeeddccull, 0xF0F0F0F0F0F0F0F0ull,
    597       0x0F0F0F0F0F0F0F0Full, 0xEEEEEEEEEEEEEEEEull, 0xAAAAAAAAAAAAAAAAull,
    598       0x123456789abcdef0ull, 0x80309488729ed997ull, 0xc4a0cf8116c6eb85ull,
    599       0x4206db8ef3b089d5ull, 0xaa2e223ef99e29c8ull, 0x4a4357d81890b1c1ull,
    600       0x8d80a085acb6ae4cull, 0x1b827e10eb5c7bd9ull, 0xbb1bc146df57a338ull};
    601   byte data[kMaxSize];
    602 
    603   // foreach value in above array
    604   for (size_t v = 0; v < arraysize(kVals); v++) {
    605     // foreach length 1...64
    606     for (int i = 1; i <= 64; i++) {
    607       const int64_t val = bit_cast<int64_t>(kVals[v] << (64 - i)) >> (64 - i);
    608 
    609       int length = 1 + i / 7;
    610       for (int j = 0; j < kMaxSize; j++) {
    611         data[j] = static_cast<byte>((val >> (7 * j)) & MASK_7);
    612       }
    613       for (int j = 0; j < length - 1; j++) {
    614         data[j] |= 0x80;
    615       }
    616 
    617       // foreach buffer size 0...10
    618       for (int limit = 0; limit <= kMaxSize; limit++) {
    619         decoder.Reset(data, data + limit);
    620         unsigned rlen;
    621         int64_t result = decoder.checked_read_i64v(data, 0, &rlen);
    622         if (limit < length) {
    623           EXPECT_FALSE(decoder.ok());
    624         } else {
    625           EXPECT_TRUE(decoder.ok());
    626           EXPECT_EQ(val, result);
    627           EXPECT_EQ(length, rlen);
    628         }
    629       }
    630     }
    631   }
    632 }
    633 
    634 TEST_F(DecoderTest, ReadU64v_extra_bits) {
    635   byte data[] = {0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00};
    636   for (int i = 1; i < 128; i++) {
    637     data[9] = static_cast<byte>(i << 1);
    638     unsigned length = 0;
    639     decoder.Reset(data, data + sizeof(data));
    640     decoder.checked_read_u64v(decoder.start(), 0, &length);
    641     EXPECT_EQ(10, length);
    642     EXPECT_FALSE(decoder.ok());
    643   }
    644 }
    645 
    646 TEST_F(DecoderTest, ReadI64v_extra_bits_negative) {
    647   // OK for negative signed values to have extra ones.
    648   unsigned length = 0;
    649   byte data[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f};
    650   decoder.Reset(data, data + sizeof(data));
    651   decoder.checked_read_i64v(decoder.start(), 0, &length);
    652   EXPECT_EQ(10, length);
    653   EXPECT_TRUE(decoder.ok());
    654 }
    655 
    656 TEST_F(DecoderTest, ReadI64v_extra_bits_positive) {
    657   // Not OK for positive signed values to have extra ones.
    658   unsigned length = 0;
    659   byte data[] = {0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x77};
    660   decoder.Reset(data, data + sizeof(data));
    661   decoder.checked_read_i64v(decoder.start(), 0, &length);
    662   EXPECT_EQ(10, length);
    663   EXPECT_FALSE(decoder.ok());
    664 }
    665 
    666 }  // namespace wasm
    667 }  // namespace internal
    668 }  // namespace v8
    669