blob: b9759332bbfde4524fd577ea5901416434e9ce07 [file] [log] [blame]
Ben Murdochc5610432016-08-08 18:44:38 +01001// 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
Ben Murdoch61f157c2016-09-16 13:49:30 +01007#include "src/objects-inl.h"
Ben Murdochc5610432016-08-08 18:44:38 +01008#include "src/wasm/decoder.h"
9#include "src/wasm/leb-helper.h"
10
11namespace v8 {
12namespace internal {
13namespace wasm {
14
15class LEBHelperTest : public TestWithZone {};
16
17TEST_F(LEBHelperTest, sizeof_u32v) {
18 EXPECT_EQ(1, LEBHelper::sizeof_u32v(0));
19 EXPECT_EQ(1, LEBHelper::sizeof_u32v(1));
20 EXPECT_EQ(1, LEBHelper::sizeof_u32v(3));
21
22 for (uint32_t i = 4; i < 128; i++) {
23 EXPECT_EQ(1, LEBHelper::sizeof_u32v(i));
24 }
25
26 for (uint32_t i = (1 << 7); i < (1 << 9); i++) {
27 EXPECT_EQ(2, LEBHelper::sizeof_u32v(i));
28 }
29
30 for (uint32_t i = (1 << 14); i < (1 << 16); i += 33) {
31 EXPECT_EQ(3, LEBHelper::sizeof_u32v(i));
32 }
33
34 for (uint32_t i = (1 << 21); i < (1 << 24); i += 33999) {
35 EXPECT_EQ(4, LEBHelper::sizeof_u32v(i));
36 }
37
38 for (uint32_t i = (1 << 28); i < (1 << 31); i += 33997779) {
39 EXPECT_EQ(5, LEBHelper::sizeof_u32v(i));
40 }
41
42 EXPECT_EQ(5, LEBHelper::sizeof_u32v(0xFFFFFFFF));
43}
44
45TEST_F(LEBHelperTest, sizeof_i32v) {
46 EXPECT_EQ(1, LEBHelper::sizeof_i32v(0));
47 EXPECT_EQ(1, LEBHelper::sizeof_i32v(1));
48 EXPECT_EQ(1, LEBHelper::sizeof_i32v(3));
49
50 for (int32_t i = 0; i < (1 << 6); i++) {
51 EXPECT_EQ(1, LEBHelper::sizeof_i32v(i));
52 }
53
54 for (int32_t i = (1 << 6); i < (1 << 8); i++) {
55 EXPECT_EQ(2, LEBHelper::sizeof_i32v(i));
56 }
57
58 for (int32_t i = (1 << 13); i < (1 << 15); i += 31) {
59 EXPECT_EQ(3, LEBHelper::sizeof_i32v(i));
60 }
61
62 for (int32_t i = (1 << 20); i < (1 << 22); i += 31991) {
63 EXPECT_EQ(4, LEBHelper::sizeof_i32v(i));
64 }
65
66 for (int32_t i = (1 << 27); i < (1 << 29); i += 3199893) {
67 EXPECT_EQ(5, LEBHelper::sizeof_i32v(i));
68 }
69
70 for (int32_t i = -(1 << 6); i <= 0; i++) {
71 EXPECT_EQ(1, LEBHelper::sizeof_i32v(i));
72 }
73
74 for (int32_t i = -(1 << 13); i < -(1 << 6); i++) {
75 EXPECT_EQ(2, LEBHelper::sizeof_i32v(i));
76 }
77
78 for (int32_t i = -(1 << 20); i < -(1 << 18); i += 11) {
79 EXPECT_EQ(3, LEBHelper::sizeof_i32v(i));
80 }
81
82 for (int32_t i = -(1 << 27); i < -(1 << 25); i += 11999) {
83 EXPECT_EQ(4, LEBHelper::sizeof_i32v(i));
84 }
85
86 for (int32_t i = -(1 << 30); i < -(1 << 28); i += 1199999) {
87 EXPECT_EQ(5, LEBHelper::sizeof_i32v(i));
88 }
89}
90
91#define DECLARE_ENCODE_DECODE_CHECKER(ctype, name) \
92 static void CheckEncodeDecode_##name(ctype val) { \
93 static const int kSize = 16; \
94 static byte buffer[kSize]; \
95 byte *ptr = buffer; \
96 LEBHelper::write_##name(&ptr, val); \
97 EXPECT_EQ(LEBHelper::sizeof_##name(val), \
98 static_cast<size_t>(ptr - buffer)); \
99 Decoder decoder(buffer, buffer + kSize); \
Ben Murdoch61f157c2016-09-16 13:49:30 +0100100 unsigned length = 0; \
Ben Murdochc5610432016-08-08 18:44:38 +0100101 ctype result = decoder.checked_read_##name(buffer, 0, &length); \
102 EXPECT_EQ(val, result); \
103 EXPECT_EQ(LEBHelper::sizeof_##name(val), static_cast<size_t>(length)); \
104 }
105
106DECLARE_ENCODE_DECODE_CHECKER(int32_t, i32v)
107DECLARE_ENCODE_DECODE_CHECKER(uint32_t, u32v)
108DECLARE_ENCODE_DECODE_CHECKER(int64_t, i64v)
109DECLARE_ENCODE_DECODE_CHECKER(uint64_t, u64v)
110
111TEST_F(LEBHelperTest, WriteAndDecode_u32v) {
112 CheckEncodeDecode_u32v(0);
113 CheckEncodeDecode_u32v(1);
114 CheckEncodeDecode_u32v(5);
115 CheckEncodeDecode_u32v(99);
116 CheckEncodeDecode_u32v(298);
117 CheckEncodeDecode_u32v(87348723);
118 CheckEncodeDecode_u32v(77777);
119
120 for (uint32_t val = 0x3a; val != 0; val = val << 1) {
121 CheckEncodeDecode_u32v(val);
122 }
123}
124
125TEST_F(LEBHelperTest, WriteAndDecode_i32v) {
126 CheckEncodeDecode_i32v(0);
127 CheckEncodeDecode_i32v(1);
128 CheckEncodeDecode_i32v(5);
129 CheckEncodeDecode_i32v(99);
130 CheckEncodeDecode_i32v(298);
131 CheckEncodeDecode_i32v(87348723);
132 CheckEncodeDecode_i32v(77777);
133
134 CheckEncodeDecode_i32v(-2);
135 CheckEncodeDecode_i32v(-4);
136 CheckEncodeDecode_i32v(-59);
137 CheckEncodeDecode_i32v(-288);
138 CheckEncodeDecode_i32v(-12608);
139 CheckEncodeDecode_i32v(-87328723);
140 CheckEncodeDecode_i32v(-77377);
141
142 for (uint32_t val = 0x3a; val != 0; val = val << 1) {
143 CheckEncodeDecode_i32v(bit_cast<int32_t>(val));
144 }
145
146 for (uint32_t val = 0xFFFFFF3B; val != 0; val = val << 1) {
147 CheckEncodeDecode_i32v(bit_cast<int32_t>(val));
148 }
149}
150
151TEST_F(LEBHelperTest, WriteAndDecode_u64v) {
152 CheckEncodeDecode_u64v(0);
153 CheckEncodeDecode_u64v(1);
154 CheckEncodeDecode_u64v(5);
155 CheckEncodeDecode_u64v(99);
156 CheckEncodeDecode_u64v(298);
157 CheckEncodeDecode_u64v(87348723);
158 CheckEncodeDecode_u64v(77777);
159
160 for (uint64_t val = 0x3a; val != 0; val = val << 1) {
161 CheckEncodeDecode_u64v(val);
162 }
163}
164
165TEST_F(LEBHelperTest, WriteAndDecode_i64v) {
166 CheckEncodeDecode_i64v(0);
167 CheckEncodeDecode_i64v(1);
168 CheckEncodeDecode_i64v(5);
169 CheckEncodeDecode_i64v(99);
170 CheckEncodeDecode_i64v(298);
171 CheckEncodeDecode_i64v(87348723);
172 CheckEncodeDecode_i64v(77777);
173
174 CheckEncodeDecode_i64v(-2);
175 CheckEncodeDecode_i64v(-4);
176 CheckEncodeDecode_i64v(-59);
177 CheckEncodeDecode_i64v(-288);
178 CheckEncodeDecode_i64v(-87648723);
179 CheckEncodeDecode_i64v(-77377);
180
181 for (uint64_t val = 0x3a; val != 0; val = val << 1) {
182 CheckEncodeDecode_i64v(bit_cast<int64_t>(val));
183 }
184
185 for (uint64_t val = 0xFFFFFFFFFFFFFF3B; val != 0; val = val << 1) {
186 CheckEncodeDecode_i64v(bit_cast<int64_t>(val));
187 }
188}
189} // namespace wasm
190} // namespace internal
191} // namespace v8