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

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

Issue 1900153002: [wasm] Enforce strict ordering of WASM module sections. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fix OOB Created 4 years, 8 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/wasm/module-decoder.h" 7 #include "src/wasm/module-decoder.h"
8 #include "src/wasm/wasm-macro-gen.h" 8 #include "src/wasm/wasm-macro-gen.h"
9 #include "src/wasm/wasm-opcodes.h" 9 #include "src/wasm/wasm-opcodes.h"
10 10
11 namespace v8 { 11 namespace v8 {
12 namespace internal { 12 namespace internal {
13 namespace wasm { 13 namespace wasm {
14 14
15 #define EMPTY_FUNCTION(sig_index) 0, SIG_INDEX(sig_index), U16_LE(0) 15 #define EMPTY_FUNCTION(sig_index) 0, SIG_INDEX(sig_index), U16_LE(0)
16 #define EMPTY_FUNCTION_SIZE ((size_t)5) 16 #define EMPTY_FUNCTION_SIZE ((size_t)5)
17 #define EMPTY_BODY 0 17 #define EMPTY_BODY 0
18 #define EMPTY_BODY_SIZE ((size_t)1) 18 #define EMPTY_BODY_SIZE ((size_t)1)
19 #define NOP_BODY 2, 0, kExprNop 19 #define NOP_BODY 2, 0, kExprNop
20 #define NOP_BODY_SIZE ((size_t)3) 20 #define NOP_BODY_SIZE ((size_t)3)
21 #define VOID_VOID_SIG 0, kLocalVoid 21 #define VOID_VOID_SIG 0, kLocalVoid
22 #define VOID_VOID_SIG_SIZE ((size_t)2) 22 #define VOID_VOID_SIG_SIZE ((size_t)2)
23 #define INT_INT_SIG 1, kLocalI32, kLocalI32 23 #define INT_INT_SIG 1, kLocalI32, kLocalI32
24 #define INT_INT_SIG_SIZE ((size_t)3) 24 #define INT_INT_SIG_SIZE ((size_t)3)
25 25
26 // TODO(titzer): tricky size logic! Remove -1.
26 #define SECTION(NAME, EXTRA_SIZE) \ 27 #define SECTION(NAME, EXTRA_SIZE) \
27 U32V_1(WASM_SECTION_##NAME##_SIZE + (EXTRA_SIZE)), WASM_SECTION_##NAME 28 U32V_1(WASM_SECTION_##NAME##_SIZE + (EXTRA_SIZE)), WASM_SECTION_##NAME
28 29
29 #define EXPECT_VERIFIES(data) \ 30 #define EXPECT_VERIFIES(data) \
30 do { \ 31 do { \
31 ModuleResult result = DecodeModule(data, data + arraysize(data)); \ 32 ModuleResult result = DecodeModule(data, data + arraysize(data)); \
32 EXPECT_TRUE(result.ok()); \ 33 EXPECT_TRUE(result.ok()); \
33 if (result.val) delete result.val; \ 34 if (result.val) delete result.val; \
34 } while (false) 35 } while (false)
35 36
36 #define EXPECT_FAILURE_LEN(data, length) \ 37 #define EXPECT_FAILURE_LEN(data, length) \
37 do { \ 38 do { \
38 ModuleResult result = DecodeModule(data, data + length); \ 39 ModuleResult result = DecodeModule(data, data + length); \
39 EXPECT_FALSE(result.ok()); \ 40 EXPECT_FALSE(result.ok()); \
40 if (result.val) delete result.val; \ 41 if (result.val) delete result.val; \
41 } while (false) 42 } while (false)
42 43
43 #define EXPECT_FAILURE(data) EXPECT_FAILURE_LEN(data, sizeof(data)) 44 #define EXPECT_FAILURE(data) EXPECT_FAILURE_LEN(data, sizeof(data))
44 45
45 #define EXPECT_OFF_END_FAILURE(data, min, max) \ 46 #define EXPECT_OFF_END_FAILURE(data, min, max) \
46 do { \ 47 do { \
47 for (size_t length = min; length < max; length++) { \ 48 for (size_t length = min; length < max; length++) { \
48 EXPECT_FAILURE_LEN(data, length); \ 49 EXPECT_FAILURE_LEN(data, length); \
49 } \ 50 } \
50 } while (false) 51 } while (false)
51 52
53 #define EXPECT_OK(result) \
54 do { \
55 EXPECT_TRUE(result.ok()); \
56 if (!result.ok()) { \
57 if (result.val) delete result.val; \
58 return; \
59 } \
60 } while (false)
61
52 static size_t SizeOfVarInt(size_t value) { 62 static size_t SizeOfVarInt(size_t value) {
53 size_t size = 0; 63 size_t size = 0;
54 do { 64 do {
55 size++; 65 size++;
56 value = value >> 7; 66 value = value >> 7;
57 } while (value > 0); 67 } while (value > 0);
58 return size; 68 return size;
59 } 69 }
60 70
61 struct LocalTypePair { 71 struct LocalTypePair {
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
108 } 118 }
109 } 119 }
110 120
111 TEST_F(WasmModuleVerifyTest, DecodeEmpty) { 121 TEST_F(WasmModuleVerifyTest, DecodeEmpty) {
112 static const byte data[] = {SECTION(END, 0)}; 122 static const byte data[] = {SECTION(END, 0)};
113 EXPECT_VERIFIES(data); 123 EXPECT_VERIFIES(data);
114 } 124 }
115 125
116 TEST_F(WasmModuleVerifyTest, OneGlobal) { 126 TEST_F(WasmModuleVerifyTest, OneGlobal) {
117 static const byte data[] = { 127 static const byte data[] = {
118 SECTION(GLOBALS, 7), // -- 128 SECTION(GLOBALS, 5), // --
119 1, 129 1,
120 NAME_LENGTH(1), 130 NAME_LENGTH(1),
121 'g', // name 131 'g', // name
122 kMemI32, // memory type 132 kMemI32, // memory type
123 0, // exported 133 0, // exported
124 }; 134 };
125 135
126 { 136 {
127 // Should decode to exactly one global. 137 // Should decode to exactly one global.
128 ModuleResult result = DecodeModule(data, data + arraysize(data)); 138 ModuleResult result = DecodeModule(data, data + arraysize(data));
129 EXPECT_TRUE(result.ok()); 139 EXPECT_OK(result);
130 EXPECT_EQ(1, result.val->globals.size()); 140 EXPECT_EQ(1, result.val->globals.size());
131 EXPECT_EQ(0, result.val->functions.size()); 141 EXPECT_EQ(0, result.val->functions.size());
132 EXPECT_EQ(0, result.val->data_segments.size()); 142 EXPECT_EQ(0, result.val->data_segments.size());
133 143
134 WasmGlobal* global = &result.val->globals.back(); 144 WasmGlobal* global = &result.val->globals.back();
135 145
136 EXPECT_EQ(1, global->name_length); 146 EXPECT_EQ(1, global->name_length);
137 EXPECT_EQ(MachineType::Int32(), global->type); 147 EXPECT_EQ(MachineType::Int32(), global->type);
138 EXPECT_EQ(0, global->offset); 148 EXPECT_EQ(0, global->offset);
139 EXPECT_FALSE(global->exported); 149 EXPECT_FALSE(global->exported);
140 150
141 if (result.val) delete result.val; 151 if (result.val) delete result.val;
142 } 152 }
143 153
144 EXPECT_OFF_END_FAILURE(data, 1, sizeof(data)); 154 EXPECT_OFF_END_FAILURE(data, 1, sizeof(data));
145 } 155 }
146 156
147 157
148 TEST_F(WasmModuleVerifyTest, ZeroGlobals) { 158 TEST_F(WasmModuleVerifyTest, ZeroGlobals) {
149 static const byte data[] = { 159 static const byte data[] = {
150 SECTION(GLOBALS, 1), // -- 160 SECTION(GLOBALS, 1), // --
151 0, // declare 0 globals 161 0, // declare 0 globals
152 }; 162 };
153 ModuleResult result = DecodeModule(data, data + arraysize(data)); 163 ModuleResult result = DecodeModule(data, data + arraysize(data));
154 EXPECT_TRUE(result.ok()); 164 EXPECT_OK(result);
155 if (result.val) delete result.val; 165 if (result.val) delete result.val;
156 } 166 }
157 167
158 168
159 static void AppendUint32v(std::vector<byte>& buffer, uint32_t val) { 169 static void AppendUint32v(std::vector<byte>& buffer, uint32_t val) {
160 while (true) { 170 while (true) {
161 uint32_t next = val >> 7; 171 uint32_t next = val >> 7;
162 uint32_t out = val & 0x7f; 172 uint32_t out = val & 0x7f;
163 if (next) { 173 if (next) {
164 buffer.push_back(static_cast<byte>(0x80 | out)); 174 buffer.push_back(static_cast<byte>(0x80 | out));
(...skipping 20 matching lines...) Expand all
185 const byte globals[] = {U32V_5(size), WASM_SECTION_GLOBALS}; 195 const byte globals[] = {U32V_5(size), WASM_SECTION_GLOBALS};
186 for (size_t g = 0; g != sizeof(globals); ++g) { 196 for (size_t g = 0; g != sizeof(globals); ++g) {
187 buffer.push_back(globals[g]); 197 buffer.push_back(globals[g]);
188 } 198 }
189 AppendUint32v(buffer, i); // Number of globals. 199 AppendUint32v(buffer, i); // Number of globals.
190 for (uint32_t j = 0; j < i; j++) { 200 for (uint32_t j = 0; j < i; j++) {
191 buffer.insert(buffer.end(), data, data + sizeof(data)); 201 buffer.insert(buffer.end(), data, data + sizeof(data));
192 } 202 }
193 203
194 ModuleResult result = DecodeModule(&buffer[0], &buffer[0] + buffer.size()); 204 ModuleResult result = DecodeModule(&buffer[0], &buffer[0] + buffer.size());
195 EXPECT_TRUE(result.ok()); 205 EXPECT_OK(result);
196 if (result.val) delete result.val; 206 if (result.val) delete result.val;
197 } 207 }
198 } 208 }
199 209
200 TEST_F(WasmModuleVerifyTest, GlobalWithInvalidNameOffset) { 210 TEST_F(WasmModuleVerifyTest, GlobalWithInvalidNameOffset) {
201 static const byte data[] = { 211 static const byte data[] = {
202 SECTION(GLOBALS, 7), 212 SECTION(GLOBALS, 7),
203 1, // declare one global 213 1, // declare one global
204 NO_NAME, // name offset 214 NO_NAME, // name offset
205 33, // memory type 215 33, // memory type
(...skipping 11 matching lines...) Expand all
217 33, // memory type 227 33, // memory type
218 0, // exported 228 0, // exported
219 }; 229 };
220 230
221 EXPECT_FAILURE(data); 231 EXPECT_FAILURE(data);
222 } 232 }
223 233
224 234
225 TEST_F(WasmModuleVerifyTest, TwoGlobals) { 235 TEST_F(WasmModuleVerifyTest, TwoGlobals) {
226 static const byte data[] = { 236 static const byte data[] = {
227 SECTION(GLOBALS, 13), 237 SECTION(GLOBALS, 7),
228 2, 238 2,
229 NO_NAME, // #0: name length 239 NO_NAME, // #0: name length
230 kMemF32, // memory type 240 kMemF32, // memory type
231 0, // exported 241 0, // exported
232 NO_NAME, // #1: name length 242 NO_NAME, // #1: name length
233 kMemF64, // memory type 243 kMemF64, // memory type
234 1, // exported 244 1, // exported
235 }; 245 };
236 246
237 { 247 {
238 // Should decode to exactly two globals. 248 // Should decode to exactly two globals.
239 ModuleResult result = DecodeModule(data, data + arraysize(data)); 249 ModuleResult result = DecodeModule(data, data + arraysize(data));
240 EXPECT_TRUE(result.ok()); 250 EXPECT_OK(result);
241 EXPECT_EQ(2, result.val->globals.size()); 251 EXPECT_EQ(2, result.val->globals.size());
242 EXPECT_EQ(0, result.val->functions.size()); 252 EXPECT_EQ(0, result.val->functions.size());
243 EXPECT_EQ(0, result.val->data_segments.size()); 253 EXPECT_EQ(0, result.val->data_segments.size());
244 254
245 WasmGlobal* g0 = &result.val->globals[0]; 255 WasmGlobal* g0 = &result.val->globals[0];
246 WasmGlobal* g1 = &result.val->globals[1]; 256 WasmGlobal* g1 = &result.val->globals[1];
247 257
248 EXPECT_EQ(0, g0->name_length); 258 EXPECT_EQ(0, g0->name_length);
249 EXPECT_EQ(MachineType::Float32(), g0->type); 259 EXPECT_EQ(MachineType::Float32(), g0->type);
250 EXPECT_EQ(0, g0->offset); 260 EXPECT_EQ(0, g0->offset);
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
286 1, 296 1,
287 kLocalI32, 297 kLocalI32,
288 kLocalF32, // f32 -> i32 298 kLocalF32, // f32 -> i32
289 2, 299 2,
290 kLocalI32, 300 kLocalI32,
291 kLocalF64, 301 kLocalF64,
292 kLocalF64, // (f64,f64) -> i32 302 kLocalF64, // (f64,f64) -> i32
293 }; 303 };
294 304
295 ModuleResult result = DecodeModule(data, data + arraysize(data)); 305 ModuleResult result = DecodeModule(data, data + arraysize(data));
296 EXPECT_TRUE(result.ok()); 306 EXPECT_OK(result);
297 EXPECT_EQ(3, result.val->signatures.size()); 307 EXPECT_EQ(3, result.val->signatures.size());
298 if (result.val->signatures.size() == 3) { 308 if (result.val->signatures.size() == 3) {
299 EXPECT_EQ(0, result.val->signatures[0]->return_count()); 309 EXPECT_EQ(0, result.val->signatures[0]->return_count());
300 EXPECT_EQ(1, result.val->signatures[1]->return_count()); 310 EXPECT_EQ(1, result.val->signatures[1]->return_count());
301 EXPECT_EQ(1, result.val->signatures[2]->return_count()); 311 EXPECT_EQ(1, result.val->signatures[2]->return_count());
302 312
303 EXPECT_EQ(0, result.val->signatures[0]->parameter_count()); 313 EXPECT_EQ(0, result.val->signatures[0]->parameter_count());
304 EXPECT_EQ(1, result.val->signatures[1]->parameter_count()); 314 EXPECT_EQ(1, result.val->signatures[1]->parameter_count());
305 EXPECT_EQ(2, result.val->signatures[2]->parameter_count()); 315 EXPECT_EQ(2, result.val->signatures[2]->parameter_count());
306 } 316 }
(...skipping 27 matching lines...) Expand all
334 344
335 TEST_F(WasmModuleVerifyTest, OneEmptyVoidVoidFunction) { 345 TEST_F(WasmModuleVerifyTest, OneEmptyVoidVoidFunction) {
336 const int kCodeStartOffset = 51; 346 const int kCodeStartOffset = 51;
337 const int kCodeEndOffset = kCodeStartOffset + 1; 347 const int kCodeEndOffset = kCodeStartOffset + 1;
338 348
339 static const byte data[] = { 349 static const byte data[] = {
340 SECTION(SIGNATURES, 1 + VOID_VOID_SIG_SIZE), 1, 350 SECTION(SIGNATURES, 1 + VOID_VOID_SIG_SIZE), 1,
341 // sig#0 ------------------------------------------------------- 351 // sig#0 -------------------------------------------------------
342 VOID_VOID_SIG, 352 VOID_VOID_SIG,
343 // func#0 ------------------------------------------------------ 353 // func#0 ------------------------------------------------------
344 SECTION(FUNCTIONS, 19), 1, 354 SECTION(FUNCTIONS, 18), 1,
345 kDeclFunctionLocals | kDeclFunctionExport | kDeclFunctionName, 355 kDeclFunctionLocals | kDeclFunctionExport | kDeclFunctionName,
346 SIG_INDEX(0), // signature index 356 SIG_INDEX(0), // signature index
347 NAME_LENGTH(2), 'h', 'i', // name 357 NAME_LENGTH(2), 'h', 'i', // name
348 U16_LE(1466), // local int32 count 358 U16_LE(1466), // local int32 count
349 U16_LE(1355), // local int64 count 359 U16_LE(1355), // local int64 count
350 U16_LE(1244), // local float32 count 360 U16_LE(1244), // local float32 count
351 U16_LE(1133), // local float64 count 361 U16_LE(1133), // local float64 count
352 1, 0, // size 362 1, 0, // size
353 kExprNop, 363 kExprNop,
354 }; 364 };
355 365
356 { 366 {
357 // Should decode to exactly one function. 367 // Should decode to exactly one function.
358 ModuleResult result = DecodeModule(data, data + arraysize(data)); 368 ModuleResult result = DecodeModule(data, data + arraysize(data));
359 EXPECT_TRUE(result.ok()); 369 EXPECT_OK(result);
360 EXPECT_EQ(0, result.val->globals.size()); 370 EXPECT_EQ(0, result.val->globals.size());
361 EXPECT_EQ(1, result.val->signatures.size()); 371 EXPECT_EQ(1, result.val->signatures.size());
362 EXPECT_EQ(1, result.val->functions.size()); 372 EXPECT_EQ(1, result.val->functions.size());
363 EXPECT_EQ(0, result.val->data_segments.size()); 373 EXPECT_EQ(0, result.val->data_segments.size());
364 EXPECT_EQ(0, result.val->function_table.size()); 374 EXPECT_EQ(0, result.val->function_table.size());
365 375
366 WasmFunction* function = &result.val->functions.back(); 376 WasmFunction* function = &result.val->functions.back();
367 377
368 EXPECT_EQ(39, function->name_offset); 378 EXPECT_EQ(39, function->name_offset);
369 EXPECT_EQ(2, function->name_length); 379 EXPECT_EQ(2, function->name_length);
(...skipping 10 matching lines...) Expand all
380 390
381 if (result.val) delete result.val; 391 if (result.val) delete result.val;
382 } 392 }
383 393
384 EXPECT_OFF_END_FAILURE(data, 16, sizeof(data)); 394 EXPECT_OFF_END_FAILURE(data, 16, sizeof(data));
385 } 395 }
386 396
387 397
388 TEST_F(WasmModuleVerifyTest, OneFunctionImported) { 398 TEST_F(WasmModuleVerifyTest, OneFunctionImported) {
389 static const byte data[] = { 399 static const byte data[] = {
390 SECTION(SIGNATURES, VOID_VOID_SIG_SIZE), 1, 400 // signatures
401 SECTION(SIGNATURES, 1 + VOID_VOID_SIG_SIZE), 1,
391 // sig#0 ------------------------------------------------------- 402 // sig#0 -------------------------------------------------------
392 VOID_VOID_SIG, SECTION(FUNCTIONS, 6), 1, 403 VOID_VOID_SIG,
404 // functions
405 SECTION(FUNCTIONS, 4), 1,
393 // func#0 ------------------------------------------------------ 406 // func#0 ------------------------------------------------------
394 kDeclFunctionImport, // no name, no locals, imported 407 kDeclFunctionImport, // no name, no locals, imported
395 SIG_INDEX(0), 408 SIG_INDEX(0),
396 }; 409 };
397 410
398 ModuleResult result = DecodeModule(data, data + arraysize(data)); 411 ModuleResult result = DecodeModule(data, data + arraysize(data));
399 EXPECT_TRUE(result.ok()); 412 EXPECT_OK(result);
400 EXPECT_EQ(1, result.val->functions.size()); 413 EXPECT_EQ(1, result.val->functions.size());
401 WasmFunction* function = &result.val->functions.back(); 414 WasmFunction* function = &result.val->functions.back();
402 415
403 EXPECT_EQ(0, function->name_length); 416 EXPECT_EQ(0, function->name_length);
404 EXPECT_EQ(0, function->code_start_offset); 417 EXPECT_EQ(0, function->code_start_offset);
405 EXPECT_EQ(0, function->code_end_offset); 418 EXPECT_EQ(0, function->code_end_offset);
406 419
407 EXPECT_EQ(0, function->local_i32_count); 420 EXPECT_EQ(0, function->local_i32_count);
408 EXPECT_EQ(0, function->local_i64_count); 421 EXPECT_EQ(0, function->local_i64_count);
409 EXPECT_EQ(0, function->local_f32_count); 422 EXPECT_EQ(0, function->local_f32_count);
(...skipping 15 matching lines...) Expand all
425 0, 0, // void -> void 438 0, 0, // void -> void
426 SECTION(FUNCTIONS, 7), 1, 439 SECTION(FUNCTIONS, 7), 1,
427 // func#0 ------------------------------------------------------ 440 // func#0 ------------------------------------------------------
428 0, // no name, no locals 441 0, // no name, no locals
429 0, 0, // signature index 442 0, 0, // signature index
430 1, 0, // body size 443 1, 0, // body size
431 kExprNop // body 444 kExprNop // body
432 }; 445 };
433 446
434 ModuleResult result = DecodeModule(data, data + arraysize(data)); 447 ModuleResult result = DecodeModule(data, data + arraysize(data));
435 EXPECT_TRUE(result.ok()); 448 EXPECT_OK(result);
436 EXPECT_EQ(1, result.val->functions.size()); 449 EXPECT_EQ(1, result.val->functions.size());
437 WasmFunction* function = &result.val->functions.back(); 450 WasmFunction* function = &result.val->functions.back();
438 451
439 EXPECT_EQ(0, function->name_length); 452 EXPECT_EQ(0, function->name_length);
440 EXPECT_EQ(kCodeStartOffset, function->code_start_offset); 453 EXPECT_EQ(kCodeStartOffset, function->code_start_offset);
441 EXPECT_EQ(kCodeEndOffset, function->code_end_offset); 454 EXPECT_EQ(kCodeEndOffset, function->code_end_offset);
442 455
443 EXPECT_EQ(0, function->local_i32_count); 456 EXPECT_EQ(0, function->local_i32_count);
444 EXPECT_EQ(0, function->local_i64_count); 457 EXPECT_EQ(0, function->local_i64_count);
445 EXPECT_EQ(0, function->local_f32_count); 458 EXPECT_EQ(0, function->local_f32_count);
(...skipping 19 matching lines...) Expand all
465 kDeclFunctionLocals, 0, 0, // signature index 478 kDeclFunctionLocals, 0, 0, // signature index
466 1, 2, // local int32 count 479 1, 2, // local int32 count
467 3, 4, // local int64 count 480 3, 4, // local int64 count
468 5, 6, // local float32 count 481 5, 6, // local float32 count
469 7, 8, // local float64 count 482 7, 8, // local float64 count
470 1, 0, // body size 483 1, 0, // body size
471 kExprNop // body 484 kExprNop // body
472 }; 485 };
473 486
474 ModuleResult result = DecodeModule(data, data + arraysize(data)); 487 ModuleResult result = DecodeModule(data, data + arraysize(data));
475 EXPECT_TRUE(result.ok()); 488 EXPECT_OK(result);
476 EXPECT_EQ(1, result.val->functions.size()); 489 EXPECT_EQ(1, result.val->functions.size());
477 WasmFunction* function = &result.val->functions.back(); 490 WasmFunction* function = &result.val->functions.back();
478 491
479 EXPECT_EQ(0, function->name_length); 492 EXPECT_EQ(0, function->name_length);
480 EXPECT_EQ(kCodeStartOffset, function->code_start_offset); 493 EXPECT_EQ(kCodeStartOffset, function->code_start_offset);
481 EXPECT_EQ(kCodeEndOffset, function->code_end_offset); 494 EXPECT_EQ(kCodeEndOffset, function->code_end_offset);
482 495
483 EXPECT_EQ(513, function->local_i32_count); 496 EXPECT_EQ(513, function->local_i32_count);
484 EXPECT_EQ(1027, function->local_i64_count); 497 EXPECT_EQ(1027, function->local_i64_count);
485 EXPECT_EQ(1541, function->local_f32_count); 498 EXPECT_EQ(1541, function->local_f32_count);
486 EXPECT_EQ(2055, function->local_f64_count); 499 EXPECT_EQ(2055, function->local_f64_count);
487 500
488 EXPECT_FALSE(function->exported); 501 EXPECT_FALSE(function->exported);
489 EXPECT_FALSE(function->external); 502 EXPECT_FALSE(function->external);
490 503
491 if (result.val) delete result.val; 504 if (result.val) delete result.val;
492 } 505 }
493 506
494 507
495 TEST_F(WasmModuleVerifyTest, OneGlobalOneFunctionWithNopBodyOneDataSegment) { 508 TEST_F(WasmModuleVerifyTest, OneGlobalOneFunctionWithNopBodyOneDataSegment) {
496 static const byte kCodeStartOffset = 75; 509 static const byte kCodeStartOffset = 64;
497 static const byte kCodeEndOffset = kCodeStartOffset + 3; 510 static const byte kCodeEndOffset = kCodeStartOffset + 3;
498 static const byte kDataSegmentSourceOffset = kCodeEndOffset + 20; 511 static const byte kDataSegmentSourceOffset = kCodeEndOffset + 31;
499 512
500 static const byte data[] = { 513 static const byte data[] = {
501 SECTION(MEMORY, 3), 28, 28, 1,
502 // global#0 -------------------------------------------------- 514 // global#0 --------------------------------------------------
503 SECTION(GLOBALS, 7), 1, 515 SECTION(GLOBALS, 4), 1,
504 0, // name length 516 0, // name length
505 kMemU8, // memory type 517 kMemU8, // memory type
506 0, // exported 518 0, // exported
507 // sig#0 ----------------------------------------------------- 519 // sig#0 -----------------------------------------------------
508 SECTION(SIGNATURES, 3), 1, 0, 0, // void -> void 520 SECTION(SIGNATURES, 3), 1, 0, 0, // void -> void
509 // func#0 ---------------------------------------------------- 521 // func#0 ----------------------------------------------------
510 SECTION(FUNCTIONS, 20), 1, kDeclFunctionLocals | kDeclFunctionName, 0, 522 SECTION(FUNCTIONS, 20), 1,
511 0, // signature index 523 kDeclFunctionLocals | kDeclFunctionName, // --
512 2, 'h', 'i', // name 524 SIG_INDEX(0), // signature index
513 1, 2, // local int32 count 525 2, 'h', 'i', // name
514 3, 4, // local int64 count 526 1, 2, // local int32 count
515 5, 6, // local float32 count 527 3, 4, // local int64 count
516 7, 8, // local float64 count 528 5, 6, // local float32 count
517 3, 0, // body size 529 7, 8, // local float64 count
518 kExprNop, // func#0 body 530 3, 0, // body size
519 kExprNop, // func#0 body 531 kExprNop, // func#0 body
520 kExprNop, // func#0 body 532 kExprNop, // func#0 body
533 kExprNop, // func#0 body
534 // memory section --------------------------------------------
535 SECTION(MEMORY, 3), 28, 28, 1,
521 // segment#0 ------------------------------------------------- 536 // segment#0 -------------------------------------------------
522 SECTION(DATA_SEGMENTS, 14), 1, 537 SECTION(DATA_SEGMENTS, 10), 1,
523 U32V_3(0x8b3ae), // dest addr 538 U32V_3(0x8b3ae), // dest addr
524 U32V_1(5), // source size 539 U32V_1(5), // source size
525 0, 1, 2, 3, 4, // data bytes 540 0, 1, 2, 3, 4, // data bytes
526 // rest ------------------------------------------------------ 541 // rest ------------------------------------------------------
527 SECTION(END, 0), 542 SECTION(END, 0),
528 }; 543 };
529 544
530 { 545 {
531 ModuleResult result = DecodeModule(data, data + arraysize(data)); 546 ModuleResult result = DecodeModule(data, data + arraysize(data));
532 EXPECT_TRUE(result.ok()); 547 EXPECT_OK(result);
533 EXPECT_EQ(1, result.val->globals.size()); 548 EXPECT_EQ(1, result.val->globals.size());
534 EXPECT_EQ(1, result.val->functions.size()); 549 EXPECT_EQ(1, result.val->functions.size());
535 EXPECT_EQ(1, result.val->data_segments.size()); 550 EXPECT_EQ(1, result.val->data_segments.size());
536 551
537 WasmGlobal* global = &result.val->globals.back(); 552 WasmGlobal* global = &result.val->globals.back();
538 553
539 EXPECT_EQ(0, global->name_length); 554 EXPECT_EQ(0, global->name_length);
540 EXPECT_EQ(MachineType::Uint8(), global->type); 555 EXPECT_EQ(MachineType::Uint8(), global->type);
541 EXPECT_EQ(0, global->offset); 556 EXPECT_EQ(0, global->offset);
542 EXPECT_FALSE(global->exported); 557 EXPECT_FALSE(global->exported);
543 558
544 WasmFunction* function = &result.val->functions.back(); 559 WasmFunction* function = &result.val->functions.back();
545 560
546 EXPECT_EQ(63, function->name_offset); 561 EXPECT_EQ(52, function->name_offset);
547 EXPECT_EQ(2, function->name_length); 562 EXPECT_EQ(2, function->name_length);
548 EXPECT_EQ(kCodeStartOffset, function->code_start_offset); 563 EXPECT_EQ(kCodeStartOffset, function->code_start_offset);
549 EXPECT_EQ(kCodeEndOffset, function->code_end_offset); 564 EXPECT_EQ(kCodeEndOffset, function->code_end_offset);
550 565
551 EXPECT_FALSE(function->exported); 566 EXPECT_FALSE(function->exported);
552 EXPECT_FALSE(function->external); 567 EXPECT_FALSE(function->external);
553 568
554 WasmDataSegment* segment = &result.val->data_segments.back(); 569 WasmDataSegment* segment = &result.val->data_segments.back();
555 570
556 EXPECT_EQ(0x8b3ae, segment->dest_addr); 571 EXPECT_EQ(0x8b3ae, segment->dest_addr);
(...skipping 18 matching lines...) Expand all
575 U32V_3(0x9bbaa), // dest addr 590 U32V_3(0x9bbaa), // dest addr
576 U32V_1(3), // source size 591 U32V_1(3), // source size
577 'a', 592 'a',
578 'b', 593 'b',
579 'c' // data bytes 594 'c' // data bytes
580 }; 595 };
581 596
582 { 597 {
583 EXPECT_VERIFIES(data); 598 EXPECT_VERIFIES(data);
584 ModuleResult result = DecodeModule(data, data + arraysize(data)); 599 ModuleResult result = DecodeModule(data, data + arraysize(data));
585 EXPECT_TRUE(result.ok()); 600 EXPECT_OK(result);
586 EXPECT_EQ(0, result.val->globals.size()); 601 EXPECT_EQ(0, result.val->globals.size());
587 EXPECT_EQ(0, result.val->functions.size()); 602 EXPECT_EQ(0, result.val->functions.size());
588 EXPECT_EQ(1, result.val->data_segments.size()); 603 EXPECT_EQ(1, result.val->data_segments.size());
589 604
590 WasmDataSegment* segment = &result.val->data_segments.back(); 605 WasmDataSegment* segment = &result.val->data_segments.back();
591 606
592 EXPECT_EQ(0x9bbaa, segment->dest_addr); 607 EXPECT_EQ(0x9bbaa, segment->dest_addr);
593 EXPECT_EQ(kDataSegmentSourceOffset, segment->source_offset); 608 EXPECT_EQ(kDataSegmentSourceOffset, segment->source_offset);
594 EXPECT_EQ(3, segment->source_size); 609 EXPECT_EQ(3, segment->source_size);
595 EXPECT_TRUE(segment->init); 610 EXPECT_TRUE(segment->init);
596 611
597 if (result.val) delete result.val; 612 if (result.val) delete result.val;
598 } 613 }
599 614
600 EXPECT_OFF_END_FAILURE(data, 13, sizeof(data)); 615 EXPECT_OFF_END_FAILURE(data, 13, sizeof(data));
601 } 616 }
602 617
603 618
604 TEST_F(WasmModuleVerifyTest, TwoDataSegments) { 619 TEST_F(WasmModuleVerifyTest, TwoDataSegments) {
605 const byte kDataSegment0SourceOffset = 39; 620 const byte kDataSegment0SourceOffset = 39;
606 const byte kDataSegment1SourceOffset = 39 + 8; 621 const byte kDataSegment1SourceOffset = 39 + 8;
607 622
608 const byte data[] = { 623 const byte data[] = {
609 SECTION(MEMORY, 3), 624 SECTION(MEMORY, 3),
610 28, 625 28,
611 28, 626 28,
612 1, 627 1,
613 SECTION(DATA_SEGMENTS, 31), 628 SECTION(DATA_SEGMENTS, 23),
614 2, // segment count 629 2, // segment count
615 U32V_3(0x7ffee), // #0: dest addr 630 U32V_3(0x7ffee), // #0: dest addr
616 U32V_1(4), // source size 631 U32V_1(4), // source size
617 1, 632 1,
618 2, 633 2,
619 3, 634 3,
620 4, // data bytes 635 4, // data bytes
621 U32V_3(0x6ddcc), // #1: dest addr 636 U32V_3(0x6ddcc), // #1: dest addr
622 U32V_1(10), // source size 637 U32V_1(10), // source size
623 1, 638 1,
624 2, 639 2,
625 3, 640 3,
626 4, 641 4,
627 5, 642 5,
628 6, 643 6,
629 7, 644 7,
630 8, 645 8,
631 9, 646 9,
632 10 // data bytes 647 10 // data bytes
633 }; 648 };
634 649
635 { 650 {
636 ModuleResult result = DecodeModule(data, data + arraysize(data)); 651 ModuleResult result = DecodeModule(data, data + arraysize(data));
637 EXPECT_TRUE(result.ok()); 652 EXPECT_OK(result);
638 EXPECT_EQ(0, result.val->globals.size()); 653 EXPECT_EQ(0, result.val->globals.size());
639 EXPECT_EQ(0, result.val->functions.size()); 654 EXPECT_EQ(0, result.val->functions.size());
640 EXPECT_EQ(2, result.val->data_segments.size()); 655 EXPECT_EQ(2, result.val->data_segments.size());
641 656
642 WasmDataSegment* s0 = &result.val->data_segments[0]; 657 WasmDataSegment* s0 = &result.val->data_segments[0];
643 WasmDataSegment* s1 = &result.val->data_segments[1]; 658 WasmDataSegment* s1 = &result.val->data_segments[1];
644 659
645 EXPECT_EQ(0x7ffee, s0->dest_addr); 660 EXPECT_EQ(0x7ffee, s0->dest_addr);
646 EXPECT_EQ(kDataSegment0SourceOffset, s0->source_offset); 661 EXPECT_EQ(kDataSegment0SourceOffset, s0->source_offset);
647 EXPECT_EQ(4, s0->source_size); 662 EXPECT_EQ(4, s0->source_size);
(...skipping 15 matching lines...) Expand all
663 678
664 for (byte mem_pages = 1; mem_pages < 16; mem_pages++) { 679 for (byte mem_pages = 1; mem_pages < 16; mem_pages++) {
665 int mem_size = mem_pages * 0x10000; // 64k pages. 680 int mem_size = mem_pages * 0x10000; // 64k pages.
666 681
667 for (int dest_addr = mem_size - source_size; 682 for (int dest_addr = mem_size - source_size;
668 dest_addr < mem_size + source_size; dest_addr++) { 683 dest_addr < mem_size + source_size; dest_addr++) {
669 byte data[] = {SECTION(MEMORY, 3), 684 byte data[] = {SECTION(MEMORY, 3),
670 mem_pages, 685 mem_pages,
671 mem_pages, 686 mem_pages,
672 1, 687 1,
673 SECTION(DATA_SEGMENTS, 14), 688 SECTION(DATA_SEGMENTS, 8),
674 1, 689 1,
675 U32V_3(dest_addr), 690 U32V_3(dest_addr),
676 U32V_1(source_size), 691 U32V_1(source_size),
677 'a', 692 'a',
678 'b', 693 'b',
679 'c'}; 694 'c'};
680 695
681 if (dest_addr <= (mem_size - source_size)) { 696 if (dest_addr <= (mem_size - source_size)) {
682 EXPECT_VERIFIES(data); 697 EXPECT_VERIFIES(data);
683 } else { 698 } else {
(...skipping 10 matching lines...) Expand all
694 TEST_F(WasmModuleVerifyTest, OneIndirectFunction) { 709 TEST_F(WasmModuleVerifyTest, OneIndirectFunction) {
695 static const byte data[] = { 710 static const byte data[] = {
696 // sig#0 ------------------------------------------------------- 711 // sig#0 -------------------------------------------------------
697 SECTION(SIGNATURES, 3), 1, 0, 0, // void -> void 712 SECTION(SIGNATURES, 3), 1, 0, 0, // void -> void
698 // func#0 ------------------------------------------------------ 713 // func#0 ------------------------------------------------------
699 SECTION(FUNCTIONS, 4), 1, FUNCTION(0, 0), 714 SECTION(FUNCTIONS, 4), 1, FUNCTION(0, 0),
700 // indirect table ---------------------------------------------- 715 // indirect table ----------------------------------------------
701 SECTION(FUNCTION_TABLE, 2), 1, U32V_1(0)}; 716 SECTION(FUNCTION_TABLE, 2), 1, U32V_1(0)};
702 717
703 ModuleResult result = DecodeModule(data, data + arraysize(data)); 718 ModuleResult result = DecodeModule(data, data + arraysize(data));
704 EXPECT_TRUE(result.ok()); 719 EXPECT_OK(result);
705 if (result.ok()) { 720 if (result.ok()) {
706 EXPECT_EQ(1, result.val->signatures.size()); 721 EXPECT_EQ(1, result.val->signatures.size());
707 EXPECT_EQ(1, result.val->functions.size()); 722 EXPECT_EQ(1, result.val->functions.size());
708 EXPECT_EQ(1, result.val->function_table.size()); 723 EXPECT_EQ(1, result.val->function_table.size());
709 EXPECT_EQ(0, result.val->function_table[0]); 724 EXPECT_EQ(0, result.val->function_table[0]);
710 } 725 }
711 if (result.val) delete result.val; 726 if (result.val) delete result.val;
712 } 727 }
713 728
714 729
(...skipping 13 matching lines...) Expand all
728 U32V_1(1), // -- 743 U32V_1(1), // --
729 U32V_1(2), // -- 744 U32V_1(2), // --
730 U32V_1(3), // -- 745 U32V_1(3), // --
731 U32V_1(0), // -- 746 U32V_1(0), // --
732 U32V_1(1), // -- 747 U32V_1(1), // --
733 U32V_1(2), // -- 748 U32V_1(2), // --
734 U32V_1(3), // -- 749 U32V_1(3), // --
735 }; 750 };
736 751
737 ModuleResult result = DecodeModule(data, data + arraysize(data)); 752 ModuleResult result = DecodeModule(data, data + arraysize(data));
738 EXPECT_TRUE(result.ok()); 753 EXPECT_OK(result);
739 if (result.ok()) { 754 if (result.ok()) {
740 EXPECT_EQ(2, result.val->signatures.size()); 755 EXPECT_EQ(2, result.val->signatures.size());
741 EXPECT_EQ(4, result.val->functions.size()); 756 EXPECT_EQ(4, result.val->functions.size());
742 EXPECT_EQ(8, result.val->function_table.size()); 757 EXPECT_EQ(8, result.val->function_table.size());
743 for (int i = 0; i < 8; i++) { 758 for (int i = 0; i < 8; i++) {
744 EXPECT_EQ(i & 3, result.val->function_table[i]); 759 EXPECT_EQ(i & 3, result.val->function_table[i]);
745 } 760 }
746 } 761 }
747 if (result.val) delete result.val; 762 if (result.val) delete result.val;
748 } 763 }
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
909 4, // locals 924 4, // locals
910 3, kLocalI32, // -- 925 3, kLocalI32, // --
911 4, kLocalI64, // -- 926 4, kLocalI64, // --
912 5, kLocalF32, // -- 927 5, kLocalF32, // --
913 6, kLocalF64, // -- 928 6, kLocalF64, // --
914 kExprNop // body 929 kExprNop // body
915 }; 930 };
916 931
917 FunctionResult result = DecodeWasmFunction(isolate(), zone(), nullptr, data, 932 FunctionResult result = DecodeWasmFunction(isolate(), zone(), nullptr, data,
918 data + arraysize(data)); 933 data + arraysize(data));
919 EXPECT_TRUE(result.ok()); 934 EXPECT_OK(result);
920 935
921 if (result.val && result.ok()) { 936 if (result.val && result.ok()) {
922 WasmFunction* function = result.val; 937 WasmFunction* function = result.val;
923 EXPECT_EQ(0, function->sig->parameter_count()); 938 EXPECT_EQ(0, function->sig->parameter_count());
924 EXPECT_EQ(0, function->sig->return_count()); 939 EXPECT_EQ(0, function->sig->return_count());
925 EXPECT_EQ(0, function->name_offset); 940 EXPECT_EQ(0, function->name_offset);
926 EXPECT_EQ(2, function->code_start_offset); 941 EXPECT_EQ(2, function->code_start_offset);
927 EXPECT_EQ(arraysize(data), function->code_end_offset); 942 EXPECT_EQ(arraysize(data), function->code_end_offset);
928 // TODO(titzer): verify encoding of local declarations 943 // TODO(titzer): verify encoding of local declarations
929 EXPECT_FALSE(function->external); 944 EXPECT_FALSE(function->external);
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
1024 }; 1039 };
1025 EXPECT_FAILURE(data); 1040 EXPECT_FAILURE(data);
1026 } 1041 }
1027 1042
1028 TEST_F(WasmModuleVerifyTest, UnknownSectionSkipped) { 1043 TEST_F(WasmModuleVerifyTest, UnknownSectionSkipped) {
1029 static const byte data[] = { 1044 static const byte data[] = {
1030 3, // Section size. 1045 3, // Section size.
1031 1, 1046 1,
1032 '\0', // Section name: LEB128 1, string '\0' 1047 '\0', // Section name: LEB128 1, string '\0'
1033 0, // one byte section 1048 0, // one byte section
1034 SECTION(GLOBALS, 7), 1049 SECTION(GLOBALS, 4),
1035 1, 1050 1,
1036 0, // name length 1051 0, // name length
1037 kMemI32, // memory type 1052 kMemI32, // memory type
1038 0, // exported 1053 0, // exported
1039 }; 1054 };
1040 ModuleResult result = DecodeModule(data, data + arraysize(data)); 1055 ModuleResult result = DecodeModule(data, data + arraysize(data));
1041 EXPECT_TRUE(result.ok()); 1056 EXPECT_OK(result);
1042 1057
1043 EXPECT_EQ(1, result.val->globals.size()); 1058 EXPECT_EQ(1, result.val->globals.size());
1044 EXPECT_EQ(0, result.val->functions.size()); 1059 EXPECT_EQ(0, result.val->functions.size());
1045 EXPECT_EQ(0, result.val->data_segments.size()); 1060 EXPECT_EQ(0, result.val->data_segments.size());
1046 1061
1047 WasmGlobal* global = &result.val->globals.back(); 1062 WasmGlobal* global = &result.val->globals.back();
1048 1063
1049 EXPECT_EQ(0, global->name_length); 1064 EXPECT_EQ(0, global->name_length);
1050 EXPECT_EQ(MachineType::Int32(), global->type); 1065 EXPECT_EQ(MachineType::Int32(), global->type);
1051 EXPECT_EQ(0, global->offset); 1066 EXPECT_EQ(0, global->offset);
1052 EXPECT_FALSE(global->exported); 1067 EXPECT_FALSE(global->exported);
1053 1068
1054 if (result.val) delete result.val; 1069 if (result.val) delete result.val;
1055 } 1070 }
1056 1071
1057 TEST_F(WasmModuleVerifyTest, ImportTable_empty) { 1072 TEST_F(WasmModuleVerifyTest, ImportTable_empty) {
1058 static const byte data[] = {SECTION(SIGNATURES, 1), 0, 1073 static const byte data[] = {SECTION(SIGNATURES, 1), 0,
1059 SECTION(IMPORT_TABLE, 1), 0}; 1074 SECTION(IMPORT_TABLE, 1), 0};
1060 EXPECT_VERIFIES(data); 1075 EXPECT_VERIFIES(data);
1061 } 1076 }
1062 1077
1063 TEST_F(WasmModuleVerifyTest, ImportTable_nosigs) { 1078 TEST_F(WasmModuleVerifyTest, ImportTable_nosigs1) {
1064 static const byte data[] = {SECTION(IMPORT_TABLE, 1), 0}; 1079 static const byte data[] = {SECTION(IMPORT_TABLE, 1), 0};
1080 EXPECT_VERIFIES(data);
1081 }
1082
1083 TEST_F(WasmModuleVerifyTest, ImportTable_nosigs2) {
1084 static const byte data[] = {
1085 SECTION(IMPORT_TABLE, 6), 1, // sig table
1086 IMPORT_SIG_INDEX(0), // sig index
1087 NAME_LENGTH(1), 'm', // module name
1088 NAME_LENGTH(1), 'f', // function name
1089 };
1065 EXPECT_FAILURE(data); 1090 EXPECT_FAILURE(data);
1066 } 1091 }
1067 1092
1068 TEST_F(WasmModuleVerifyTest, ImportTable_invalid_sig) { 1093 TEST_F(WasmModuleVerifyTest, ImportTable_invalid_sig) {
1069 static const byte data[] = { 1094 static const byte data[] = {
1070 SECTION(SIGNATURES, 1), 0, SECTION(IMPORT_TABLE, 6), 1, 1095 SECTION(SIGNATURES, 1), 0, SECTION(IMPORT_TABLE, 6), 1,
1071 IMPORT_SIG_INDEX(0), // sig index 1096 IMPORT_SIG_INDEX(0), // sig index
1072 NAME_LENGTH(1), 'm', // module name 1097 NAME_LENGTH(1), 'm', // module name
1073 NAME_LENGTH(1), 'f', // function name 1098 NAME_LENGTH(1), 'f', // function name
1074 }; 1099 };
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
1155 } 1180 }
1156 1181
1157 TEST_F(WasmModuleVerifyTest, ExportTableOne) { 1182 TEST_F(WasmModuleVerifyTest, ExportTableOne) {
1158 static const byte data[] = { 1183 static const byte data[] = {
1159 SECTION(SIGNATURES, 1 + VOID_VOID_SIG_SIZE), 1184 SECTION(SIGNATURES, 1 + VOID_VOID_SIG_SIZE),
1160 1, // sigs 1185 1, // sigs
1161 VOID_VOID_SIG, // -- 1186 VOID_VOID_SIG, // --
1162 SECTION(FUNCTIONS, 1 + EMPTY_FUNCTION_SIZE), 1187 SECTION(FUNCTIONS, 1 + EMPTY_FUNCTION_SIZE),
1163 1, // functions 1188 1, // functions
1164 EMPTY_FUNCTION(0), // -- 1189 EMPTY_FUNCTION(0), // --
1165 SECTION(EXPORT_TABLE, 7), 1190 SECTION(EXPORT_TABLE, 3),
1166 1, // exports 1191 1, // exports
1167 FUNC_INDEX(0), // -- 1192 FUNC_INDEX(0), // --
1168 NO_NAME // -- 1193 NO_NAME // --
1169 }; 1194 };
1170 EXPECT_VERIFIES(data); 1195 EXPECT_VERIFIES(data);
1171 } 1196 }
1172 1197
1173 TEST_F(WasmModuleVerifyTest, ExportTableTwo) { 1198 TEST_F(WasmModuleVerifyTest, ExportTableTwo) {
1174 static const byte data[] = { 1199 static const byte data[] = {
1175 SECTION(SIGNATURES, 1 + VOID_VOID_SIG_SIZE), 1200 SECTION(SIGNATURES, 1 + VOID_VOID_SIG_SIZE),
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
1262 }; 1287 };
1263 1288
1264 for (int length = 33; length < sizeof(data); length++) { 1289 for (int length = 33; length < sizeof(data); length++) {
1265 ModuleResult result = DecodeModule(data, data + length); 1290 ModuleResult result = DecodeModule(data, data + length);
1266 EXPECT_FALSE(result.ok()); 1291 EXPECT_FALSE(result.ok());
1267 if (result.val) delete result.val; 1292 if (result.val) delete result.val;
1268 } 1293 }
1269 } 1294 }
1270 1295
1271 #define SIGNATURES_SECTION(count, ...) \ 1296 #define SIGNATURES_SECTION(count, ...) \
1272 SECTION(SIGNATURES, 1 + 3 * (count)), U32V_1(count), __VA_ARGS__ 1297 SECTION(SIGNATURES, 1 + 2 * (count)), U32V_1(count), __VA_ARGS__
1273 #define FUNCTION_SIGNATURES_SECTION(count, ...) \ 1298 #define FUNCTION_SIGNATURES_SECTION(count, ...) \
1274 SECTION(FUNCTION_SIGNATURES, 1 + (count)), U32V_1(count), __VA_ARGS__ 1299 SECTION(FUNCTION_SIGNATURES, 1 + (count)), U32V_1(count), __VA_ARGS__
1275 1300
1276 #define FOO_STRING 3, 'f', 'o', 'o' 1301 #define FOO_STRING 3, 'f', 'o', 'o'
1277 #define NO_LOCAL_NAMES 0 1302 #define NO_LOCAL_NAMES 0
1278 1303
1279 #define EMPTY_SIGNATURES_SECTION SECTION(SIGNATURES, 1), 0 1304 #define EMPTY_SIGNATURES_SECTION SECTION(SIGNATURES, 1), 0
1280 #define EMPTY_FUNCTION_SIGNATURES_SECTION SECTION(FUNCTION_SIGNATURES, 1), 0 1305 #define EMPTY_FUNCTION_SIGNATURES_SECTION SECTION(FUNCTION_SIGNATURES, 1), 0
1281 #define EMPTY_FUNCTION_BODIES_SECTION SECTION(FUNCTION_BODIES, 1), 0 1306 #define EMPTY_FUNCTION_BODIES_SECTION SECTION(FUNCTION_BODIES, 1), 0
1282 #define EMPTY_NAMES_SECTION SECTION(NAMES, 1), 0 1307 #define EMPTY_NAMES_SECTION SECTION(NAMES, 1), 0
1283 1308
1284 TEST_F(WasmModuleVerifyTest, FunctionSignatures_empty) { 1309 TEST_F(WasmModuleVerifyTest, FunctionSignatures_empty) {
1285 static const byte data[] = {SECTION(SIGNATURES, 1), 0, 1310 static const byte data[] = {
1286 SECTION(FUNCTION_SIGNATURES, 1), 0}; 1311 SECTION(SIGNATURES, 1), 0, // --
1312 SECTION(FUNCTION_SIGNATURES, 1), 0 // --
1313 }; // --
1287 EXPECT_VERIFIES(data); 1314 EXPECT_VERIFIES(data);
1288 } 1315 }
1289 1316
1290 TEST_F(WasmModuleVerifyTest, FunctionSignatures_one) { 1317 TEST_F(WasmModuleVerifyTest, FunctionSignatures_one) {
1291 static const byte data[] = {SIGNATURES_SECTION(1, VOID_VOID_SIG), 1318 static const byte data[] = {
1292 FUNCTION_SIGNATURES_SECTION(1, 0)}; 1319 SIGNATURES_SECTION(1, VOID_VOID_SIG), // --
1320 FUNCTION_SIGNATURES_SECTION(1, 0) // --
1321 };
1293 EXPECT_VERIFIES(data); 1322 EXPECT_VERIFIES(data);
1294 } 1323 }
1295 1324
1296 TEST_F(WasmModuleVerifyTest, FunctionBodies_empty) { 1325 TEST_F(WasmModuleVerifyTest, FunctionBodies_empty) {
1297 static const byte data[] = {EMPTY_SIGNATURES_SECTION, 1326 static const byte data[] = {
1298 EMPTY_FUNCTION_SIGNATURES_SECTION, 1327 EMPTY_SIGNATURES_SECTION, // --
1299 EMPTY_FUNCTION_BODIES_SECTION}; 1328 EMPTY_FUNCTION_SIGNATURES_SECTION, // --
1329 EMPTY_FUNCTION_BODIES_SECTION // --
1330 };
1300 EXPECT_VERIFIES(data); 1331 EXPECT_VERIFIES(data);
1301 } 1332 }
1302 1333
1303 TEST_F(WasmModuleVerifyTest, FunctionBodies_one_empty) { 1334 TEST_F(WasmModuleVerifyTest, FunctionBodies_one_empty) {
1304 static const byte data[] = { 1335 static const byte data[] = {
1305 SIGNATURES_SECTION(1, VOID_VOID_SIG), FUNCTION_SIGNATURES_SECTION(1, 0), 1336 SIGNATURES_SECTION(1, VOID_VOID_SIG), // --
1306 SECTION(FUNCTION_BODIES, 1 + EMPTY_BODY_SIZE), 1, EMPTY_BODY}; 1337 FUNCTION_SIGNATURES_SECTION(1, 0), // --
1338 SECTION(FUNCTION_BODIES, 1 + EMPTY_BODY_SIZE), 1, EMPTY_BODY // --
1339 };
1307 EXPECT_VERIFIES(data); 1340 EXPECT_VERIFIES(data);
1308 } 1341 }
1309 1342
1310 TEST_F(WasmModuleVerifyTest, FunctionBodies_one_nop) { 1343 TEST_F(WasmModuleVerifyTest, FunctionBodies_one_nop) {
1311 static const byte data[] = { 1344 static const byte data[] = {
1312 SIGNATURES_SECTION(1, VOID_VOID_SIG), FUNCTION_SIGNATURES_SECTION(1, 0), 1345 SIGNATURES_SECTION(1, VOID_VOID_SIG), // --
1313 SECTION(FUNCTION_BODIES, 1 + NOP_BODY_SIZE), 1, NOP_BODY}; 1346 FUNCTION_SIGNATURES_SECTION(1, 0), // --
1347 SECTION(FUNCTION_BODIES, 1 + NOP_BODY_SIZE), 1, NOP_BODY // --
1348 };
1314 EXPECT_VERIFIES(data); 1349 EXPECT_VERIFIES(data);
1315 } 1350 }
1316 1351
1317 TEST_F(WasmModuleVerifyTest, FunctionBodies_count_mismatch1) { 1352 TEST_F(WasmModuleVerifyTest, FunctionBodies_count_mismatch1) {
1318 static const byte data[] = {SIGNATURES_SECTION(1, VOID_VOID_SIG), 1353 static const byte data[] = {
1319 FUNCTION_SIGNATURES_SECTION(2, 0, 0), 1354 SIGNATURES_SECTION(1, VOID_VOID_SIG), // --
1320 SECTION(FUNCTION_BODIES, 1 + EMPTY_BODY_SIZE), 1, 1355 FUNCTION_SIGNATURES_SECTION(2, 0, 0), // --
1321 EMPTY_BODY}; 1356 SECTION(FUNCTION_BODIES, 1 + EMPTY_BODY_SIZE), 1, // --
1357 EMPTY_BODY // --
1358 };
1322 EXPECT_FAILURE(data); 1359 EXPECT_FAILURE(data);
1323 } 1360 }
1324 1361
1325 TEST_F(WasmModuleVerifyTest, FunctionBodies_count_mismatch2) { 1362 TEST_F(WasmModuleVerifyTest, FunctionBodies_count_mismatch2) {
1326 static const byte data[] = {SIGNATURES_SECTION(1, VOID_VOID_SIG), 1363 static const byte data[] = {
1327 FUNCTION_SIGNATURES_SECTION(1, 0), 1364 SIGNATURES_SECTION(1, VOID_VOID_SIG), // --
1328 SECTION(FUNCTION_BODIES, 1 + 2 * NOP_BODY_SIZE), 1365 FUNCTION_SIGNATURES_SECTION(1, 0), // --
1329 2, 1366 SECTION(FUNCTION_BODIES, 1 + 2 * NOP_BODY_SIZE), // --
1330 NOP_BODY, 1367 2, // --
1331 NOP_BODY}; 1368 NOP_BODY, // --
1369 NOP_BODY // --
1370 };
1332 EXPECT_FAILURE(data); 1371 EXPECT_FAILURE(data);
1333 } 1372 }
1334 1373
1335 TEST_F(WasmModuleVerifyTest, Names_empty) { 1374 TEST_F(WasmModuleVerifyTest, Names_empty) {
1336 static const byte data[] = { 1375 static const byte data[] = {
1337 EMPTY_SIGNATURES_SECTION, EMPTY_FUNCTION_SIGNATURES_SECTION, 1376 EMPTY_SIGNATURES_SECTION, EMPTY_FUNCTION_SIGNATURES_SECTION,
1338 EMPTY_FUNCTION_BODIES_SECTION, EMPTY_NAMES_SECTION}; 1377 EMPTY_FUNCTION_BODIES_SECTION, EMPTY_NAMES_SECTION};
1339 EXPECT_VERIFIES(data); 1378 EXPECT_VERIFIES(data);
1340 } 1379 }
1341 1380
(...skipping 26 matching lines...) Expand all
1368 NO_LOCAL_NAMES, // -- 1407 NO_LOCAL_NAMES, // --
1369 FOO_STRING, 1408 FOO_STRING,
1370 NO_LOCAL_NAMES, // -- 1409 NO_LOCAL_NAMES, // --
1371 }; 1410 };
1372 EXPECT_VERIFIES(data); 1411 EXPECT_VERIFIES(data);
1373 } 1412 }
1374 1413
1375 } // namespace wasm 1414 } // namespace wasm
1376 } // namespace internal 1415 } // namespace internal
1377 } // namespace v8 1416 } // namespace v8
OLDNEW
« src/wasm/wasm-module.cc ('K') | « test/mjsunit/wasm/wasm-module-builder.js ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698