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

Side by Side Diff: test/unittests/wasm/module-decoder-unittest.cc

Issue 2345593003: [wasm] Master CL for Binary 0xC changes. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: [wasm] Master CL for Binary 0xC changes. Created 4 years, 3 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 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 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/handles.h" 7 #include "src/handles.h"
8 #include "src/objects-inl.h" 8 #include "src/objects-inl.h"
9 #include "src/wasm/module-decoder.h" 9 #include "src/wasm/module-decoder.h"
10 #include "src/wasm/wasm-macro-gen.h" 10 #include "src/wasm/wasm-macro-gen.h"
11 #include "src/wasm/wasm-opcodes.h" 11 #include "src/wasm/wasm-opcodes.h"
12 12
13 namespace v8 { 13 namespace v8 {
14 namespace internal { 14 namespace internal {
15 namespace wasm { 15 namespace wasm {
16 16
17 #define EMPTY_FUNCTION(sig_index) 0, SIG_INDEX(sig_index), U16_LE(0) 17 #define WASM_INIT_EXPR_I32V_1(val) WASM_I32V_1(val), kExprEnd
18 #define WASM_INIT_EXPR_I32V_2(val) WASM_I32V_2(val), kExprEnd
19 #define WASM_INIT_EXPR_I32V_3(val) WASM_I32V_3(val), kExprEnd
20 #define WASM_INIT_EXPR_I32V_4(val) WASM_I32V_4(val), kExprEnd
21 #define WASM_INIT_EXPR_I32V_5(val) WASM_I32V_5(val), kExprEnd
22 #define WASM_INIT_EXPR_F32(val) WASM_F32(val), kExprEnd
23 #define WASM_INIT_EXPR_I64(val) WASM_I64(val), kExprEnd
24 #define WASM_INIT_EXPR_F64(val) WASM_F64(val), kExprEnd
25 #define WASM_INIT_EXPR_GLOBAL(index) WASM_GET_GLOBAL(index), kExprEnd
26
18 #define SIZEOF_EMPTY_FUNCTION ((size_t)5) 27 #define SIZEOF_EMPTY_FUNCTION ((size_t)5)
19 #define EMPTY_BODY 0 28 #define EMPTY_BODY 0
20 #define SIZEOF_EMPTY_BODY ((size_t)1) 29 #define SIZEOF_EMPTY_BODY ((size_t)1)
21 #define NOP_BODY 2, 0, kExprNop 30 #define NOP_BODY 2, 0, kExprNop
22 #define SIZEOF_NOP_BODY ((size_t)3) 31 #define SIZEOF_NOP_BODY ((size_t)3)
23 32
24 #define SIG_ENTRY_i_i SIG_ENTRY_x_x(kLocalI32, kLocalI32) 33 #define SIG_ENTRY_i_i SIG_ENTRY_x_x(kLocalI32, kLocalI32)
25 34
26 #define UNKNOWN_EMPTY_SECTION_NAME 1, '\0' 35 #define UNKNOWN_EMPTY_SECTION_NAME 0, 1, '\0'
27 #define UNKNOWN_SECTION_NAME 4, 'l', 'u', 'l', 'z' 36 #define UNKNOWN_SECTION_NAME 0, 4, 'l', 'u', 'l', 'z'
28 37
29 #define SECTION(NAME, EXTRA_SIZE) WASM_SECTION_##NAME, U32V_1(EXTRA_SIZE) 38 #define SECTION(name, size) k##name##SectionCode, U32V_1(size)
30 39
31 #define SIGNATURES_SECTION(count, ...) \ 40 #define SIGNATURES_SECTION(count, ...) \
32 SECTION(SIGNATURES, 1 + 3 * (count)), U32V_1(count), __VA_ARGS__ 41 SECTION(Type, 1 + 3 * (count)), U32V_1(count), __VA_ARGS__
33 #define FUNCTION_SIGNATURES_SECTION(count, ...) \ 42 #define FUNCTION_SIGNATURES_SECTION(count, ...) \
34 SECTION(FUNCTION_SIGNATURES, 1 + (count)), U32V_1(count), __VA_ARGS__ 43 SECTION(Function, 1 + (count)), U32V_1(count), __VA_ARGS__
35 44
36 #define FOO_STRING 3, 'f', 'o', 'o' 45 #define FOO_STRING 3, 'f', 'o', 'o'
37 #define NO_LOCAL_NAMES 0 46 #define NO_LOCAL_NAMES 0
38 47
39 #define EMPTY_SIGNATURES_SECTION SECTION(SIGNATURES, 1), 0 48 #define EMPTY_SIGNATURES_SECTION SECTION(Type, 1), 0
40 #define EMPTY_FUNCTION_SIGNATURES_SECTION SECTION(FUNCTION_SIGNATURES, 1), 0 49 #define EMPTY_FUNCTION_SIGNATURES_SECTION SECTION(Function, 1), 0
41 #define EMPTY_FUNCTION_BODIES_SECTION SECTION(FUNCTION_BODIES, 1), 0 50 #define EMPTY_FUNCTION_BODIES_SECTION SECTION(Code, 1), 0
42 #define EMPTY_NAMES_SECTION SECTION(NAMES, 1), 0 51 #define SECTION_NAMES(size) \
52 kUnknownSectionCode, 4, 'n', 'a', 'm', 'e', U32V_1(size)
53 #define EMPTY_NAMES_SECTION SECTION_NAMES(1), 0
43 54
44 #define X1(...) __VA_ARGS__ 55 #define X1(...) __VA_ARGS__
45 #define X2(...) __VA_ARGS__, __VA_ARGS__ 56 #define X2(...) __VA_ARGS__, __VA_ARGS__
46 #define X3(...) __VA_ARGS__, __VA_ARGS__, __VA_ARGS__ 57 #define X3(...) __VA_ARGS__, __VA_ARGS__, __VA_ARGS__
47 #define X4(...) __VA_ARGS__, __VA_ARGS__, __VA_ARGS__, __VA_ARGS__ 58 #define X4(...) __VA_ARGS__, __VA_ARGS__, __VA_ARGS__, __VA_ARGS__
48 59
49 #define ONE_EMPTY_FUNCTION WASM_SECTION_FUNCTION_SIGNATURES, 1 + 1 * 1, 1, X1(0) 60 #define ONE_EMPTY_FUNCTION SECTION(Function, 1 + 1 * 1), 1, X1(0)
50 61
51 #define TWO_EMPTY_FUNCTIONS \ 62 #define TWO_EMPTY_FUNCTIONS SECTION(Function, 1 + 2 * 1), 2, X2(0)
52 WASM_SECTION_FUNCTION_SIGNATURES, 1 + 2 * 1, 2, X2(0)
53 63
54 #define THREE_EMPTY_FUNCTIONS \ 64 #define THREE_EMPTY_FUNCTIONS SECTION(Function, 1 + 3 * 1), 3, X3(0)
55 WASM_SECTION_FUNCTION_SIGNATURES, 1 + 3 * 1, 3, X3(0)
56 65
57 #define FOUR_EMPTY_FUNCTIONS \ 66 #define FOUR_EMPTY_FUNCTIONS SECTION(Function, 1 + 4 * 1), 4, X4(0)
58 WASM_SECTION_FUNCTION_SIGNATURES, 1 + 4 * 1, 4, X4(0)
59 67
60 #define ONE_EMPTY_BODY \ 68 #define ONE_EMPTY_BODY \
61 WASM_SECTION_FUNCTION_BODIES, 1 + 1 * (1 + SIZEOF_EMPTY_BODY), 1, \ 69 SECTION(Code, 1 + 1 * (1 + SIZEOF_EMPTY_BODY)) \
62 X1(SIZEOF_EMPTY_BODY, EMPTY_BODY) 70 , 1, X1(SIZEOF_EMPTY_BODY, EMPTY_BODY)
63 71
64 #define TWO_EMPTY_BODIES \ 72 #define TWO_EMPTY_BODIES \
65 WASM_SECTION_FUNCTION_BODIES, 1 + 2 * (1 + SIZEOF_EMPTY_BODY), 2, \ 73 SECTION(Code, 1 + 2 * (1 + SIZEOF_EMPTY_BODY)) \
66 X2(SIZEOF_EMPTY_BODY, EMPTY_BODY) 74 , 2, X2(SIZEOF_EMPTY_BODY, EMPTY_BODY)
67 75
68 #define THREE_EMPTY_BODIES \ 76 #define THREE_EMPTY_BODIES \
69 WASM_SECTION_FUNCTION_BODIES, 1 + 3 * (1 + SIZEOF_EMPTY_BODY), 3, \ 77 SECTION(Code, 1 + 3 * (1 + SIZEOF_EMPTY_BODY)) \
70 X3(SIZEOF_EMPTY_BODY, EMPTY_BODY) 78 , 3, X3(SIZEOF_EMPTY_BODY, EMPTY_BODY)
71 79
72 #define FOUR_EMPTY_BODIES \ 80 #define FOUR_EMPTY_BODIES \
73 WASM_SECTION_FUNCTION_BODIES, 1 + 4 * (1 + SIZEOF_EMPTY_BODY), 4, \ 81 SECTION(Code, 1 + 4 * (1 + SIZEOF_EMPTY_BODY)) \
74 X4(SIZEOF_EMPTY_BODY, EMPTY_BODY) 82 , 4, X4(SIZEOF_EMPTY_BODY, EMPTY_BODY)
75 83
76 #define SIGNATURES_SECTION_VOID_VOID \ 84 #define SIGNATURES_SECTION_VOID_VOID \
77 SECTION(SIGNATURES, 1 + SIZEOF_SIG_ENTRY_v_v), 1, SIG_ENTRY_v_v 85 SECTION(Type, 1 + SIZEOF_SIG_ENTRY_v_v), 1, SIG_ENTRY_v_v
78 86
79 #define EXPECT_VERIFIES(data) \ 87 #define LINEAR_MEMORY_INDEX_0 0
80 do { \ 88
81 ModuleResult result = DecodeModule(data, data + arraysize(data)); \ 89 #define EXPECT_VERIFIES(data) \
82 EXPECT_TRUE(result.ok()); \ 90 do { \
83 if (result.val) delete result.val; \ 91 ModuleResult result = DecodeModule(data, data + sizeof(data)); \
92 EXPECT_TRUE(result.ok()); \
93 if (result.val) delete result.val; \
84 } while (false) 94 } while (false)
85 95
86 #define EXPECT_FAILURE_LEN(data, length) \ 96 #define EXPECT_FAILURE_LEN(data, length) \
87 do { \ 97 do { \
88 ModuleResult result = DecodeModule(data, data + length); \ 98 ModuleResult result = DecodeModule(data, data + length); \
89 EXPECT_FALSE(result.ok()); \ 99 EXPECT_FALSE(result.ok()); \
90 if (result.val) delete result.val; \ 100 if (result.val) delete result.val; \
91 } while (false) 101 } while (false)
92 102
93 #define EXPECT_FAILURE(data) EXPECT_FAILURE_LEN(data, sizeof(data)) 103 #define EXPECT_FAILURE(data) EXPECT_FAILURE_LEN(data, sizeof(data))
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
142 } 152 }
143 ModuleResult DecodeModuleNoHeader(const byte* module_start, 153 ModuleResult DecodeModuleNoHeader(const byte* module_start,
144 const byte* module_end) { 154 const byte* module_end) {
145 return DecodeWasmModule(isolate(), zone(), module_start, module_end, false, 155 return DecodeWasmModule(isolate(), zone(), module_start, module_end, false,
146 kWasmOrigin); 156 kWasmOrigin);
147 } 157 }
148 }; 158 };
149 159
150 TEST_F(WasmModuleVerifyTest, WrongMagic) { 160 TEST_F(WasmModuleVerifyTest, WrongMagic) {
151 for (uint32_t x = 1; x; x <<= 1) { 161 for (uint32_t x = 1; x; x <<= 1) {
152 const byte data[] = {U32_LE(kWasmMagic ^ x), U32_LE(kWasmVersion), 162 const byte data[] = {U32_LE(kWasmMagic ^ x), U32_LE(kWasmVersion)};
153 SECTION(END, 0)};
154 ModuleResult result = DecodeModuleNoHeader(data, data + sizeof(data)); 163 ModuleResult result = DecodeModuleNoHeader(data, data + sizeof(data));
155 EXPECT_FALSE(result.ok()); 164 EXPECT_FALSE(result.ok());
156 if (result.val) delete result.val; 165 if (result.val) delete result.val;
157 } 166 }
158 } 167 }
159 168
160 TEST_F(WasmModuleVerifyTest, WrongVersion) { 169 TEST_F(WasmModuleVerifyTest, WrongVersion) {
161 for (uint32_t x = 1; x; x <<= 1) { 170 for (uint32_t x = 1; x; x <<= 1) {
162 const byte data[] = {U32_LE(kWasmMagic), U32_LE(kWasmVersion ^ x), 171 const byte data[] = {U32_LE(kWasmMagic), U32_LE(kWasmVersion ^ x)};
163 SECTION(END, 0)};
164 ModuleResult result = DecodeModuleNoHeader(data, data + sizeof(data)); 172 ModuleResult result = DecodeModuleNoHeader(data, data + sizeof(data));
165 EXPECT_FALSE(result.ok()); 173 EXPECT_FALSE(result.ok());
166 if (result.val) delete result.val; 174 if (result.val) delete result.val;
167 } 175 }
168 } 176 }
169 177
170 TEST_F(WasmModuleVerifyTest, DecodeEmpty) { 178 TEST_F(WasmModuleVerifyTest, DecodeEmpty) {
171 static const byte data[] = {SECTION(END, 0)}; 179 ModuleResult result = DecodeModule(nullptr, 0);
172 EXPECT_VERIFIES(data); 180 EXPECT_TRUE(result.ok());
181 if (result.val) delete result.val;
173 } 182 }
174 183
175 TEST_F(WasmModuleVerifyTest, OneGlobal) { 184 TEST_F(WasmModuleVerifyTest, OneGlobal) {
176 static const byte data[] = { 185 static const byte data[] = {
177 SECTION(GLOBALS, 5), // -- 186 SECTION(Global, 6), // --
178 1, 187 1,
179 NAME_LENGTH(1), 188 kLocalI32, // local type
180 'g', // name 189 0, // immutable
181 kLocalI32, // local type 190 WASM_INIT_EXPR_I32V_1(13) // init
182 0, // exported
183 }; 191 };
184 192
185 { 193 {
186 // Should decode to exactly one global. 194 // Should decode to exactly one global.
187 ModuleResult result = DecodeModule(data, data + arraysize(data)); 195 ModuleResult result = DecodeModule(data, data + sizeof(data));
188 EXPECT_OK(result); 196 EXPECT_OK(result);
189 EXPECT_EQ(1, result.val->globals.size()); 197 EXPECT_EQ(1, result.val->globals.size());
190 EXPECT_EQ(0, result.val->functions.size()); 198 EXPECT_EQ(0, result.val->functions.size());
191 EXPECT_EQ(0, result.val->data_segments.size()); 199 EXPECT_EQ(0, result.val->data_segments.size());
192 200
193 const WasmGlobal* global = &result.val->globals.back(); 201 const WasmGlobal* global = &result.val->globals.back();
194 202
195 EXPECT_EQ(1, global->name_length);
196 EXPECT_EQ(kAstI32, global->type); 203 EXPECT_EQ(kAstI32, global->type);
197 EXPECT_EQ(0, global->offset); 204 EXPECT_EQ(0, global->offset);
198 EXPECT_FALSE(global->exported); 205 EXPECT_EQ(false, global->mutability);
206 EXPECT_EQ(WasmInitExpr::kI32Const, global->init.kind);
207 EXPECT_EQ(13, global->init.val.i32_const);
199 208
200 if (result.val) delete result.val; 209 if (result.val) delete result.val;
201 } 210 }
202 211
203 EXPECT_OFF_END_FAILURE(data, 1, sizeof(data)); 212 EXPECT_OFF_END_FAILURE(data, 1, sizeof(data));
204 } 213 }
205 214
206 TEST_F(WasmModuleVerifyTest, Global_invalid_type) { 215 TEST_F(WasmModuleVerifyTest, Global_invalid_type) {
207 static const byte data[] = { 216 static const byte data[] = {
208 SECTION(GLOBALS, 5), // -- 217 SECTION(Global, 6), // --
209 1, 218 1,
210 NAME_LENGTH(1), 219 64, // invalid memory type
211 'g', // name 220 1, // mutable
212 64, // invalid memory type 221 WASM_INIT_EXPR_I32V_1(33), // init
213 0, // exported
214 }; 222 };
215 223
216 ModuleResult result = DecodeModule(data, data + sizeof(data)); 224 ModuleResult result = DecodeModule(data, data + sizeof(data));
217 EXPECT_FALSE(result.ok()); 225 EXPECT_FALSE(result.ok());
218 if (result.val) delete result.val; 226 if (result.val) delete result.val;
219 } 227 }
220 228
221 TEST_F(WasmModuleVerifyTest, Global_invalid_type2) { 229 TEST_F(WasmModuleVerifyTest, Global_invalid_type2) {
222 static const byte data[] = { 230 static const byte data[] = {
223 SECTION(GLOBALS, 5), // -- 231 SECTION(Global, 6), // --
224 1, 232 1,
225 NAME_LENGTH(1), 233 kLocalVoid, // invalid memory type
226 'g', // name 234 1, // mutable
227 kLocalVoid, // invalid memory type 235 WASM_INIT_EXPR_I32V_1(33), // init
228 0, // exported
229 }; 236 };
230 237
231 ModuleResult result = DecodeModule(data, data + sizeof(data)); 238 ModuleResult result = DecodeModule(data, data + sizeof(data));
232 EXPECT_FALSE(result.ok()); 239 EXPECT_FALSE(result.ok());
233 if (result.val) delete result.val; 240 if (result.val) delete result.val;
234 } 241 }
235 242
236 TEST_F(WasmModuleVerifyTest, ZeroGlobals) { 243 TEST_F(WasmModuleVerifyTest, ZeroGlobals) {
237 static const byte data[] = { 244 static const byte data[] = {
238 SECTION(GLOBALS, 1), // -- 245 SECTION(Global, 1), // --
239 0, // declare 0 globals 246 0, // declare 0 globals
240 }; 247 };
241 ModuleResult result = DecodeModule(data, data + arraysize(data)); 248 ModuleResult result = DecodeModule(data, data + sizeof(data));
242 EXPECT_OK(result); 249 EXPECT_OK(result);
243 if (result.val) delete result.val; 250 if (result.val) delete result.val;
244 } 251 }
245 252
246 static void AppendUint32v(std::vector<byte>& buffer, uint32_t val) { 253 static void AppendUint32v(std::vector<byte>& buffer, uint32_t val) {
247 while (true) { 254 while (true) {
248 uint32_t next = val >> 7; 255 uint32_t next = val >> 7;
249 uint32_t out = val & 0x7f; 256 uint32_t out = val & 0x7f;
250 if (next) { 257 if (next) {
251 buffer.push_back(static_cast<byte>(0x80 | out)); 258 buffer.push_back(static_cast<byte>(0x80 | out));
252 val = next; 259 val = next;
253 } else { 260 } else {
254 buffer.push_back(static_cast<byte>(out)); 261 buffer.push_back(static_cast<byte>(out));
255 break; 262 break;
256 } 263 }
257 } 264 }
258 } 265 }
259 266
260 TEST_F(WasmModuleVerifyTest, NGlobals) { 267 TEST_F(WasmModuleVerifyTest, NGlobals) {
261 static const byte data[] = { 268 static const byte data[] = {
262 NO_NAME, // name length 269 kLocalF32, // memory type
263 kLocalF32, // memory type 270 0, // immutable
264 0, // exported 271 WASM_INIT_EXPR_F32(7.7), // init
265 }; 272 };
266 273
267 for (uint32_t i = 0; i < 1000000; i = i * 13 + 1) { 274 for (uint32_t i = 0; i < 1000000; i = i * 13 + 1) {
268 std::vector<byte> buffer; 275 std::vector<byte> buffer;
269 size_t size = SizeOfVarInt(i) + i * sizeof(data); 276 size_t size = SizeOfVarInt(i) + i * sizeof(data);
270 const byte globals[] = {WASM_SECTION_GLOBALS, U32V_5(size)}; 277 const byte globals[] = {kGlobalSectionCode, U32V_5(size)};
271 for (size_t g = 0; g != sizeof(globals); ++g) { 278 for (size_t g = 0; g != sizeof(globals); ++g) {
272 buffer.push_back(globals[g]); 279 buffer.push_back(globals[g]);
273 } 280 }
274 AppendUint32v(buffer, i); // Number of globals. 281 AppendUint32v(buffer, i); // Number of globals.
275 for (uint32_t j = 0; j < i; j++) { 282 for (uint32_t j = 0; j < i; j++) {
276 buffer.insert(buffer.end(), data, data + sizeof(data)); 283 buffer.insert(buffer.end(), data, data + sizeof(data));
277 } 284 }
278 285
279 ModuleResult result = DecodeModule(&buffer[0], &buffer[0] + buffer.size()); 286 ModuleResult result = DecodeModule(&buffer[0], &buffer[0] + buffer.size());
280 EXPECT_OK(result); 287 EXPECT_OK(result);
281 if (result.val) delete result.val; 288 if (result.val) delete result.val;
282 } 289 }
283 } 290 }
284 291
285 TEST_F(WasmModuleVerifyTest, GlobalWithInvalidNameOffset) {
286 static const byte data[] = {
287 SECTION(GLOBALS, 7),
288 1, // declare one global
289 NO_NAME, // name offset
290 33, // memory type
291 0, // exported
292 };
293
294 EXPECT_FAILURE(data);
295 }
296
297 TEST_F(WasmModuleVerifyTest, GlobalWithInvalidNameLength) {
298 static const byte data[] = {
299 SECTION(GLOBALS, 5), // --
300 1,
301 NAME_LENGTH(56), // invalid length
302 'g', // name
303 kLocalI32, // memory type
304 0, // exported
305 };
306 EXPECT_FAILURE(data);
307 }
308
309 TEST_F(WasmModuleVerifyTest, GlobalWithInvalidMemoryType) { 292 TEST_F(WasmModuleVerifyTest, GlobalWithInvalidMemoryType) {
310 static const byte data[] = { 293 static const byte data[] = {SECTION(Global, 7),
311 SECTION(GLOBALS, 7), 294 33, // memory type
312 1, // declare one global 295 0, // exported
313 NO_NAME, // name offset 296 WASM_INIT_EXPR_I32V_1(1)};
314 33, // memory type
315 0, // exported
316 };
317 297
318 EXPECT_FAILURE(data); 298 EXPECT_FAILURE(data);
319 } 299 }
320 300
321 TEST_F(WasmModuleVerifyTest, TwoGlobals) { 301 TEST_F(WasmModuleVerifyTest, TwoGlobals) {
322 static const byte data[] = { 302 static const byte data[] = {
323 SECTION(GLOBALS, 7), 303 SECTION(Global, 21),
324 2, 304 2,
325 NO_NAME, // #0: name length
326 kLocalF32, // type 305 kLocalF32, // type
327 0, // exported 306 0, // immutable
328 NO_NAME, // #1: name length 307 WASM_INIT_EXPR_F32(22.0),
329 kLocalF64, // type 308 kLocalF64, // type
330 1, // exported 309 1, // mutable
310 WASM_INIT_EXPR_F64(23.0),
331 }; 311 };
332 312
333 { 313 {
334 // Should decode to exactly two globals. 314 // Should decode to exactly two globals.
335 ModuleResult result = DecodeModule(data, data + arraysize(data)); 315 ModuleResult result = DecodeModule(data, data + sizeof(data));
336 EXPECT_OK(result); 316 EXPECT_OK(result);
337 EXPECT_EQ(2, result.val->globals.size()); 317 EXPECT_EQ(2, result.val->globals.size());
338 EXPECT_EQ(0, result.val->functions.size()); 318 EXPECT_EQ(0, result.val->functions.size());
339 EXPECT_EQ(0, result.val->data_segments.size()); 319 EXPECT_EQ(0, result.val->data_segments.size());
340 320
341 const WasmGlobal* g0 = &result.val->globals[0]; 321 const WasmGlobal* g0 = &result.val->globals[0];
322
323 EXPECT_EQ(kAstF32, g0->type);
324 EXPECT_EQ(0, g0->offset);
325 EXPECT_EQ(false, g0->mutability);
326 EXPECT_EQ(WasmInitExpr::kF32Const, g0->init.kind);
327
342 const WasmGlobal* g1 = &result.val->globals[1]; 328 const WasmGlobal* g1 = &result.val->globals[1];
343 329
344 EXPECT_EQ(0, g0->name_length);
345 EXPECT_EQ(kAstF32, g0->type);
346 EXPECT_EQ(0, g0->offset);
347 EXPECT_FALSE(g0->exported);
348
349 EXPECT_EQ(0, g1->name_length);
350 EXPECT_EQ(kAstF64, g1->type); 330 EXPECT_EQ(kAstF64, g1->type);
351 EXPECT_EQ(8, g1->offset); 331 EXPECT_EQ(8, g1->offset);
352 EXPECT_TRUE(g1->exported); 332 EXPECT_EQ(true, g1->mutability);
333 EXPECT_EQ(WasmInitExpr::kF64Const, g1->init.kind);
353 334
354 if (result.val) delete result.val; 335 if (result.val) delete result.val;
355 } 336 }
356 337
357 EXPECT_OFF_END_FAILURE(data, 1, sizeof(data)); 338 EXPECT_OFF_END_FAILURE(data, 1, sizeof(data));
358 } 339 }
359 340
360 TEST_F(WasmModuleVerifyTest, OneSignature) { 341 TEST_F(WasmModuleVerifyTest, OneSignature) {
361 { 342 {
362 static const byte data[] = {SIGNATURES_SECTION_VOID_VOID}; 343 static const byte data[] = {SIGNATURES_SECTION_VOID_VOID};
363 EXPECT_VERIFIES(data); 344 EXPECT_VERIFIES(data);
364 } 345 }
365 346
366 { 347 {
367 static const byte data[] = {SECTION(SIGNATURES, 1 + SIZEOF_SIG_ENTRY_x_x), 348 static const byte data[] = {SECTION(Type, 1 + SIZEOF_SIG_ENTRY_x_x), 1,
368 1, SIG_ENTRY_i_i}; 349 SIG_ENTRY_i_i};
369 EXPECT_VERIFIES(data); 350 EXPECT_VERIFIES(data);
370 } 351 }
371 } 352 }
372 353
373 TEST_F(WasmModuleVerifyTest, MultipleSignatures) { 354 TEST_F(WasmModuleVerifyTest, MultipleSignatures) {
374 static const byte data[] = { 355 static const byte data[] = {
375 SECTION(SIGNATURES, 1 + SIZEOF_SIG_ENTRY_v_v + SIZEOF_SIG_ENTRY_x_x + 356 SECTION(Type, 1 + SIZEOF_SIG_ENTRY_v_v + SIZEOF_SIG_ENTRY_x_x +
376 SIZEOF_SIG_ENTRY_x_xx), // -- 357 SIZEOF_SIG_ENTRY_x_xx), // --
377 3, // -- 358 3, // --
378 SIG_ENTRY_v_v, // void -> void 359 SIG_ENTRY_v_v, // void -> void
379 SIG_ENTRY_x_x(kLocalI32, kLocalF32), // f32 -> i32 360 SIG_ENTRY_x_x(kLocalI32, kLocalF32), // f32 -> i32
380 SIG_ENTRY_x_xx(kLocalI32, kLocalF64, kLocalF64), // f64,f64 -> i32 361 SIG_ENTRY_x_xx(kLocalI32, kLocalF64, kLocalF64), // f64,f64 -> i32
381 }; 362 };
382 363
383 ModuleResult result = DecodeModule(data, data + arraysize(data)); 364 ModuleResult result = DecodeModule(data, data + sizeof(data));
384 EXPECT_OK(result); 365 EXPECT_OK(result);
385 EXPECT_EQ(3, result.val->signatures.size()); 366 EXPECT_EQ(3, result.val->signatures.size());
386 if (result.val->signatures.size() == 3) { 367 if (result.val->signatures.size() == 3) {
387 EXPECT_EQ(0, result.val->signatures[0]->return_count()); 368 EXPECT_EQ(0, result.val->signatures[0]->return_count());
388 EXPECT_EQ(1, result.val->signatures[1]->return_count()); 369 EXPECT_EQ(1, result.val->signatures[1]->return_count());
389 EXPECT_EQ(1, result.val->signatures[2]->return_count()); 370 EXPECT_EQ(1, result.val->signatures[2]->return_count());
390 371
391 EXPECT_EQ(0, result.val->signatures[0]->parameter_count()); 372 EXPECT_EQ(0, result.val->signatures[0]->parameter_count());
392 EXPECT_EQ(1, result.val->signatures[1]->parameter_count()); 373 EXPECT_EQ(1, result.val->signatures[1]->parameter_count());
393 EXPECT_EQ(2, result.val->signatures[2]->parameter_count()); 374 EXPECT_EQ(2, result.val->signatures[2]->parameter_count());
394 } 375 }
395 if (result.val) delete result.val; 376 if (result.val) delete result.val;
396 377
397 EXPECT_OFF_END_FAILURE(data, 1, sizeof(data)); 378 EXPECT_OFF_END_FAILURE(data, 1, sizeof(data));
398 } 379 }
399 380
400 TEST_F(WasmModuleVerifyTest, OneDataSegment) { 381 TEST_F(WasmModuleVerifyTest, OneDataSegment) {
401 const byte kDataSegmentSourceOffset = 30; 382 const byte kDataSegmentSourceOffset = 24;
402 const byte data[] = { 383 const byte data[] = {
403 SECTION(MEMORY, 3), 384 SECTION(Memory, 4),
385 ENTRY_COUNT(1),
386 kResizableMaximumFlag,
404 28, 387 28,
405 28, 388 28,
406 1, 389 SECTION(Data, 11),
407 SECTION(DATA_SEGMENTS, 8), 390 ENTRY_COUNT(1),
408 1, 391 LINEAR_MEMORY_INDEX_0,
409 U32V_3(0x9bbaa), // dest addr 392 WASM_INIT_EXPR_I32V_3(0x9bbaa), // dest addr
410 U32V_1(3), // source size 393 U32V_1(3), // source size
411 'a', 394 'a',
412 'b', 395 'b',
413 'c' // data bytes 396 'c' // data bytes
414 }; 397 };
415 398
416 { 399 {
417 EXPECT_VERIFIES(data); 400 EXPECT_VERIFIES(data);
418 ModuleResult result = DecodeModule(data, data + arraysize(data)); 401 ModuleResult result = DecodeModule(data, data + sizeof(data));
419 EXPECT_OK(result); 402 EXPECT_OK(result);
420 EXPECT_EQ(0, result.val->globals.size()); 403 EXPECT_EQ(0, result.val->globals.size());
421 EXPECT_EQ(0, result.val->functions.size()); 404 EXPECT_EQ(0, result.val->functions.size());
422 EXPECT_EQ(1, result.val->data_segments.size()); 405 EXPECT_EQ(1, result.val->data_segments.size());
423 406
424 const WasmDataSegment* segment = &result.val->data_segments.back(); 407 const WasmDataSegment* segment = &result.val->data_segments.back();
425 408
426 EXPECT_EQ(0x9bbaa, segment->dest_addr); 409 EXPECT_EQ(WasmInitExpr::kI32Const, segment->dest_addr.kind);
410 EXPECT_EQ(0x9bbaa, segment->dest_addr.val.i32_const);
427 EXPECT_EQ(kDataSegmentSourceOffset, segment->source_offset); 411 EXPECT_EQ(kDataSegmentSourceOffset, segment->source_offset);
428 EXPECT_EQ(3, segment->source_size); 412 EXPECT_EQ(3, segment->source_size);
429 EXPECT_TRUE(segment->init);
430 413
431 if (result.val) delete result.val; 414 if (result.val) delete result.val;
432 } 415 }
433 416
434 EXPECT_OFF_END_FAILURE(data, 13, sizeof(data)); 417 EXPECT_OFF_END_FAILURE(data, 14, sizeof(data));
435 } 418 }
436 419
437 TEST_F(WasmModuleVerifyTest, TwoDataSegments) { 420 TEST_F(WasmModuleVerifyTest, TwoDataSegments) {
438 const byte kDataSegment0SourceOffset = 30; 421 const byte kDataSegment0SourceOffset = 24;
439 const byte kDataSegment1SourceOffset = 30 + 8; 422 const byte kDataSegment1SourceOffset = kDataSegment0SourceOffset + 11;
440 423
441 const byte data[] = { 424 const byte data[] = {
442 SECTION(MEMORY, 3), 425 SECTION(Memory, 4),
426 ENTRY_COUNT(1),
427 kResizableMaximumFlag,
443 28, 428 28,
444 28, 429 28,
445 1, 430 SECTION(Data, 29),
446 SECTION(DATA_SEGMENTS, 23), 431 ENTRY_COUNT(2), // segment count
447 2, // segment count 432 LINEAR_MEMORY_INDEX_0,
448 U32V_3(0x7ffee), // #0: dest addr 433 WASM_INIT_EXPR_I32V_3(0x7ffee), // #0: dest addr
449 U32V_1(4), // source size 434 U32V_1(4), // source size
450 1, 435 1,
451 2, 436 2,
452 3, 437 3,
453 4, // data bytes 438 4, // data bytes
454 U32V_3(0x6ddcc), // #1: dest addr 439 LINEAR_MEMORY_INDEX_0,
455 U32V_1(10), // source size 440 WASM_INIT_EXPR_I32V_3(0x6ddcc), // #1: dest addr
441 U32V_1(10), // source size
456 1, 442 1,
457 2, 443 2,
458 3, 444 3,
459 4, 445 4,
460 5, 446 5,
461 6, 447 6,
462 7, 448 7,
463 8, 449 8,
464 9, 450 9,
465 10 // data bytes 451 10 // data bytes
466 }; 452 };
467 453
468 { 454 {
469 ModuleResult result = DecodeModule(data, data + arraysize(data)); 455 ModuleResult result = DecodeModule(data, data + sizeof(data));
470 EXPECT_OK(result); 456 EXPECT_OK(result);
471 EXPECT_EQ(0, result.val->globals.size()); 457 EXPECT_EQ(0, result.val->globals.size());
472 EXPECT_EQ(0, result.val->functions.size()); 458 EXPECT_EQ(0, result.val->functions.size());
473 EXPECT_EQ(2, result.val->data_segments.size()); 459 EXPECT_EQ(2, result.val->data_segments.size());
474 460
475 const WasmDataSegment* s0 = &result.val->data_segments[0]; 461 const WasmDataSegment* s0 = &result.val->data_segments[0];
476 const WasmDataSegment* s1 = &result.val->data_segments[1]; 462 const WasmDataSegment* s1 = &result.val->data_segments[1];
477 463
478 EXPECT_EQ(0x7ffee, s0->dest_addr); 464 EXPECT_EQ(WasmInitExpr::kI32Const, s0->dest_addr.kind);
465 EXPECT_EQ(0x7ffee, s0->dest_addr.val.i32_const);
479 EXPECT_EQ(kDataSegment0SourceOffset, s0->source_offset); 466 EXPECT_EQ(kDataSegment0SourceOffset, s0->source_offset);
480 EXPECT_EQ(4, s0->source_size); 467 EXPECT_EQ(4, s0->source_size);
481 EXPECT_TRUE(s0->init);
482 468
483 EXPECT_EQ(0x6ddcc, s1->dest_addr); 469 EXPECT_EQ(WasmInitExpr::kI32Const, s1->dest_addr.kind);
470 EXPECT_EQ(0x6ddcc, s1->dest_addr.val.i32_const);
484 EXPECT_EQ(kDataSegment1SourceOffset, s1->source_offset); 471 EXPECT_EQ(kDataSegment1SourceOffset, s1->source_offset);
485 EXPECT_EQ(10, s1->source_size); 472 EXPECT_EQ(10, s1->source_size);
486 EXPECT_TRUE(s1->init);
487 473
488 if (result.val) delete result.val; 474 if (result.val) delete result.val;
489 } 475 }
490 476
491 EXPECT_OFF_END_FAILURE(data, 13, sizeof(data)); 477 EXPECT_OFF_END_FAILURE(data, 14, sizeof(data));
492 } 478 }
493 479
494 TEST_F(WasmModuleVerifyTest, DataSegmentWithInvalidDest) { 480 TEST_F(WasmModuleVerifyTest, DataSegment_wrong_init_type) {
495 const int source_size = 3; 481 const byte data[] = {
482 SECTION(Memory, 4),
483 ENTRY_COUNT(1),
484 kResizableMaximumFlag,
485 28,
486 28,
487 SECTION(Data, 11),
488 ENTRY_COUNT(1),
489 LINEAR_MEMORY_INDEX_0,
490 WASM_INIT_EXPR_F64(9.9), // dest addr
491 U32V_1(3), // source size
492 'a',
493 'b',
494 'c' // data bytes
495 };
496 496
497 for (byte mem_pages = 1; mem_pages < 16; mem_pages++) { 497 EXPECT_FAILURE(data);
498 int mem_size = mem_pages * 0x10000; // 64k pages.
499
500 for (int dest_addr = mem_size - source_size;
501 dest_addr < mem_size + source_size; dest_addr++) {
502 byte data[] = {SECTION(MEMORY, 3),
503 mem_pages,
504 mem_pages,
505 1,
506 SECTION(DATA_SEGMENTS, 8),
507 1,
508 U32V_3(dest_addr),
509 U32V_1(source_size),
510 'a',
511 'b',
512 'c'};
513
514 if (dest_addr <= (mem_size - source_size)) {
515 EXPECT_VERIFIES(data);
516 } else {
517 EXPECT_FAILURE(data);
518 }
519 }
520 }
521 } 498 }
522 499
523 TEST_F(WasmModuleVerifyTest, OneIndirectFunction) { 500 TEST_F(WasmModuleVerifyTest, OneIndirectFunction) {
524 static const byte data[] = { 501 static const byte data[] = {
525 // sig#0 ------------------------------------------------------- 502 // sig#0 ---------------------------------------------------------------
526 SIGNATURES_SECTION_VOID_VOID, 503 SIGNATURES_SECTION_VOID_VOID,
527 // funcs ------------------------------------------------------ 504 // funcs ---------------------------------------------------------------
528 ONE_EMPTY_FUNCTION, 505 ONE_EMPTY_FUNCTION,
529 // indirect table ---------------------------------------------- 506 // table declaration ---------------------------------------------------
530 SECTION(FUNCTION_TABLE, 2), 1, U32V_1(0)}; 507 SECTION(Table, 4), ENTRY_COUNT(1), kWasmAnyFunctionTypeForm, 0, 1};
531 508
532 ModuleResult result = DecodeModule(data, data + arraysize(data)); 509 ModuleResult result = DecodeModule(data, data + sizeof(data));
533 EXPECT_OK(result); 510 EXPECT_OK(result);
534 if (result.ok()) { 511 if (result.ok()) {
535 EXPECT_EQ(1, result.val->signatures.size()); 512 EXPECT_EQ(1, result.val->signatures.size());
513 EXPECT_EQ(1, result.val->functions.size());
514 EXPECT_EQ(1, result.val->function_tables.size());
515 EXPECT_EQ(1, result.val->function_tables[0].values.size());
516 EXPECT_EQ(-1, result.val->function_tables[0].values[0]);
517 }
518 if (result.val) delete result.val;
519 }
520
521 TEST_F(WasmModuleVerifyTest, OneIndirectFunction_one_entry) {
522 static const byte data[] = {
523 // sig#0 ---------------------------------------------------------------
524 SIGNATURES_SECTION_VOID_VOID,
525 // funcs ---------------------------------------------------------------
526 ONE_EMPTY_FUNCTION,
527 // table declaration ---------------------------------------------------
528 SECTION(Table, 4), ENTRY_COUNT(1), kWasmAnyFunctionTypeForm, 0, 1,
529 // elements ------------------------------------------------------------
530 SECTION(Element, 7),
531 1, // entry count
532 TABLE_INDEX(0), WASM_INIT_EXPR_I32V_1(0),
533 1, // elements count
534 FUNC_INDEX(0)};
535
536 ModuleResult result = DecodeModule(data, data + sizeof(data));
537 EXPECT_OK(result);
538 if (result.ok()) {
539 EXPECT_EQ(1, result.val->signatures.size());
536 EXPECT_EQ(1, result.val->functions.size()); 540 EXPECT_EQ(1, result.val->functions.size());
537 EXPECT_EQ(1, result.val->function_tables.size()); 541 EXPECT_EQ(1, result.val->function_tables.size());
538 EXPECT_EQ(1, result.val->function_tables[0].values.size()); 542 EXPECT_EQ(1, result.val->function_tables[0].values.size());
539 EXPECT_EQ(0, result.val->function_tables[0].values[0]); 543 EXPECT_EQ(0, result.val->function_tables[0].values[0]);
540 } 544 }
541 if (result.val) delete result.val; 545 if (result.val) delete result.val;
542 } 546 }
543 547
544 TEST_F(WasmModuleVerifyTest, MultipleIndirectFunctions) { 548 TEST_F(WasmModuleVerifyTest, MultipleIndirectFunctions) {
545 static const byte data[] = { 549 static const byte data[] = {
546 // sig#0 ------------------------------------------------------- 550 // sig#0 -------------------------------------------------------
547 SECTION(SIGNATURES, 1 + SIZEOF_SIG_ENTRY_v_v + SIZEOF_SIG_ENTRY_v_x), 551 SECTION(Type, 1 + SIZEOF_SIG_ENTRY_v_v + SIZEOF_SIG_ENTRY_v_x),
548 2, // -- 552 2, // --
549 SIG_ENTRY_v_v, // void -> void 553 SIG_ENTRY_v_v, // void -> void
550 SIG_ENTRY_v_x(kLocalI32), // void -> i32 554 SIG_ENTRY_v_x(kLocalI32), // void -> i32
551 // funcs ------------------------------------------------------ 555 // funcs ------------------------------------------------------
552 FOUR_EMPTY_FUNCTIONS, 556 FOUR_EMPTY_FUNCTIONS,
553 // indirect table ---------------------------------------------- 557 // table declaration -------------------------------------------
554 SECTION(FUNCTION_TABLE, 9), 8, 558 SECTION(Table, 4), ENTRY_COUNT(1), kWasmAnyFunctionTypeForm, 0, 8,
555 U32V_1(0), // -- 559 // table elements ----------------------------------------------
556 U32V_1(1), // -- 560 SECTION(Element, 14),
557 U32V_1(2), // -- 561 1, // entry count
558 U32V_1(3), // -- 562 TABLE_INDEX(0), WASM_INIT_EXPR_I32V_1(0),
559 U32V_1(0), // -- 563 8, // elements count
560 U32V_1(1), // -- 564 FUNC_INDEX(0), // --
561 U32V_1(2), // -- 565 FUNC_INDEX(1), // --
562 U32V_1(3), // -- 566 FUNC_INDEX(2), // --
567 FUNC_INDEX(3), // --
568 FUNC_INDEX(0), // --
569 FUNC_INDEX(1), // --
570 FUNC_INDEX(2), // --
571 FUNC_INDEX(3), // --
563 FOUR_EMPTY_BODIES}; 572 FOUR_EMPTY_BODIES};
564 573
565 ModuleResult result = DecodeModule(data, data + arraysize(data)); 574 ModuleResult result = DecodeModule(data, data + sizeof(data));
566 EXPECT_OK(result); 575 EXPECT_OK(result);
567 if (result.ok()) { 576 if (result.ok()) {
568 EXPECT_EQ(2, result.val->signatures.size()); 577 EXPECT_EQ(2, result.val->signatures.size());
569 EXPECT_EQ(4, result.val->functions.size()); 578 EXPECT_EQ(4, result.val->functions.size());
570 EXPECT_EQ(1, result.val->function_tables.size()); 579 EXPECT_EQ(1, result.val->function_tables.size());
571 EXPECT_EQ(8, result.val->function_tables[0].values.size()); 580 EXPECT_EQ(8, result.val->function_tables[0].values.size());
572 for (int i = 0; i < 8; i++) { 581 for (int i = 0; i < 8; i++) {
573 EXPECT_EQ(i & 3, result.val->function_tables[0].values[i]); 582 EXPECT_EQ(i & 3, result.val->function_tables[0].values[i]);
574 } 583 }
575 } 584 }
576 if (result.val) delete result.val; 585 if (result.val) delete result.val;
577 } 586 }
578 587
579 TEST_F(WasmModuleVerifyTest, IndirectFunctionNoFunctions) { 588 TEST_F(WasmModuleVerifyTest, IndirectFunctionNoFunctions) {
580 static const byte data[] = { 589 static const byte data[] = {
581 // sig#0 ------------------------------------------------------- 590 // sig#0 -------------------------------------------------------
582 SIGNATURES_SECTION_VOID_VOID, 591 SIGNATURES_SECTION_VOID_VOID,
583 // indirect table ---------------------------------------------- 592 // indirect table ----------------------------------------------
584 SECTION(FUNCTION_TABLE, 3), 1, 0, 0, 593 SECTION(Table, 4), ENTRY_COUNT(1), 1, 0, 0,
585 }; 594 };
586 595
587 EXPECT_FAILURE(data); 596 EXPECT_FAILURE(data);
588 } 597 }
589 598
590 TEST_F(WasmModuleVerifyTest, IndirectFunctionInvalidIndex) { 599 TEST_F(WasmModuleVerifyTest, IndirectFunctionInvalidIndex) {
591 static const byte data[] = { 600 static const byte data[] = {
592 // sig#0 ------------------------------------------------------- 601 // sig#0 -------------------------------------------------------
593 SIGNATURES_SECTION_VOID_VOID, 602 SIGNATURES_SECTION_VOID_VOID,
594 // functions --------------------------------------------------- 603 // functions ---------------------------------------------------
595 ONE_EMPTY_FUNCTION, 604 ONE_EMPTY_FUNCTION,
596 // indirect table ---------------------------------------------- 605 // indirect table ----------------------------------------------
597 SECTION(FUNCTION_TABLE, 3), 1, 1, 0, 606 SECTION(Table, 4), ENTRY_COUNT(1), 1, 1, 0,
598 }; 607 };
599 608
600 EXPECT_FAILURE(data); 609 EXPECT_FAILURE(data);
601 } 610 }
602 611
603 class WasmSignatureDecodeTest : public TestWithZone {}; 612 class WasmSignatureDecodeTest : public TestWithZone {};
604 613
605 TEST_F(WasmSignatureDecodeTest, Ok_v_v) { 614 TEST_F(WasmSignatureDecodeTest, Ok_v_v) {
606 static const byte data[] = {SIG_ENTRY_v_v}; 615 static const byte data[] = {SIG_ENTRY_v_v};
607 base::AccountingAllocator allocator; 616 base::AccountingAllocator allocator;
608 Zone zone(&allocator); 617 Zone zone(&allocator);
609 FunctionSig* sig = 618 FunctionSig* sig =
610 DecodeWasmSignatureForTesting(&zone, data, data + arraysize(data)); 619 DecodeWasmSignatureForTesting(&zone, data, data + sizeof(data));
611 620
612 EXPECT_TRUE(sig != nullptr); 621 EXPECT_TRUE(sig != nullptr);
613 EXPECT_EQ(0, sig->parameter_count()); 622 EXPECT_EQ(0, sig->parameter_count());
614 EXPECT_EQ(0, sig->return_count()); 623 EXPECT_EQ(0, sig->return_count());
615 } 624 }
616 625
617 TEST_F(WasmSignatureDecodeTest, Ok_t_v) { 626 TEST_F(WasmSignatureDecodeTest, Ok_t_v) {
618 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { 627 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
619 LocalTypePair ret_type = kLocalTypes[i]; 628 LocalTypePair ret_type = kLocalTypes[i];
620 const byte data[] = {SIG_ENTRY_x(ret_type.code)}; 629 const byte data[] = {SIG_ENTRY_x(ret_type.code)};
621 FunctionSig* sig = 630 FunctionSig* sig =
622 DecodeWasmSignatureForTesting(zone(), data, data + arraysize(data)); 631 DecodeWasmSignatureForTesting(zone(), data, data + sizeof(data));
623 632
624 EXPECT_TRUE(sig != nullptr); 633 EXPECT_TRUE(sig != nullptr);
625 EXPECT_EQ(0, sig->parameter_count()); 634 EXPECT_EQ(0, sig->parameter_count());
626 EXPECT_EQ(1, sig->return_count()); 635 EXPECT_EQ(1, sig->return_count());
627 EXPECT_EQ(ret_type.type, sig->GetReturn()); 636 EXPECT_EQ(ret_type.type, sig->GetReturn());
628 } 637 }
629 } 638 }
630 639
631 TEST_F(WasmSignatureDecodeTest, Ok_v_t) { 640 TEST_F(WasmSignatureDecodeTest, Ok_v_t) {
632 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { 641 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
633 LocalTypePair param_type = kLocalTypes[i]; 642 LocalTypePair param_type = kLocalTypes[i];
634 const byte data[] = {SIG_ENTRY_v_x(param_type.code)}; 643 const byte data[] = {SIG_ENTRY_v_x(param_type.code)};
635 FunctionSig* sig = 644 FunctionSig* sig =
636 DecodeWasmSignatureForTesting(zone(), data, data + arraysize(data)); 645 DecodeWasmSignatureForTesting(zone(), data, data + sizeof(data));
637 646
638 EXPECT_TRUE(sig != nullptr); 647 EXPECT_TRUE(sig != nullptr);
639 EXPECT_EQ(1, sig->parameter_count()); 648 EXPECT_EQ(1, sig->parameter_count());
640 EXPECT_EQ(0, sig->return_count()); 649 EXPECT_EQ(0, sig->return_count());
641 EXPECT_EQ(param_type.type, sig->GetParam(0)); 650 EXPECT_EQ(param_type.type, sig->GetParam(0));
642 } 651 }
643 } 652 }
644 653
645 TEST_F(WasmSignatureDecodeTest, Ok_t_t) { 654 TEST_F(WasmSignatureDecodeTest, Ok_t_t) {
646 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { 655 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
647 LocalTypePair ret_type = kLocalTypes[i]; 656 LocalTypePair ret_type = kLocalTypes[i];
648 for (size_t j = 0; j < arraysize(kLocalTypes); j++) { 657 for (size_t j = 0; j < arraysize(kLocalTypes); j++) {
649 LocalTypePair param_type = kLocalTypes[j]; 658 LocalTypePair param_type = kLocalTypes[j];
650 const byte data[] = {SIG_ENTRY_x_x(ret_type.code, param_type.code)}; 659 const byte data[] = {SIG_ENTRY_x_x(ret_type.code, param_type.code)};
651 FunctionSig* sig = 660 FunctionSig* sig =
652 DecodeWasmSignatureForTesting(zone(), data, data + arraysize(data)); 661 DecodeWasmSignatureForTesting(zone(), data, data + sizeof(data));
653 662
654 EXPECT_TRUE(sig != nullptr); 663 EXPECT_TRUE(sig != nullptr);
655 EXPECT_EQ(1, sig->parameter_count()); 664 EXPECT_EQ(1, sig->parameter_count());
656 EXPECT_EQ(1, sig->return_count()); 665 EXPECT_EQ(1, sig->return_count());
657 EXPECT_EQ(param_type.type, sig->GetParam(0)); 666 EXPECT_EQ(param_type.type, sig->GetParam(0));
658 EXPECT_EQ(ret_type.type, sig->GetReturn()); 667 EXPECT_EQ(ret_type.type, sig->GetReturn());
659 } 668 }
660 } 669 }
661 } 670 }
662 671
663 TEST_F(WasmSignatureDecodeTest, Ok_i_tt) { 672 TEST_F(WasmSignatureDecodeTest, Ok_i_tt) {
664 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { 673 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
665 LocalTypePair p0_type = kLocalTypes[i]; 674 LocalTypePair p0_type = kLocalTypes[i];
666 for (size_t j = 0; j < arraysize(kLocalTypes); j++) { 675 for (size_t j = 0; j < arraysize(kLocalTypes); j++) {
667 LocalTypePair p1_type = kLocalTypes[j]; 676 LocalTypePair p1_type = kLocalTypes[j];
668 const byte data[] = { 677 const byte data[] = {
669 SIG_ENTRY_x_xx(kLocalI32, p0_type.code, p1_type.code)}; 678 SIG_ENTRY_x_xx(kLocalI32, p0_type.code, p1_type.code)};
670 FunctionSig* sig = 679 FunctionSig* sig =
671 DecodeWasmSignatureForTesting(zone(), data, data + arraysize(data)); 680 DecodeWasmSignatureForTesting(zone(), data, data + sizeof(data));
672 681
673 EXPECT_TRUE(sig != nullptr); 682 EXPECT_TRUE(sig != nullptr);
674 EXPECT_EQ(2, sig->parameter_count()); 683 EXPECT_EQ(2, sig->parameter_count());
675 EXPECT_EQ(1, sig->return_count()); 684 EXPECT_EQ(1, sig->return_count());
676 EXPECT_EQ(p0_type.type, sig->GetParam(0)); 685 EXPECT_EQ(p0_type.type, sig->GetParam(0));
677 EXPECT_EQ(p1_type.type, sig->GetParam(1)); 686 EXPECT_EQ(p1_type.type, sig->GetParam(1));
678 } 687 }
679 } 688 }
680 } 689 }
681 690
(...skipping 10 matching lines...) Expand all
692 } 701 }
693 } 702 }
694 } 703 }
695 704
696 TEST_F(WasmSignatureDecodeTest, Fail_invalid_type) { 705 TEST_F(WasmSignatureDecodeTest, Fail_invalid_type) {
697 byte kInvalidType = 76; 706 byte kInvalidType = 76;
698 for (size_t i = 0; i < SIZEOF_SIG_ENTRY_x_xx; i++) { 707 for (size_t i = 0; i < SIZEOF_SIG_ENTRY_x_xx; i++) {
699 byte data[] = {SIG_ENTRY_x_xx(kLocalI32, kLocalI32, kLocalI32)}; 708 byte data[] = {SIG_ENTRY_x_xx(kLocalI32, kLocalI32, kLocalI32)};
700 data[i] = kInvalidType; 709 data[i] = kInvalidType;
701 FunctionSig* sig = 710 FunctionSig* sig =
702 DecodeWasmSignatureForTesting(zone(), data, data + arraysize(data)); 711 DecodeWasmSignatureForTesting(zone(), data, data + sizeof(data));
703 EXPECT_EQ(nullptr, sig); 712 EXPECT_EQ(nullptr, sig);
704 } 713 }
705 } 714 }
706 715
707 TEST_F(WasmSignatureDecodeTest, Fail_invalid_ret_type1) { 716 TEST_F(WasmSignatureDecodeTest, Fail_invalid_ret_type1) {
708 static const byte data[] = {SIG_ENTRY_x_x(kLocalVoid, kLocalI32)}; 717 static const byte data[] = {SIG_ENTRY_x_x(kLocalVoid, kLocalI32)};
709 FunctionSig* sig = 718 FunctionSig* sig =
710 DecodeWasmSignatureForTesting(zone(), data, data + arraysize(data)); 719 DecodeWasmSignatureForTesting(zone(), data, data + sizeof(data));
711 EXPECT_EQ(nullptr, sig); 720 EXPECT_EQ(nullptr, sig);
712 } 721 }
713 722
714 TEST_F(WasmSignatureDecodeTest, Fail_invalid_param_type1) { 723 TEST_F(WasmSignatureDecodeTest, Fail_invalid_param_type1) {
715 static const byte data[] = {SIG_ENTRY_x_x(kLocalI32, kLocalVoid)}; 724 static const byte data[] = {SIG_ENTRY_x_x(kLocalI32, kLocalVoid)};
716 FunctionSig* sig = 725 FunctionSig* sig =
717 DecodeWasmSignatureForTesting(zone(), data, data + arraysize(data)); 726 DecodeWasmSignatureForTesting(zone(), data, data + sizeof(data));
718 EXPECT_EQ(nullptr, sig); 727 EXPECT_EQ(nullptr, sig);
719 } 728 }
720 729
721 TEST_F(WasmSignatureDecodeTest, Fail_invalid_param_type2) { 730 TEST_F(WasmSignatureDecodeTest, Fail_invalid_param_type2) {
722 static const byte data[] = {SIG_ENTRY_x_xx(kLocalI32, kLocalI32, kLocalVoid)}; 731 static const byte data[] = {SIG_ENTRY_x_xx(kLocalI32, kLocalI32, kLocalVoid)};
723 FunctionSig* sig = 732 FunctionSig* sig =
724 DecodeWasmSignatureForTesting(zone(), data, data + arraysize(data)); 733 DecodeWasmSignatureForTesting(zone(), data, data + sizeof(data));
725 EXPECT_EQ(nullptr, sig); 734 EXPECT_EQ(nullptr, sig);
726 } 735 }
727 736
728 class WasmFunctionVerifyTest : public TestWithIsolateAndZone {}; 737 class WasmFunctionVerifyTest : public TestWithIsolateAndZone {};
729 738
730 TEST_F(WasmFunctionVerifyTest, Ok_v_v_empty) { 739 TEST_F(WasmFunctionVerifyTest, Ok_v_v_empty) {
731 static const byte data[] = { 740 static const byte data[] = {
732 SIG_ENTRY_v_v, // signature entry 741 SIG_ENTRY_v_v, // signature entry
733 4, // locals 742 4, // locals
734 3, 743 3,
735 kLocalI32, // -- 744 kLocalI32, // --
736 4, 745 4,
737 kLocalI64, // -- 746 kLocalI64, // --
738 5, 747 5,
739 kLocalF32, // -- 748 kLocalF32, // --
740 6, 749 6,
741 kLocalF64, // -- 750 kLocalF64, // --
742 kExprNop // body 751 kExprNop // body
743 }; 752 };
744 753
745 FunctionResult result = DecodeWasmFunction(isolate(), zone(), nullptr, data, 754 FunctionResult result =
746 data + arraysize(data)); 755 DecodeWasmFunction(isolate(), zone(), nullptr, data, data + sizeof(data));
747 EXPECT_OK(result); 756 EXPECT_OK(result);
748 757
749 if (result.val && result.ok()) { 758 if (result.val && result.ok()) {
750 WasmFunction* function = result.val; 759 WasmFunction* function = result.val;
751 EXPECT_EQ(0, function->sig->parameter_count()); 760 EXPECT_EQ(0, function->sig->parameter_count());
752 EXPECT_EQ(0, function->sig->return_count()); 761 EXPECT_EQ(0, function->sig->return_count());
753 EXPECT_EQ(0, function->name_offset); 762 EXPECT_EQ(0, function->name_offset);
754 EXPECT_EQ(SIZEOF_SIG_ENTRY_v_v, function->code_start_offset); 763 EXPECT_EQ(SIZEOF_SIG_ENTRY_v_v, function->code_start_offset);
755 EXPECT_EQ(arraysize(data), function->code_end_offset); 764 EXPECT_EQ(sizeof(data), function->code_end_offset);
756 // TODO(titzer): verify encoding of local declarations 765 // TODO(titzer): verify encoding of local declarations
757 } 766 }
758 767
759 if (result.val) delete result.val; 768 if (result.val) delete result.val;
760 } 769 }
761 770
762 TEST_F(WasmModuleVerifyTest, SectionWithoutNameLength) { 771 TEST_F(WasmModuleVerifyTest, SectionWithoutNameLength) {
763 const byte data[] = {1}; 772 const byte data[] = {1};
764 EXPECT_FAILURE(data); 773 EXPECT_FAILURE(data);
765 } 774 }
766 775
767 TEST_F(WasmModuleVerifyTest, TheLoneliestOfValidModulesTheTrulyEmptyOne) { 776 TEST_F(WasmModuleVerifyTest, TheLoneliestOfValidModulesTheTrulyEmptyOne) {
768 const byte data[] = { 777 const byte data[] = {
778 0, // unknown section code.
769 0, // Empty section name. 779 0, // Empty section name.
770 // No section name, no content, nothing but sadness. 780 // No section name, no content, nothing but sadness.
771 0, // No section content. 781 0, // No section content.
772 }; 782 };
773 EXPECT_VERIFIES(data); 783 EXPECT_VERIFIES(data);
774 } 784 }
775 785
776 TEST_F(WasmModuleVerifyTest, OnlyUnknownSectionEmpty) { 786 TEST_F(WasmModuleVerifyTest, OnlyUnknownSectionEmpty) {
777 const byte data[] = { 787 const byte data[] = {
778 UNKNOWN_SECTION_NAME, 0, 788 UNKNOWN_SECTION_NAME, 0,
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
877 0x0f, // Section size LEB128 0xfffffffa 887 0x0f, // Section size LEB128 0xfffffffa
878 }; 888 };
879 EXPECT_FAILURE(data); 889 EXPECT_FAILURE(data);
880 } 890 }
881 891
882 TEST_F(WasmModuleVerifyTest, UnknownSectionSkipped) { 892 TEST_F(WasmModuleVerifyTest, UnknownSectionSkipped) {
883 static const byte data[] = { 893 static const byte data[] = {
884 UNKNOWN_EMPTY_SECTION_NAME, 894 UNKNOWN_EMPTY_SECTION_NAME,
885 1, // section size 895 1, // section size
886 0, // one byte section 896 0, // one byte section
887 SECTION(GLOBALS, 4), 897 SECTION(Global, 6),
888 1, 898 1,
889 0, // name length 899 kLocalI32, // memory type
890 kLocalI32, // memory type 900 0, // exported
891 0, // exported 901 WASM_INIT_EXPR_I32V_1(33), // init
892 }; 902 };
893 ModuleResult result = DecodeModule(data, data + arraysize(data)); 903 ModuleResult result = DecodeModule(data, data + sizeof(data));
894 EXPECT_OK(result); 904 EXPECT_OK(result);
895 905
896 EXPECT_EQ(1, result.val->globals.size()); 906 EXPECT_EQ(1, result.val->globals.size());
897 EXPECT_EQ(0, result.val->functions.size()); 907 EXPECT_EQ(0, result.val->functions.size());
898 EXPECT_EQ(0, result.val->data_segments.size()); 908 EXPECT_EQ(0, result.val->data_segments.size());
899 909
900 const WasmGlobal* global = &result.val->globals.back(); 910 const WasmGlobal* global = &result.val->globals.back();
901 911
902 EXPECT_EQ(0, global->name_length);
903 EXPECT_EQ(kAstI32, global->type); 912 EXPECT_EQ(kAstI32, global->type);
904 EXPECT_EQ(0, global->offset); 913 EXPECT_EQ(0, global->offset);
905 EXPECT_FALSE(global->exported);
906 914
907 if (result.val) delete result.val; 915 if (result.val) delete result.val;
908 } 916 }
909 917
910 TEST_F(WasmModuleVerifyTest, ImportTable_empty) { 918 TEST_F(WasmModuleVerifyTest, ImportTable_empty) {
911 static const byte data[] = {SECTION(SIGNATURES, 1), 0, 919 static const byte data[] = {SECTION(Type, 1), 0, SECTION(Import, 1), 0};
912 SECTION(IMPORT_TABLE, 1), 0};
913 EXPECT_VERIFIES(data); 920 EXPECT_VERIFIES(data);
914 } 921 }
915 922
916 TEST_F(WasmModuleVerifyTest, ImportTable_nosigs1) { 923 TEST_F(WasmModuleVerifyTest, ImportTable_nosigs1) {
917 static const byte data[] = {SECTION(IMPORT_TABLE, 1), 0}; 924 static const byte data[] = {SECTION(Import, 1), 0};
918 EXPECT_VERIFIES(data); 925 EXPECT_VERIFIES(data);
919 } 926 }
920 927
921 TEST_F(WasmModuleVerifyTest, ImportTable_nosigs2) { 928 TEST_F(WasmModuleVerifyTest, ImportTable_nosigs2) {
922 static const byte data[] = { 929 static const byte data[] = {
923 SECTION(IMPORT_TABLE, 6), 1, // sig table 930 SECTION(Import, 6), 1, // sig table
924 IMPORT_SIG_INDEX(0), // sig index 931 NAME_LENGTH(1), 'm', // module name
925 NAME_LENGTH(1), 'm', // module name 932 NAME_LENGTH(1), 'f', // function name
926 NAME_LENGTH(1), 'f', // function name 933 kExternalFunction, // import kind
934 IMPORT_SIG_INDEX(0), // sig index
927 }; 935 };
928 EXPECT_FAILURE(data); 936 EXPECT_FAILURE(data);
929 } 937 }
930 938
931 TEST_F(WasmModuleVerifyTest, ImportTable_invalid_sig) { 939 TEST_F(WasmModuleVerifyTest, ImportTable_invalid_sig) {
932 static const byte data[] = { 940 static const byte data[] = {
933 SECTION(SIGNATURES, 1), 0, // -- 941 SECTION(Type, 1), 0, // --
934 SECTION(IMPORT_TABLE, 6), 1, // -- 942 SECTION(Import, 6), 1, // --
935 IMPORT_SIG_INDEX(0), // sig index 943 NAME_LENGTH(1), 'm', // module name
936 NAME_LENGTH(1), 'm', // module name 944 NAME_LENGTH(1), 'f', // function name
937 NAME_LENGTH(1), 'f', // function name 945 kExternalFunction, // import kind
946 IMPORT_SIG_INDEX(0), // sig index
938 }; 947 };
939 EXPECT_FAILURE(data); 948 EXPECT_FAILURE(data);
940 } 949 }
941 950
942 TEST_F(WasmModuleVerifyTest, ImportTable_one_sig) { 951 TEST_F(WasmModuleVerifyTest, ImportTable_one_sig) {
943 static const byte data[] = { 952 static const byte data[] = {
944 // signatures 953 // signatures
945 SIGNATURES_SECTION_VOID_VOID, 954 SIGNATURES_SECTION_VOID_VOID,
946 SECTION(IMPORT_TABLE, 6), 955 SECTION(Import, 7),
947 1, // -- 956 1, // --
948 IMPORT_SIG_INDEX(0), // sig index
949 NAME_LENGTH(1), 957 NAME_LENGTH(1),
950 'm', // module name 958 'm', // module name
951 NAME_LENGTH(1), 959 NAME_LENGTH(1),
952 'f', // function name 960 'f', // function name
961 kExternalFunction, // import kind
962 IMPORT_SIG_INDEX(0), // sig index
953 }; 963 };
954 EXPECT_VERIFIES(data); 964 EXPECT_VERIFIES(data);
955 } 965 }
956 966
957 TEST_F(WasmModuleVerifyTest, ImportTable_invalid_module) { 967 TEST_F(WasmModuleVerifyTest, ImportTable_invalid_module) {
958 static const byte data[] = { 968 static const byte data[] = {
959 // signatures 969 // signatures
960 SIGNATURES_SECTION_VOID_VOID, 970 SIGNATURES_SECTION_VOID_VOID, // --
961 SECTION(IMPORT_TABLE, 6), 971 SECTION(Import, 7), // --
962 1, // -- 972 1, // --
963 IMPORT_SIG_INDEX(0), // sig index 973 NO_NAME, // module name
964 NO_NAME, // module name 974 NAME_LENGTH(1), // --
965 NAME_LENGTH(1), 975 'f', // function name
966 'f' // function name 976 kExternalFunction, // import kind
977 IMPORT_SIG_INDEX(0), // sig index
967 }; 978 };
968 EXPECT_FAILURE(data); 979 EXPECT_FAILURE(data);
969 } 980 }
970 981
971 TEST_F(WasmModuleVerifyTest, ImportTable_off_end) { 982 TEST_F(WasmModuleVerifyTest, ImportTable_off_end) {
972 static const byte data[] = { 983 static const byte data[] = {
973 // signatures 984 // signatures
974 SIGNATURES_SECTION_VOID_VOID, 985 SIGNATURES_SECTION_VOID_VOID,
975 SECTION(IMPORT_TABLE, 6), 986 SECTION(Import, 6),
976 1, 987 1,
977 IMPORT_SIG_INDEX(0), // sig index
978 NAME_LENGTH(1), 988 NAME_LENGTH(1),
979 'm', // module name 989 'm', // module name
980 NAME_LENGTH(1), 990 NAME_LENGTH(1),
981 'f', // function name 991 'f', // function name
992 kExternalFunction, // import kind
993 IMPORT_SIG_INDEX(0), // sig index
982 }; 994 };
983 995
984 EXPECT_OFF_END_FAILURE(data, 16, sizeof(data)); 996 EXPECT_OFF_END_FAILURE(data, 16, sizeof(data));
985 } 997 }
986 998
987 TEST_F(WasmModuleVerifyTest, ExportTable_empty1) { 999 TEST_F(WasmModuleVerifyTest, ExportTable_empty1) {
988 static const byte data[] = {// signatures 1000 static const byte data[] = { // signatures
989 SIGNATURES_SECTION_VOID_VOID, ONE_EMPTY_FUNCTION, 1001 SIGNATURES_SECTION_VOID_VOID, // --
990 SECTION(EXPORT_TABLE, 1), 1002 ONE_EMPTY_FUNCTION, SECTION(Export, 1), // --
991 0, // -- 1003 0, // --
992 ONE_EMPTY_BODY}; 1004 ONE_EMPTY_BODY};
993 1005
994 ModuleResult result = DecodeModule(data, data + arraysize(data)); 1006 ModuleResult result = DecodeModule(data, data + sizeof(data));
995 EXPECT_OK(result); 1007 EXPECT_OK(result);
996 1008
997 EXPECT_EQ(1, result.val->functions.size()); 1009 EXPECT_EQ(1, result.val->functions.size());
998 EXPECT_EQ(0, result.val->export_table.size()); 1010 EXPECT_EQ(0, result.val->export_table.size());
999 1011
1000 if (result.val) delete result.val; 1012 if (result.val) delete result.val;
1001 } 1013 }
1002 1014
1003 TEST_F(WasmModuleVerifyTest, ExportTable_empty2) { 1015 TEST_F(WasmModuleVerifyTest, ExportTable_empty2) {
1004 static const byte data[] = { 1016 static const byte data[] = {
1005 SECTION(SIGNATURES, 1), 0, SECTION(EXPORT_TABLE, 1), 0 // -- 1017 SECTION(Type, 1), 0, SECTION(Export, 1), 0 // --
1006 }; 1018 };
1007 // TODO(titzer): current behavior treats empty functions section as missing. 1019 EXPECT_VERIFIES(data);
1008 EXPECT_FAILURE(data);
1009 }
1010
1011 TEST_F(WasmModuleVerifyTest, ExportTable_NoFunctions1) {
1012 static const byte data[] = {
1013 SECTION(SIGNATURES, 1), 0, SECTION(EXPORT_TABLE, 1), 0 // --
1014 };
1015 EXPECT_FAILURE(data);
1016 } 1020 }
1017 1021
1018 TEST_F(WasmModuleVerifyTest, ExportTable_NoFunctions2) { 1022 TEST_F(WasmModuleVerifyTest, ExportTable_NoFunctions2) {
1019 static const byte data[] = {SECTION(EXPORT_TABLE, 1), 0}; 1023 static const byte data[] = {SECTION(Export, 1), 0};
1020 EXPECT_FAILURE(data); 1024 EXPECT_VERIFIES(data);
1021 } 1025 }
1022 1026
1023 TEST_F(WasmModuleVerifyTest, ExportTableOne) { 1027 TEST_F(WasmModuleVerifyTest, ExportTableOne) {
1024 static const byte data[] = {// signatures 1028 static const byte data[] = {// signatures
1025 SIGNATURES_SECTION_VOID_VOID, 1029 SIGNATURES_SECTION_VOID_VOID,
1026 ONE_EMPTY_FUNCTION, 1030 ONE_EMPTY_FUNCTION,
1027 SECTION(EXPORT_TABLE, 3), 1031 SECTION(Export, 4),
1028 1, // exports 1032 1, // exports
1029 FUNC_INDEX(0), // -- 1033 NO_NAME, // --
1030 NO_NAME, // -- 1034 kExternalFunction, // --
1035 FUNC_INDEX(0), // --
1031 ONE_EMPTY_BODY}; 1036 ONE_EMPTY_BODY};
1032 ModuleResult result = DecodeModule(data, data + arraysize(data)); 1037 ModuleResult result = DecodeModule(data, data + sizeof(data));
1033 EXPECT_OK(result); 1038 EXPECT_OK(result);
1034 1039
1035 EXPECT_EQ(1, result.val->functions.size()); 1040 EXPECT_EQ(1, result.val->functions.size());
1036 EXPECT_EQ(1, result.val->export_table.size()); 1041 EXPECT_EQ(1, result.val->export_table.size());
1037 1042
1038 if (result.val) delete result.val; 1043 if (result.val) delete result.val;
1039 } 1044 }
1040 1045
1041 TEST_F(WasmModuleVerifyTest, ExportNameWithInvalidStringLength) { 1046 TEST_F(WasmModuleVerifyTest, ExportNameWithInvalidStringLength) {
1042 static const byte data[] = {// signatures 1047 static const byte data[] = {// signatures
1043 SIGNATURES_SECTION_VOID_VOID, 1048 SIGNATURES_SECTION_VOID_VOID,
1044 ONE_EMPTY_FUNCTION, 1049 ONE_EMPTY_FUNCTION,
1045 SECTION(EXPORT_TABLE, 12), 1050 SECTION(Export, 12),
1046 1, // exports 1051 1, // exports
1047 FUNC_INDEX(0), // -- 1052 NAME_LENGTH(84), // invalid string length
1048 NAME_LENGTH(84), // invalid string length 1053 'e', // --
1049 'e', // -- 1054 kExternalFunction, // --
1050 ONE_EMPTY_BODY}; 1055 FUNC_INDEX(0)};
1051 1056
1052 EXPECT_FAILURE(data); 1057 EXPECT_FAILURE(data);
1053 } 1058 }
1054 1059
1055 TEST_F(WasmModuleVerifyTest, ExportTableTwo) { 1060 TEST_F(WasmModuleVerifyTest, ExportTableTwo) {
1056 static const byte data[] = {// signatures 1061 static const byte data[] = {// signatures
1057 SIGNATURES_SECTION_VOID_VOID, 1062 SIGNATURES_SECTION_VOID_VOID,
1058 ONE_EMPTY_FUNCTION, 1063 ONE_EMPTY_FUNCTION,
1059 SECTION(EXPORT_TABLE, 12), 1064 SECTION(Export, 14),
1060 2, // exports 1065 2, // exports
1061 FUNC_INDEX(0), // --
1062 NAME_LENGTH(4), 1066 NAME_LENGTH(4),
1063 'n', 1067 'n',
1064 'a', 1068 'a',
1065 'm', 1069 'm',
1066 'e', // -- 1070 'e', // --
1071 kExternalFunction,
1067 FUNC_INDEX(0), // -- 1072 FUNC_INDEX(0), // --
1068 NAME_LENGTH(3), 1073 NAME_LENGTH(3),
1069 'n', 1074 'n',
1070 'o', 1075 'o',
1071 'm', // -- 1076 'm', // --
1077 kExternalFunction, // --
1078 FUNC_INDEX(0), // --
1072 ONE_EMPTY_BODY}; 1079 ONE_EMPTY_BODY};
1073 1080
1074 ModuleResult result = DecodeModule(data, data + arraysize(data)); 1081 ModuleResult result = DecodeModule(data, data + sizeof(data));
1075 EXPECT_OK(result); 1082 EXPECT_OK(result);
1076 1083
1077 EXPECT_EQ(1, result.val->functions.size()); 1084 EXPECT_EQ(1, result.val->functions.size());
1078 EXPECT_EQ(2, result.val->export_table.size()); 1085 EXPECT_EQ(2, result.val->export_table.size());
1079 1086
1080 if (result.val) delete result.val; 1087 if (result.val) delete result.val;
1081 } 1088 }
1082 1089
1083 TEST_F(WasmModuleVerifyTest, ExportTableThree) { 1090 TEST_F(WasmModuleVerifyTest, ExportTableThree) {
1084 static const byte data[] = {// signatures 1091 static const byte data[] = {// signatures
1085 SIGNATURES_SECTION_VOID_VOID, 1092 SIGNATURES_SECTION_VOID_VOID,
1086 THREE_EMPTY_FUNCTIONS, 1093 THREE_EMPTY_FUNCTIONS,
1087 SECTION(EXPORT_TABLE, 10), 1094 SECTION(Export, 13),
1088 3, // exports 1095 3, // exports
1096 NAME_LENGTH(1),
1097 'a', // --
1098 kExternalFunction,
1089 FUNC_INDEX(0), // -- 1099 FUNC_INDEX(0), // --
1090 NAME_LENGTH(1), 1100 NAME_LENGTH(1),
1091 'a', // -- 1101 'b', // --
1102 kExternalFunction,
1092 FUNC_INDEX(1), // -- 1103 FUNC_INDEX(1), // --
1093 NAME_LENGTH(1), 1104 NAME_LENGTH(1),
1094 'b', // -- 1105 'c', // --
1106 kExternalFunction,
1095 FUNC_INDEX(2), // -- 1107 FUNC_INDEX(2), // --
1096 NAME_LENGTH(1),
1097 'c', // --
1098 THREE_EMPTY_BODIES}; 1108 THREE_EMPTY_BODIES};
1099 ModuleResult result = DecodeModule(data, data + arraysize(data)); 1109 ModuleResult result = DecodeModule(data, data + sizeof(data));
1100 EXPECT_OK(result); 1110 EXPECT_OK(result);
1101 1111
1102 EXPECT_EQ(3, result.val->functions.size()); 1112 EXPECT_EQ(3, result.val->functions.size());
1103 EXPECT_EQ(3, result.val->export_table.size()); 1113 EXPECT_EQ(3, result.val->export_table.size());
1104 1114
1105 if (result.val) delete result.val; 1115 if (result.val) delete result.val;
1106 } 1116 }
1107 1117
1108 TEST_F(WasmModuleVerifyTest, ExportTableThreeOne) { 1118 TEST_F(WasmModuleVerifyTest, ExportTableThreeOne) {
1109 for (int i = 0; i < 6; i++) { 1119 for (int i = 0; i < 6; i++) {
1110 const byte data[] = {// signatures 1120 const byte data[] = {// signatures
1111 SIGNATURES_SECTION_VOID_VOID, 1121 SIGNATURES_SECTION_VOID_VOID,
1112 THREE_EMPTY_FUNCTIONS, 1122 THREE_EMPTY_FUNCTIONS,
1113 SECTION(EXPORT_TABLE, 5), 1123 SECTION(Export, 6),
1114 1, // exports 1124 1, // exports
1115 FUNC_INDEX(i), // --
1116 NAME_LENGTH(2), 1125 NAME_LENGTH(2),
1117 'e', 1126 'e',
1118 'x', // -- 1127 'x', // --
1128 kExternalFunction,
1129 FUNC_INDEX(i), // --
1119 THREE_EMPTY_BODIES}; 1130 THREE_EMPTY_BODIES};
1120 1131
1121 if (i < 3) { 1132 if (i < 3) {
1122 EXPECT_VERIFIES(data); 1133 EXPECT_VERIFIES(data);
1123 } else { 1134 } else {
1124 EXPECT_FAILURE(data); 1135 EXPECT_FAILURE(data);
1125 } 1136 }
1126 } 1137 }
1127 } 1138 }
1128 1139
1129 TEST_F(WasmModuleVerifyTest, ExportTableOne_off_end) { 1140 TEST_F(WasmModuleVerifyTest, ExportTableOne_off_end) {
1130 static const byte data[] = { 1141 static const byte data[] = {
1131 // signatures 1142 // signatures
1132 SIGNATURES_SECTION_VOID_VOID, 1143 SIGNATURES_SECTION_VOID_VOID,
1133 ONE_EMPTY_FUNCTION, 1144 ONE_EMPTY_FUNCTION,
1134 SECTION(EXPORT_TABLE, 1 + 6), 1145 SECTION(Export, 1 + 6),
1135 1, // exports 1146 1, // exports
1147 NO_NAME, // --
1148 kExternalFunction,
1136 FUNC_INDEX(0), // -- 1149 FUNC_INDEX(0), // --
1137 NO_NAME // --
1138 }; 1150 };
1139 1151
1140 for (int length = 33; length < sizeof(data); length++) { 1152 for (int length = 33; length < sizeof(data); length++) {
1141 ModuleResult result = DecodeModule(data, data + length); 1153 ModuleResult result = DecodeModule(data, data + length);
1142 EXPECT_FALSE(result.ok()); 1154 EXPECT_FALSE(result.ok());
1143 if (result.val) delete result.val; 1155 if (result.val) delete result.val;
1144 } 1156 }
1145 } 1157 }
1146 1158
1147 TEST_F(WasmModuleVerifyTest, FunctionSignatures_empty) { 1159 TEST_F(WasmModuleVerifyTest, FunctionSignatures_empty) {
1148 static const byte data[] = { 1160 static const byte data[] = {
1149 SECTION(SIGNATURES, 1), 0, // -- 1161 SECTION(Type, 1), 0, // --
1150 SECTION(FUNCTION_SIGNATURES, 1), 0 // -- 1162 SECTION(Function, 1), 0 // --
1151 }; // -- 1163 }; // --
1152 EXPECT_VERIFIES(data); 1164 EXPECT_VERIFIES(data);
1153 } 1165 }
1154 1166
1155 TEST_F(WasmModuleVerifyTest, FunctionSignatures_one) { 1167 TEST_F(WasmModuleVerifyTest, FunctionSignatures_one) {
1156 static const byte data[] = { 1168 static const byte data[] = {
1157 SIGNATURES_SECTION(1, SIG_ENTRY_v_v), // -- 1169 SIGNATURES_SECTION(1, SIG_ENTRY_v_v), // --
1158 FUNCTION_SIGNATURES_SECTION(1, 0) // -- 1170 FUNCTION_SIGNATURES_SECTION(1, 0) // --
1159 }; 1171 };
1160 EXPECT_VERIFIES(data); 1172 EXPECT_VERIFIES(data);
1161 } 1173 }
1162 1174
1163 TEST_F(WasmModuleVerifyTest, FunctionBodies_empty) { 1175 TEST_F(WasmModuleVerifyTest, FunctionBodies_empty) {
1164 static const byte data[] = { 1176 static const byte data[] = {
1165 EMPTY_SIGNATURES_SECTION, // -- 1177 EMPTY_SIGNATURES_SECTION, // --
1166 EMPTY_FUNCTION_SIGNATURES_SECTION, // -- 1178 EMPTY_FUNCTION_SIGNATURES_SECTION, // --
1167 EMPTY_FUNCTION_BODIES_SECTION // -- 1179 EMPTY_FUNCTION_BODIES_SECTION // --
1168 }; 1180 };
1169 EXPECT_VERIFIES(data); 1181 EXPECT_VERIFIES(data);
1170 } 1182 }
1171 1183
1172 TEST_F(WasmModuleVerifyTest, FunctionBodies_one_empty) { 1184 TEST_F(WasmModuleVerifyTest, FunctionBodies_one_empty) {
1173 static const byte data[] = { 1185 static const byte data[] = {
1174 SIGNATURES_SECTION(1, SIG_ENTRY_v_v), // -- 1186 SIGNATURES_SECTION(1, SIG_ENTRY_v_v), // --
1175 FUNCTION_SIGNATURES_SECTION(1, 0), // -- 1187 FUNCTION_SIGNATURES_SECTION(1, 0), // --
1176 SECTION(FUNCTION_BODIES, 1 + SIZEOF_EMPTY_BODY), 1, EMPTY_BODY // -- 1188 SECTION(Code, 1 + SIZEOF_EMPTY_BODY), 1, EMPTY_BODY // --
1177 }; 1189 };
1178 EXPECT_VERIFIES(data); 1190 EXPECT_VERIFIES(data);
1179 } 1191 }
1180 1192
1181 TEST_F(WasmModuleVerifyTest, FunctionBodies_one_nop) { 1193 TEST_F(WasmModuleVerifyTest, FunctionBodies_one_nop) {
1182 static const byte data[] = { 1194 static const byte data[] = {
1183 SIGNATURES_SECTION(1, SIG_ENTRY_v_v), // -- 1195 SIGNATURES_SECTION(1, SIG_ENTRY_v_v), // --
1184 FUNCTION_SIGNATURES_SECTION(1, 0), // -- 1196 FUNCTION_SIGNATURES_SECTION(1, 0), // --
1185 SECTION(FUNCTION_BODIES, 1 + SIZEOF_NOP_BODY), 1, NOP_BODY // -- 1197 SECTION(Code, 1 + SIZEOF_NOP_BODY), 1, NOP_BODY // --
1186 }; 1198 };
1187 EXPECT_VERIFIES(data); 1199 EXPECT_VERIFIES(data);
1188 } 1200 }
1189 1201
1190 TEST_F(WasmModuleVerifyTest, FunctionBodies_count_mismatch1) { 1202 TEST_F(WasmModuleVerifyTest, FunctionBodies_count_mismatch1) {
1191 static const byte data[] = { 1203 static const byte data[] = {
1192 SIGNATURES_SECTION(1, SIG_ENTRY_v_v), // -- 1204 SIGNATURES_SECTION(1, SIG_ENTRY_v_v), // --
1193 FUNCTION_SIGNATURES_SECTION(2, 0, 0), // -- 1205 FUNCTION_SIGNATURES_SECTION(2, 0, 0), // --
1194 SECTION(FUNCTION_BODIES, 1 + SIZEOF_EMPTY_BODY), 1, // -- 1206 SECTION(Code, 1 + SIZEOF_EMPTY_BODY), 1, // --
1195 EMPTY_BODY // -- 1207 EMPTY_BODY // --
1196 }; 1208 };
1197 EXPECT_FAILURE(data); 1209 EXPECT_FAILURE(data);
1198 } 1210 }
1199 1211
1200 TEST_F(WasmModuleVerifyTest, FunctionBodies_count_mismatch2) { 1212 TEST_F(WasmModuleVerifyTest, FunctionBodies_count_mismatch2) {
1201 static const byte data[] = { 1213 static const byte data[] = {
1202 SIGNATURES_SECTION(1, SIG_ENTRY_v_v), // -- 1214 SIGNATURES_SECTION(1, SIG_ENTRY_v_v), // --
1203 FUNCTION_SIGNATURES_SECTION(1, 0), // -- 1215 FUNCTION_SIGNATURES_SECTION(1, 0), // --
1204 SECTION(FUNCTION_BODIES, 1 + 2 * SIZEOF_NOP_BODY), // -- 1216 SECTION(Code, 1 + 2 * SIZEOF_NOP_BODY), // --
1205 2, // -- 1217 ENTRY_COUNT(2), // --
1206 NOP_BODY, // -- 1218 NOP_BODY, // --
1207 NOP_BODY // -- 1219 NOP_BODY // --
1208 }; 1220 };
1209 EXPECT_FAILURE(data); 1221 EXPECT_FAILURE(data);
1210 } 1222 }
1211 1223
1212 TEST_F(WasmModuleVerifyTest, Names_empty) { 1224 TEST_F(WasmModuleVerifyTest, Names_empty) {
1213 static const byte data[] = { 1225 static const byte data[] = {
1214 EMPTY_SIGNATURES_SECTION, EMPTY_FUNCTION_SIGNATURES_SECTION, 1226 EMPTY_SIGNATURES_SECTION, EMPTY_FUNCTION_SIGNATURES_SECTION,
1215 EMPTY_FUNCTION_BODIES_SECTION, EMPTY_NAMES_SECTION}; 1227 EMPTY_FUNCTION_BODIES_SECTION, EMPTY_NAMES_SECTION};
1216 EXPECT_VERIFIES(data); 1228 EXPECT_VERIFIES(data);
1217 } 1229 }
1218 1230
1219 TEST_F(WasmModuleVerifyTest, Names_one_empty) { 1231 TEST_F(WasmModuleVerifyTest, Names_one_empty) {
1220 static const byte data[] = { 1232 static const byte data[] = {
1221 SIGNATURES_SECTION(1, SIG_ENTRY_v_v), // -- 1233 SIGNATURES_SECTION(1, SIG_ENTRY_v_v), // --
1222 FUNCTION_SIGNATURES_SECTION(1, 0), // -- 1234 FUNCTION_SIGNATURES_SECTION(1, 0), // --
1223 SECTION(FUNCTION_BODIES, 1 + SIZEOF_EMPTY_BODY), 1235 SECTION(Code, 1 + SIZEOF_EMPTY_BODY),
1224 1, 1236 ENTRY_COUNT(1),
1225 EMPTY_BODY, // -- 1237 EMPTY_BODY, // --
1226 SECTION(NAMES, 1 + 5), 1238 SECTION_NAMES(1 + 5),
1227 1, 1239 ENTRY_COUNT(1),
1228 FOO_STRING, 1240 FOO_STRING,
1229 NO_LOCAL_NAMES // -- 1241 NO_LOCAL_NAMES // --
1230 }; 1242 };
1231 EXPECT_VERIFIES(data); 1243 EXPECT_VERIFIES(data);
1232 } 1244 }
1233 1245
1234 TEST_F(WasmModuleVerifyTest, Names_two_empty) { 1246 TEST_F(WasmModuleVerifyTest, Names_two_empty) {
1235 static const byte data[] = { 1247 static const byte data[] = {
1236 SIGNATURES_SECTION(1, SIG_ENTRY_v_v), // -- 1248 SIGNATURES_SECTION(1, SIG_ENTRY_v_v), // --
1237 FUNCTION_SIGNATURES_SECTION(2, 0, 0), // -- 1249 FUNCTION_SIGNATURES_SECTION(2, 0, 0), // --
1238 SECTION(FUNCTION_BODIES, 1 + 2 * SIZEOF_EMPTY_BODY), // -- 1250 SECTION(Code, 1 + 2 * SIZEOF_EMPTY_BODY), // --
1239 2, 1251 ENTRY_COUNT(2),
1240 EMPTY_BODY, 1252 EMPTY_BODY,
1241 EMPTY_BODY, // -- 1253 EMPTY_BODY, // --
1242 SECTION(NAMES, 1 + 10), 1254 SECTION_NAMES(1 + 10),
1243 2, // -- 1255 ENTRY_COUNT(2), // --
1244 FOO_STRING, 1256 FOO_STRING,
1245 NO_LOCAL_NAMES, // -- 1257 NO_LOCAL_NAMES, // --
1246 FOO_STRING, 1258 FOO_STRING,
1247 NO_LOCAL_NAMES, // -- 1259 NO_LOCAL_NAMES, // --
1248 }; 1260 };
1249 EXPECT_VERIFIES(data); 1261 EXPECT_VERIFIES(data);
1250 } 1262 }
1251 1263
1264 #define EXPECT_INIT_EXPR(Type, type, value, ...) \
1265 { \
1266 static const byte data[] = {__VA_ARGS__, kExprEnd}; \
1267 WasmInitExpr expr = \
1268 DecodeWasmInitExprForTesting(data, data + sizeof(data)); \
1269 EXPECT_EQ(WasmInitExpr::k##Type##Const, expr.kind); \
1270 EXPECT_EQ(value, expr.val.type##_const); \
1271 }
1272
1273 TEST_F(WasmModuleVerifyTest, InitExpr_i32) {
1274 EXPECT_INIT_EXPR(I32, i32, 33, WASM_I32V_1(33));
1275 EXPECT_INIT_EXPR(I32, i32, -21, WASM_I32V_1(-21));
1276 EXPECT_INIT_EXPR(I32, i32, 437, WASM_I32V_2(437));
1277 EXPECT_INIT_EXPR(I32, i32, 77777, WASM_I32V_3(77777));
1278 }
1279
1280 TEST_F(WasmModuleVerifyTest, InitExpr_f32) {
1281 EXPECT_INIT_EXPR(F32, f32, static_cast<float>(13.1), WASM_F32(13.1));
1282 EXPECT_INIT_EXPR(F32, f32, static_cast<float>(-21.1), WASM_F32(-21.1));
1283 EXPECT_INIT_EXPR(F32, f32, static_cast<float>(437.2), WASM_F32(437.2));
1284 EXPECT_INIT_EXPR(F32, f32, static_cast<float>(77777.3), WASM_F32(77777.3));
1285 }
1286
1287 TEST_F(WasmModuleVerifyTest, InitExpr_i64) {
1288 EXPECT_INIT_EXPR(I64, i64, 33, WASM_I64V_1(33));
1289 EXPECT_INIT_EXPR(I64, i64, -21, WASM_I64V_2(-21));
1290 EXPECT_INIT_EXPR(I64, i64, 437, WASM_I64V_5(437));
1291 EXPECT_INIT_EXPR(I64, i64, 77777, WASM_I64V_7(77777));
1292 }
1293
1294 TEST_F(WasmModuleVerifyTest, InitExpr_f64) {
1295 EXPECT_INIT_EXPR(F64, f64, 83.22, WASM_F64(83.22));
1296 EXPECT_INIT_EXPR(F64, f64, -771.3, WASM_F64(-771.3));
1297 EXPECT_INIT_EXPR(F64, f64, 43703.0, WASM_F64(43703.0));
1298 EXPECT_INIT_EXPR(F64, f64, 77999.1, WASM_F64(77999.1));
1299 }
1300
1301 #define EXPECT_INIT_EXPR_FAIL(...) \
1302 { \
1303 static const byte data[] = {__VA_ARGS__, kExprEnd}; \
1304 WasmInitExpr expr = \
1305 DecodeWasmInitExprForTesting(data, data + sizeof(data)); \
1306 EXPECT_EQ(WasmInitExpr::kNone, expr.kind); \
1307 }
1308
1309 TEST_F(WasmModuleVerifyTest, InitExpr_illegal) {
1310 EXPECT_INIT_EXPR_FAIL(WASM_I32V_1(0), WASM_I32V_1(0));
1311 EXPECT_INIT_EXPR_FAIL(WASM_GET_LOCAL(0));
1312 EXPECT_INIT_EXPR_FAIL(WASM_SET_LOCAL(0, WASM_I32V_1(0)));
1313 EXPECT_INIT_EXPR_FAIL(WASM_I32_ADD(WASM_I32V_1(0), WASM_I32V_1(0)));
1314 EXPECT_INIT_EXPR_FAIL(WASM_IF_ELSE(WASM_ZERO, WASM_ZERO, WASM_ZERO));
1315 }
1316
1317 TEST_F(WasmModuleVerifyTest, InitExpr_global) {
1318 static const byte data[] = {WASM_INIT_EXPR_GLOBAL(37)};
1319 WasmInitExpr expr = DecodeWasmInitExprForTesting(data, data + sizeof(data));
1320 EXPECT_EQ(WasmInitExpr::kGlobalIndex, expr.kind);
1321 EXPECT_EQ(37, expr.val.global_index);
1322 }
1323
1252 } // namespace wasm 1324 } // namespace wasm
1253 } // namespace internal 1325 } // namespace internal
1254 } // namespace v8 1326 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698