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

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

Issue 2014533003: [wasm] Refactor encoder.h to use a proper buffer and remove OldFunctions section. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 7 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
(...skipping 21 matching lines...) Expand all
32 SECTION(FUNCTION_SIGNATURES, 1 + (count)), U32V_1(count), __VA_ARGS__ 32 SECTION(FUNCTION_SIGNATURES, 1 + (count)), U32V_1(count), __VA_ARGS__
33 33
34 #define FOO_STRING 3, 'f', 'o', 'o' 34 #define FOO_STRING 3, 'f', 'o', 'o'
35 #define NO_LOCAL_NAMES 0 35 #define NO_LOCAL_NAMES 0
36 36
37 #define EMPTY_SIGNATURES_SECTION SECTION(SIGNATURES, 1), 0 37 #define EMPTY_SIGNATURES_SECTION SECTION(SIGNATURES, 1), 0
38 #define EMPTY_FUNCTION_SIGNATURES_SECTION SECTION(FUNCTION_SIGNATURES, 1), 0 38 #define EMPTY_FUNCTION_SIGNATURES_SECTION SECTION(FUNCTION_SIGNATURES, 1), 0
39 #define EMPTY_FUNCTION_BODIES_SECTION SECTION(FUNCTION_BODIES, 1), 0 39 #define EMPTY_FUNCTION_BODIES_SECTION SECTION(FUNCTION_BODIES, 1), 0
40 #define EMPTY_NAMES_SECTION SECTION(NAMES, 1), 0 40 #define EMPTY_NAMES_SECTION SECTION(NAMES, 1), 0
41 41
42 #define X1(...) __VA_ARGS__
43 #define X2(...) __VA_ARGS__, __VA_ARGS__
44 #define X3(...) __VA_ARGS__, __VA_ARGS__, __VA_ARGS__
45 #define X4(...) __VA_ARGS__, __VA_ARGS__, __VA_ARGS__, __VA_ARGS__
46
47 #define ONE_EMPTY_FUNCTION WASM_SECTION_FUNCTION_SIGNATURES, 1 + 1 * 1, 1, X1(0)
48
49 #define TWO_EMPTY_FUNCTIONS \
50 WASM_SECTION_FUNCTION_SIGNATURES, 1 + 2 * 1, 2, X2(0)
51
52 #define THREE_EMPTY_FUNCTIONS \
53 WASM_SECTION_FUNCTION_SIGNATURES, 1 + 3 * 1, 3, X3(0)
54
55 #define FOUR_EMPTY_FUNCTIONS \
56 WASM_SECTION_FUNCTION_SIGNATURES, 1 + 4 * 1, 4, X4(0)
57
58 #define ONE_EMPTY_BODY \
59 WASM_SECTION_FUNCTION_BODIES, 1 + 1 * (1 + SIZEOF_EMPTY_BODY), 1, \
60 X1(SIZEOF_EMPTY_BODY, EMPTY_BODY)
61
62 #define TWO_EMPTY_BODIES \
63 WASM_SECTION_FUNCTION_BODIES, 1 + 2 * (1 + SIZEOF_EMPTY_BODY), 2, \
64 X2(SIZEOF_EMPTY_BODY, EMPTY_BODY)
65
66 #define THREE_EMPTY_BODIES \
67 WASM_SECTION_FUNCTION_BODIES, 1 + 3 * (1 + SIZEOF_EMPTY_BODY), 3, \
68 X3(SIZEOF_EMPTY_BODY, EMPTY_BODY)
69
70 #define FOUR_EMPTY_BODIES \
71 WASM_SECTION_FUNCTION_BODIES, 1 + 4 * (1 + SIZEOF_EMPTY_BODY), 4, \
72 X4(SIZEOF_EMPTY_BODY, EMPTY_BODY)
73
42 #define SIGNATURES_SECTION_VOID_VOID \ 74 #define SIGNATURES_SECTION_VOID_VOID \
43 SECTION(SIGNATURES, 1 + SIZEOF_SIG_ENTRY_v_v), 1, SIG_ENTRY_v_v 75 SECTION(SIGNATURES, 1 + SIZEOF_SIG_ENTRY_v_v), 1, SIG_ENTRY_v_v
44 76
45 #define EXPECT_VERIFIES(data) \ 77 #define EXPECT_VERIFIES(data) \
46 do { \ 78 do { \
47 ModuleResult result = DecodeModule(data, data + arraysize(data)); \ 79 ModuleResult result = DecodeModule(data, data + arraysize(data)); \
48 EXPECT_TRUE(result.ok()); \ 80 EXPECT_TRUE(result.ok()); \
49 if (result.val) delete result.val; \ 81 if (result.val) delete result.val; \
50 } while (false) 82 } while (false)
51 83
(...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after
314 346
315 EXPECT_EQ(0, result.val->signatures[0]->parameter_count()); 347 EXPECT_EQ(0, result.val->signatures[0]->parameter_count());
316 EXPECT_EQ(1, result.val->signatures[1]->parameter_count()); 348 EXPECT_EQ(1, result.val->signatures[1]->parameter_count());
317 EXPECT_EQ(2, result.val->signatures[2]->parameter_count()); 349 EXPECT_EQ(2, result.val->signatures[2]->parameter_count());
318 } 350 }
319 if (result.val) delete result.val; 351 if (result.val) delete result.val;
320 352
321 EXPECT_OFF_END_FAILURE(data, 1, sizeof(data)); 353 EXPECT_OFF_END_FAILURE(data, 1, sizeof(data));
322 } 354 }
323 355
324 TEST_F(WasmModuleVerifyTest, FunctionWithoutSig) {
bradnelson 2016/05/25 14:51:23 Why drop these, as they're brittle?
325 static const byte data[] = {
326 SECTION(OLD_FUNCTIONS, 25), 1,
327 // func#0 ------------------------------------------------------
328 SIG_INDEX(0), // signature index
329 NO_NAME, // name length
330 U32_LE(0), // code start offset
331 U32_LE(0), // code end offset
332 U16_LE(899), // local int32 count
333 U16_LE(799), // local int64 count
334 U16_LE(699), // local float32 count
335 U16_LE(599), // local float64 count
336 0, // exported
337 0 // external
338 };
339
340 ModuleResult result = DecodeModule(data, data + arraysize(data));
341 EXPECT_FALSE(result.ok());
342 if (result.val) delete result.val;
343 }
344
345 TEST_F(WasmModuleVerifyTest, OneEmptyVoidVoidFunction) {
346 const int kCodeStartOffset = 41;
347 const int kCodeEndOffset = kCodeStartOffset + 1;
348
349 static const byte data[] = {
350 // signatures
351 SIGNATURES_SECTION_VOID_VOID,
352 // func#0 ------------------------------------------------------
353 SECTION(OLD_FUNCTIONS, 10), 1, kDeclFunctionExport | kDeclFunctionName,
354 SIG_INDEX(0), // signature index
355 NAME_LENGTH(2), 'h', 'i', // name
356 1, 0, // size
357 kExprNop,
358 };
359
360 {
361 // Should decode to exactly one function.
362 ModuleResult result = DecodeModule(data, data + arraysize(data));
363 EXPECT_OK(result);
364 EXPECT_EQ(0, result.val->globals.size());
365 EXPECT_EQ(1, result.val->signatures.size());
366 EXPECT_EQ(1, result.val->functions.size());
367 EXPECT_EQ(0, result.val->data_segments.size());
368 EXPECT_EQ(0, result.val->function_table.size());
369
370 const WasmFunction* function = &result.val->functions.back();
371
372 EXPECT_EQ(37, function->name_offset);
373 EXPECT_EQ(2, function->name_length);
374 EXPECT_EQ(kCodeStartOffset, function->code_start_offset);
375 EXPECT_EQ(kCodeEndOffset, function->code_end_offset);
376
377 EXPECT_TRUE(function->exported);
378
379 if (result.val) delete result.val;
380 }
381
382 EXPECT_OFF_END_FAILURE(data, 16, sizeof(data));
383 }
384
385 TEST_F(WasmModuleVerifyTest, OneFunctionWithNopBody) {
386 static const byte kCodeStartOffset = 38;
387 static const byte kCodeEndOffset = kCodeStartOffset + 1;
388
389 static const byte data[] = {
390 SIGNATURES_SECTION_VOID_VOID, // --
391 SECTION(OLD_FUNCTIONS, 7), 1,
392 // func#0 ------------------------------------------------------
393 0, // no name, no locals
394 0, 0, // signature index
395 1, 0, // body size
396 kExprNop // body
397 };
398
399 ModuleResult result = DecodeModule(data, data + arraysize(data));
400 EXPECT_OK(result);
401 EXPECT_EQ(1, result.val->functions.size());
402 const WasmFunction* function = &result.val->functions.back();
403
404 EXPECT_EQ(0, function->name_length);
405 EXPECT_EQ(kCodeStartOffset, function->code_start_offset);
406 EXPECT_EQ(kCodeEndOffset, function->code_end_offset);
407
408 EXPECT_FALSE(function->exported);
409
410 if (result.val) delete result.val;
411 }
412
413 TEST_F(WasmModuleVerifyTest, OneGlobalOneFunctionWithNopBodyOneDataSegment) {
414 static const byte kNameOffset = 49;
415 static const byte kCodeStartOffset = 53;
416 static const byte kCodeEndOffset = kCodeStartOffset + 3;
417 static const byte kDataSegmentSourceOffset = kCodeEndOffset + 22;
418
419 static const byte data[] = {
420 // global#0 --------------------------------------------------
421 SECTION(GLOBALS, 4), 1,
422 0, // name length
423 kMemU8, // memory type
424 0, // exported
425 // sig#0 -----------------------------------------------------
426 SIGNATURES_SECTION_VOID_VOID,
427 // func#0 ----------------------------------------------------
428 SECTION(OLD_FUNCTIONS, 12), 1,
429 kDeclFunctionName, // --
430 SIG_INDEX(0), // signature index
431 2, 'h', 'i', // name
432 3, 0, // body size
433 kExprNop, // func#0 body
434 kExprNop, // func#0 body
435 kExprNop, // func#0 body
436 // memory section --------------------------------------------
437 SECTION(MEMORY, 3), 28, 28, 1,
438 // segment#0 -------------------------------------------------
439 SECTION(DATA_SEGMENTS, 10), 1,
440 U32V_3(0x8b3ae), // dest addr
441 U32V_1(5), // source size
442 0, 1, 2, 3, 4, // data bytes
443 // rest ------------------------------------------------------
444 SECTION(END, 0),
445 };
446
447 {
448 ModuleResult result = DecodeModule(data, data + arraysize(data));
449 EXPECT_OK(result);
450 EXPECT_EQ(1, result.val->globals.size());
451 EXPECT_EQ(1, result.val->functions.size());
452 EXPECT_EQ(1, result.val->data_segments.size());
453
454 const WasmGlobal* global = &result.val->globals.back();
455
456 EXPECT_EQ(0, global->name_length);
457 EXPECT_EQ(MachineType::Uint8(), global->type);
458 EXPECT_EQ(0, global->offset);
459 EXPECT_FALSE(global->exported);
460
461 const WasmFunction* function = &result.val->functions.back();
462
463 EXPECT_EQ(kNameOffset, function->name_offset);
464 EXPECT_EQ(2, function->name_length);
465 EXPECT_EQ(kCodeStartOffset, function->code_start_offset);
466 EXPECT_EQ(kCodeEndOffset, function->code_end_offset);
467
468 EXPECT_FALSE(function->exported);
469
470 const WasmDataSegment* segment = &result.val->data_segments.back();
471
472 EXPECT_EQ(0x8b3ae, segment->dest_addr);
473 EXPECT_EQ(kDataSegmentSourceOffset, segment->source_offset);
474 EXPECT_EQ(5, segment->source_size);
475 EXPECT_TRUE(segment->init);
476
477 if (result.val) delete result.val;
478 }
479 }
480
481 TEST_F(WasmModuleVerifyTest, OneDataSegment) { 356 TEST_F(WasmModuleVerifyTest, OneDataSegment) {
482 const byte kDataSegmentSourceOffset = 30; 357 const byte kDataSegmentSourceOffset = 30;
483 const byte data[] = { 358 const byte data[] = {
484 SECTION(MEMORY, 3), 359 SECTION(MEMORY, 3),
485 28, 360 28,
486 28, 361 28,
487 1, 362 1,
488 SECTION(DATA_SEGMENTS, 8), 363 SECTION(DATA_SEGMENTS, 8),
489 1, 364 1,
490 U32V_3(0x9bbaa), // dest addr 365 U32V_3(0x9bbaa), // dest addr
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
598 EXPECT_FAILURE(data); 473 EXPECT_FAILURE(data);
599 } 474 }
600 } 475 }
601 } 476 }
602 } 477 }
603 478
604 TEST_F(WasmModuleVerifyTest, OneIndirectFunction) { 479 TEST_F(WasmModuleVerifyTest, OneIndirectFunction) {
605 static const byte data[] = { 480 static const byte data[] = {
606 // sig#0 ------------------------------------------------------- 481 // sig#0 -------------------------------------------------------
607 SIGNATURES_SECTION_VOID_VOID, 482 SIGNATURES_SECTION_VOID_VOID,
608 // func#0 ------------------------------------------------------ 483 // funcs ------------------------------------------------------
609 SECTION(OLD_FUNCTIONS, 1 + SIZEOF_EMPTY_FUNCTION), 1, // -- 484 ONE_EMPTY_FUNCTION,
610 EMPTY_FUNCTION(0),
611 // indirect table ---------------------------------------------- 485 // indirect table ----------------------------------------------
612 SECTION(FUNCTION_TABLE, 2), 1, U32V_1(0)}; 486 SECTION(FUNCTION_TABLE, 2), 1, U32V_1(0)};
613 487
614 ModuleResult result = DecodeModule(data, data + arraysize(data)); 488 ModuleResult result = DecodeModule(data, data + arraysize(data));
615 EXPECT_OK(result); 489 EXPECT_OK(result);
616 if (result.ok()) { 490 if (result.ok()) {
617 EXPECT_EQ(1, result.val->signatures.size()); 491 EXPECT_EQ(1, result.val->signatures.size());
618 EXPECT_EQ(1, result.val->functions.size()); 492 EXPECT_EQ(1, result.val->functions.size());
619 EXPECT_EQ(1, result.val->function_table.size()); 493 EXPECT_EQ(1, result.val->function_table.size());
620 EXPECT_EQ(0, result.val->function_table[0]); 494 EXPECT_EQ(0, result.val->function_table[0]);
621 } 495 }
622 if (result.val) delete result.val; 496 if (result.val) delete result.val;
623 } 497 }
624 498
625 TEST_F(WasmModuleVerifyTest, MultipleIndirectFunctions) { 499 TEST_F(WasmModuleVerifyTest, MultipleIndirectFunctions) {
626 static const byte data[] = { 500 static const byte data[] = {
627 // sig#0 ------------------------------------------------------- 501 // sig#0 -------------------------------------------------------
628 SECTION(SIGNATURES, 1 + SIZEOF_SIG_ENTRY_v_v + SIZEOF_SIG_ENTRY_v_x), 502 SECTION(SIGNATURES, 1 + SIZEOF_SIG_ENTRY_v_v + SIZEOF_SIG_ENTRY_v_x),
629 2, // -- 503 2, // --
630 SIG_ENTRY_v_v, // void -> void 504 SIG_ENTRY_v_v, // void -> void
631 SIG_ENTRY_v_x(kLocalI32), // void -> i32 505 SIG_ENTRY_v_x(kLocalI32), // void -> i32
632 // func#0 ------------------------------------------------------ 506 // funcs ------------------------------------------------------
633 SECTION(OLD_FUNCTIONS, 1 + 4 * SIZEOF_EMPTY_FUNCTION), 4, // -- 507 FOUR_EMPTY_FUNCTIONS,
634 EMPTY_FUNCTION(0), // --
635 EMPTY_FUNCTION(1), // --
636 EMPTY_FUNCTION(0), // --
637 EMPTY_FUNCTION(1), // --
638 // indirect table ---------------------------------------------- 508 // indirect table ----------------------------------------------
639 SECTION(FUNCTION_TABLE, 9), 8, 509 SECTION(FUNCTION_TABLE, 9), 8,
640 U32V_1(0), // -- 510 U32V_1(0), // --
641 U32V_1(1), // -- 511 U32V_1(1), // --
642 U32V_1(2), // -- 512 U32V_1(2), // --
643 U32V_1(3), // -- 513 U32V_1(3), // --
644 U32V_1(0), // -- 514 U32V_1(0), // --
645 U32V_1(1), // -- 515 U32V_1(1), // --
646 U32V_1(2), // -- 516 U32V_1(2), // --
647 U32V_1(3), // -- 517 U32V_1(3), // --
648 }; 518 FOUR_EMPTY_BODIES};
649 519
650 ModuleResult result = DecodeModule(data, data + arraysize(data)); 520 ModuleResult result = DecodeModule(data, data + arraysize(data));
651 EXPECT_OK(result); 521 EXPECT_OK(result);
652 if (result.ok()) { 522 if (result.ok()) {
653 EXPECT_EQ(2, result.val->signatures.size()); 523 EXPECT_EQ(2, result.val->signatures.size());
654 EXPECT_EQ(4, result.val->functions.size()); 524 EXPECT_EQ(4, result.val->functions.size());
655 EXPECT_EQ(8, result.val->function_table.size()); 525 EXPECT_EQ(8, result.val->function_table.size());
656 for (int i = 0; i < 8; i++) { 526 for (int i = 0; i < 8; i++) {
657 EXPECT_EQ(i & 3, result.val->function_table[i]); 527 EXPECT_EQ(i & 3, result.val->function_table[i]);
658 } 528 }
(...skipping 10 matching lines...) Expand all
669 }; 539 };
670 540
671 EXPECT_FAILURE(data); 541 EXPECT_FAILURE(data);
672 } 542 }
673 543
674 TEST_F(WasmModuleVerifyTest, IndirectFunctionInvalidIndex) { 544 TEST_F(WasmModuleVerifyTest, IndirectFunctionInvalidIndex) {
675 static const byte data[] = { 545 static const byte data[] = {
676 // sig#0 ------------------------------------------------------- 546 // sig#0 -------------------------------------------------------
677 SIGNATURES_SECTION_VOID_VOID, 547 SIGNATURES_SECTION_VOID_VOID,
678 // functions --------------------------------------------------- 548 // functions ---------------------------------------------------
679 SECTION(OLD_FUNCTIONS, 1 + SIZEOF_EMPTY_FUNCTION), 1, // -- 549 ONE_EMPTY_FUNCTION,
680 EMPTY_FUNCTION(0),
681 // indirect table ---------------------------------------------- 550 // indirect table ----------------------------------------------
682 SECTION(FUNCTION_TABLE, 3), 1, 1, 0, 551 SECTION(FUNCTION_TABLE, 3), 1, 1, 0,
683 }; 552 };
684 553
685 EXPECT_FAILURE(data); 554 EXPECT_FAILURE(data);
686 } 555 }
687 556
688 class WasmSignatureDecodeTest : public TestWithZone {}; 557 class WasmSignatureDecodeTest : public TestWithZone {};
689 558
690 TEST_F(WasmSignatureDecodeTest, Ok_v_v) { 559 TEST_F(WasmSignatureDecodeTest, Ok_v_v) {
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
832 EXPECT_OK(result); 701 EXPECT_OK(result);
833 702
834 if (result.val && result.ok()) { 703 if (result.val && result.ok()) {
835 WasmFunction* function = result.val; 704 WasmFunction* function = result.val;
836 EXPECT_EQ(0, function->sig->parameter_count()); 705 EXPECT_EQ(0, function->sig->parameter_count());
837 EXPECT_EQ(0, function->sig->return_count()); 706 EXPECT_EQ(0, function->sig->return_count());
838 EXPECT_EQ(0, function->name_offset); 707 EXPECT_EQ(0, function->name_offset);
839 EXPECT_EQ(SIZEOF_SIG_ENTRY_v_v, function->code_start_offset); 708 EXPECT_EQ(SIZEOF_SIG_ENTRY_v_v, function->code_start_offset);
840 EXPECT_EQ(arraysize(data), function->code_end_offset); 709 EXPECT_EQ(arraysize(data), function->code_end_offset);
841 // TODO(titzer): verify encoding of local declarations 710 // TODO(titzer): verify encoding of local declarations
842 EXPECT_FALSE(function->exported);
843 } 711 }
844 712
845 if (result.val) delete result.val; 713 if (result.val) delete result.val;
846 } 714 }
847 715
848 TEST_F(WasmModuleVerifyTest, SectionWithoutNameLength) { 716 TEST_F(WasmModuleVerifyTest, SectionWithoutNameLength) {
849 const byte data[] = {1}; 717 const byte data[] = {1};
850 EXPECT_FAILURE(data); 718 EXPECT_FAILURE(data);
851 } 719 }
852 720
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after
1064 NAME_LENGTH(1), 932 NAME_LENGTH(1),
1065 'm', // module name 933 'm', // module name
1066 NAME_LENGTH(1), 934 NAME_LENGTH(1),
1067 'f', // function name 935 'f', // function name
1068 }; 936 };
1069 937
1070 EXPECT_OFF_END_FAILURE(data, 16, sizeof(data)); 938 EXPECT_OFF_END_FAILURE(data, 16, sizeof(data));
1071 } 939 }
1072 940
1073 TEST_F(WasmModuleVerifyTest, ExportTable_empty1) { 941 TEST_F(WasmModuleVerifyTest, ExportTable_empty1) {
1074 static const byte data[] = { 942 static const byte data[] = {// signatures
1075 // signatures 943 SIGNATURES_SECTION_VOID_VOID, ONE_EMPTY_FUNCTION,
1076 SIGNATURES_SECTION_VOID_VOID, 944 SECTION(EXPORT_TABLE, 1),
1077 SECTION(OLD_FUNCTIONS, 1 + SIZEOF_EMPTY_FUNCTION), 945 0, // --
1078 1, 946 ONE_EMPTY_BODY};
1079 EMPTY_FUNCTION(0), 947
1080 SECTION(EXPORT_TABLE, 1), 948 ModuleResult result = DecodeModule(data, data + arraysize(data));
1081 0 // -- 949 EXPECT_OK(result);
1082 }; 950
1083 EXPECT_VERIFIES(data); 951 EXPECT_EQ(1, result.val->functions.size());
952 EXPECT_EQ(0, result.val->export_table.size());
953
954 if (result.val) delete result.val;
1084 } 955 }
1085 956
1086 TEST_F(WasmModuleVerifyTest, ExportTable_empty2) { 957 TEST_F(WasmModuleVerifyTest, ExportTable_empty2) {
1087 static const byte data[] = { 958 static const byte data[] = {
1088 SECTION(SIGNATURES, 1), 0, SECTION(OLD_FUNCTIONS, 1), 0, 959 SECTION(SIGNATURES, 1), 0, SECTION(EXPORT_TABLE, 1), 0 // --
1089 SECTION(EXPORT_TABLE, 1), 0 // --
1090 }; 960 };
1091 // TODO(titzer): current behavior treats empty functions section as missing. 961 // TODO(titzer): current behavior treats empty functions section as missing.
1092 EXPECT_FAILURE(data); 962 EXPECT_FAILURE(data);
1093 } 963 }
1094 964
1095 TEST_F(WasmModuleVerifyTest, ExportTable_NoFunctions1) { 965 TEST_F(WasmModuleVerifyTest, ExportTable_NoFunctions1) {
1096 static const byte data[] = { 966 static const byte data[] = {
1097 SECTION(SIGNATURES, 1), 0, SECTION(EXPORT_TABLE, 1), 0 // -- 967 SECTION(SIGNATURES, 1), 0, SECTION(EXPORT_TABLE, 1), 0 // --
1098 }; 968 };
1099 EXPECT_FAILURE(data); 969 EXPECT_FAILURE(data);
1100 } 970 }
1101 971
1102 TEST_F(WasmModuleVerifyTest, ExportTable_NoFunctions2) { 972 TEST_F(WasmModuleVerifyTest, ExportTable_NoFunctions2) {
1103 static const byte data[] = {SECTION(EXPORT_TABLE, 1), 0}; 973 static const byte data[] = {SECTION(EXPORT_TABLE, 1), 0};
1104 EXPECT_FAILURE(data); 974 EXPECT_FAILURE(data);
1105 } 975 }
1106 976
1107 TEST_F(WasmModuleVerifyTest, ExportTableOne) { 977 TEST_F(WasmModuleVerifyTest, ExportTableOne) {
1108 static const byte data[] = { 978 static const byte data[] = {// signatures
1109 // signatures 979 SIGNATURES_SECTION_VOID_VOID,
1110 SIGNATURES_SECTION_VOID_VOID, 980 ONE_EMPTY_FUNCTION,
1111 SECTION(OLD_FUNCTIONS, 1 + SIZEOF_EMPTY_FUNCTION), 981 SECTION(EXPORT_TABLE, 3),
1112 1, // functions 982 1, // exports
1113 EMPTY_FUNCTION(0), // -- 983 FUNC_INDEX(0), // --
1114 SECTION(EXPORT_TABLE, 3), 984 NO_NAME, // --
1115 1, // exports 985 ONE_EMPTY_BODY};
1116 FUNC_INDEX(0), // -- 986 ModuleResult result = DecodeModule(data, data + arraysize(data));
1117 NO_NAME // -- 987 EXPECT_OK(result);
1118 }; 988
1119 EXPECT_VERIFIES(data); 989 EXPECT_EQ(1, result.val->functions.size());
990 EXPECT_EQ(1, result.val->export_table.size());
991
992 if (result.val) delete result.val;
1120 } 993 }
1121 994
1122 TEST_F(WasmModuleVerifyTest, ExportTableTwo) { 995 TEST_F(WasmModuleVerifyTest, ExportTableTwo) {
1123 static const byte data[] = { 996 static const byte data[] = {// signatures
1124 // signatures 997 SIGNATURES_SECTION_VOID_VOID,
1125 SIGNATURES_SECTION_VOID_VOID, 998 ONE_EMPTY_FUNCTION,
1126 SECTION(OLD_FUNCTIONS, 1 + SIZEOF_EMPTY_FUNCTION), 999 SECTION(EXPORT_TABLE, 12),
1127 1, // functions 1000 2, // exports
1128 EMPTY_FUNCTION(0), // -- 1001 FUNC_INDEX(0), // --
1129 SECTION(EXPORT_TABLE, 12), 1002 NAME_LENGTH(4),
1130 2, // exports 1003 'n',
1131 FUNC_INDEX(0), // -- 1004 'a',
1132 NAME_LENGTH(4), 1005 'm',
1133 'n', 1006 'e', // --
1134 'a', 1007 FUNC_INDEX(0), // --
1135 'm', 1008 NAME_LENGTH(3),
1136 'e', // -- 1009 'n',
1137 FUNC_INDEX(0), // -- 1010 'o',
1138 NAME_LENGTH(3), 1011 'm', // --
1139 'n', 1012 ONE_EMPTY_BODY};
1140 'o', 1013
1141 'm' // -- 1014 ModuleResult result = DecodeModule(data, data + arraysize(data));
1142 }; 1015 EXPECT_OK(result);
1143 EXPECT_VERIFIES(data); 1016
1017 EXPECT_EQ(1, result.val->functions.size());
1018 EXPECT_EQ(2, result.val->export_table.size());
1019
1020 if (result.val) delete result.val;
1144 } 1021 }
1145 1022
1146 TEST_F(WasmModuleVerifyTest, ExportTableThree) { 1023 TEST_F(WasmModuleVerifyTest, ExportTableThree) {
1147 static const byte data[] = { 1024 static const byte data[] = {// signatures
1148 // signatures 1025 SIGNATURES_SECTION_VOID_VOID,
1149 SIGNATURES_SECTION_VOID_VOID, 1026 THREE_EMPTY_FUNCTIONS,
1150 SECTION(OLD_FUNCTIONS, 1 + 3 * SIZEOF_EMPTY_FUNCTION), 1027 SECTION(EXPORT_TABLE, 10),
1151 3, // functions 1028 3, // exports
1152 EMPTY_FUNCTION(0), // -- 1029 FUNC_INDEX(0), // --
1153 EMPTY_FUNCTION(0), // -- 1030 NAME_LENGTH(1),
1154 EMPTY_FUNCTION(0), // -- 1031 'a', // --
1155 SECTION(EXPORT_TABLE, 10), 1032 FUNC_INDEX(1), // --
1156 3, // exports 1033 NAME_LENGTH(1),
1157 FUNC_INDEX(0), // -- 1034 'b', // --
1158 NAME_LENGTH(1), 1035 FUNC_INDEX(2), // --
1159 'a', // -- 1036 NAME_LENGTH(1),
1160 FUNC_INDEX(1), // -- 1037 'c', // --
1161 NAME_LENGTH(1), 1038 THREE_EMPTY_BODIES};
1162 'b', // -- 1039 ModuleResult result = DecodeModule(data, data + arraysize(data));
1163 FUNC_INDEX(2), // -- 1040 EXPECT_OK(result);
1164 NAME_LENGTH(1), 1041
1165 'c' // -- 1042 EXPECT_EQ(3, result.val->functions.size());
1166 }; 1043 EXPECT_EQ(3, result.val->export_table.size());
1167 EXPECT_VERIFIES(data); 1044
1045 if (result.val) delete result.val;
1168 } 1046 }
1169 1047
1170 TEST_F(WasmModuleVerifyTest, ExportTableThreeOne) { 1048 TEST_F(WasmModuleVerifyTest, ExportTableThreeOne) {
1171 for (int i = 0; i < 6; i++) { 1049 for (int i = 0; i < 6; i++) {
1172 const byte data[] = { 1050 const byte data[] = {// signatures
1173 // signatures 1051 SIGNATURES_SECTION_VOID_VOID,
1174 SIGNATURES_SECTION_VOID_VOID, 1052 THREE_EMPTY_FUNCTIONS,
1175 SECTION(OLD_FUNCTIONS, 1 + 3 * SIZEOF_EMPTY_FUNCTION), 1053 SECTION(EXPORT_TABLE, 5),
1176 3, // functions 1054 1, // exports
1177 EMPTY_FUNCTION(0), // -- 1055 FUNC_INDEX(i), // --
1178 EMPTY_FUNCTION(0), // -- 1056 NAME_LENGTH(2),
1179 EMPTY_FUNCTION(0), // -- 1057 'e',
1180 SECTION(EXPORT_TABLE, 5), 1058 'x', // --
1181 1, // exports 1059 THREE_EMPTY_BODIES};
1182 FUNC_INDEX(i), // --
1183 NAME_LENGTH(2),
1184 'e',
1185 'x', // --
1186 };
1187 1060
1188 if (i < 3) { 1061 if (i < 3) {
1189 EXPECT_VERIFIES(data); 1062 EXPECT_VERIFIES(data);
1190 } else { 1063 } else {
1191 EXPECT_FAILURE(data); 1064 EXPECT_FAILURE(data);
1192 } 1065 }
1193 } 1066 }
1194 } 1067 }
1195 1068
1196 TEST_F(WasmModuleVerifyTest, ExportTableOne_off_end) { 1069 TEST_F(WasmModuleVerifyTest, ExportTableOne_off_end) {
1197 static const byte data[] = { 1070 static const byte data[] = {
1198 // signatures 1071 // signatures
1199 SIGNATURES_SECTION_VOID_VOID, 1072 SIGNATURES_SECTION_VOID_VOID,
1200 SECTION(OLD_FUNCTIONS, 1 + SIZEOF_EMPTY_FUNCTION), 1073 ONE_EMPTY_FUNCTION,
1201 1, // functions
1202 EMPTY_FUNCTION(0), // --
1203 SECTION(EXPORT_TABLE, 1 + 6), 1074 SECTION(EXPORT_TABLE, 1 + 6),
1204 1, // exports 1075 1, // exports
1205 FUNC_INDEX(0), // -- 1076 FUNC_INDEX(0), // --
1206 NO_NAME // -- 1077 NO_NAME // --
1207 }; 1078 };
1208 1079
1209 for (int length = 33; length < sizeof(data); length++) { 1080 for (int length = 33; length < sizeof(data); length++) {
1210 ModuleResult result = DecodeModule(data, data + length); 1081 ModuleResult result = DecodeModule(data, data + length);
1211 EXPECT_FALSE(result.ok()); 1082 EXPECT_FALSE(result.ok());
1212 if (result.val) delete result.val; 1083 if (result.val) delete result.val;
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
1314 NO_LOCAL_NAMES, // -- 1185 NO_LOCAL_NAMES, // --
1315 FOO_STRING, 1186 FOO_STRING,
1316 NO_LOCAL_NAMES, // -- 1187 NO_LOCAL_NAMES, // --
1317 }; 1188 };
1318 EXPECT_VERIFIES(data); 1189 EXPECT_VERIFIES(data);
1319 } 1190 }
1320 1191
1321 } // namespace wasm 1192 } // namespace wasm
1322 } // namespace internal 1193 } // namespace internal
1323 } // namespace v8 1194 } // namespace v8
OLDNEW
« src/wasm/encoder.cc ('K') | « test/unittests/wasm/ast-decoder-unittest.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698