OLD | NEW |
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 663 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
674 EXPECT_VERIFIES(data); | 674 EXPECT_VERIFIES(data); |
675 } else { | 675 } else { |
676 EXPECT_FAILURE(data); | 676 EXPECT_FAILURE(data); |
677 } | 677 } |
678 } | 678 } |
679 } | 679 } |
680 } | 680 } |
681 | 681 |
682 | 682 |
683 // To make below tests for indirect calls much shorter. | 683 // To make below tests for indirect calls much shorter. |
684 #define FUNCTION(sig_index, external) \ | 684 #define FUNCTION(sig_index, external) kDeclFunctionImport, SIG_INDEX(sig_index) |
685 kDeclFunctionImport, static_cast<byte>(sig_index), \ | |
686 static_cast<byte>(sig_index >> 8) | |
687 | |
688 | 685 |
689 TEST_F(WasmModuleVerifyTest, OneIndirectFunction) { | 686 TEST_F(WasmModuleVerifyTest, OneIndirectFunction) { |
690 static const byte data[] = { | 687 static const byte data[] = { |
691 // sig#0 ------------------------------------------------------- | 688 // sig#0 ------------------------------------------------------- |
692 kDeclSignatures, 1, 0, 0, // void -> void | 689 kDeclSignatures, 1, 0, 0, // void -> void |
693 // func#0 ------------------------------------------------------ | 690 // func#0 ------------------------------------------------------ |
694 kDeclFunctions, 1, FUNCTION(0, 0), | 691 kDeclFunctions, 1, FUNCTION(0, 0), |
695 // indirect table ---------------------------------------------- | 692 // indirect table ---------------------------------------------- |
696 kDeclFunctionTable, 1, 0, 0}; | 693 kDeclFunctionTable, 1, U32V_1(0)}; |
697 | 694 |
698 ModuleResult result = DecodeModule(data, data + arraysize(data)); | 695 ModuleResult result = DecodeModule(data, data + arraysize(data)); |
699 EXPECT_TRUE(result.ok()); | 696 EXPECT_TRUE(result.ok()); |
700 if (result.ok()) { | 697 if (result.ok()) { |
701 EXPECT_EQ(1, result.val->signatures.size()); | 698 EXPECT_EQ(1, result.val->signatures.size()); |
702 EXPECT_EQ(1, result.val->functions.size()); | 699 EXPECT_EQ(1, result.val->functions.size()); |
703 EXPECT_EQ(1, result.val->function_table.size()); | 700 EXPECT_EQ(1, result.val->function_table.size()); |
704 EXPECT_EQ(0, result.val->function_table[0]); | 701 EXPECT_EQ(0, result.val->function_table[0]); |
705 } | 702 } |
706 if (result.val) delete result.val; | 703 if (result.val) delete result.val; |
707 } | 704 } |
708 | 705 |
709 | 706 |
710 TEST_F(WasmModuleVerifyTest, MultipleIndirectFunctions) { | 707 TEST_F(WasmModuleVerifyTest, MultipleIndirectFunctions) { |
711 static const byte data[] = { | 708 static const byte data[] = { |
712 // sig#0 ------------------------------------------------------- | 709 // sig#0 ------------------------------------------------------- |
713 kDeclSignatures, 2, 0, 0, // void -> void | 710 kDeclSignatures, 2, 0, 0, // void -> void |
714 0, kLocalI32, // void -> i32 | 711 0, kLocalI32, // void -> i32 |
715 // func#0 ------------------------------------------------------ | 712 // func#0 ------------------------------------------------------ |
716 kDeclFunctions, 4, FUNCTION(0, 1), // -- | 713 kDeclFunctions, 4, FUNCTION(0, 1), // -- |
717 FUNCTION(1, 1), // -- | 714 FUNCTION(1, 1), // -- |
718 FUNCTION(0, 1), // -- | 715 FUNCTION(0, 1), // -- |
719 FUNCTION(1, 1), // -- | 716 FUNCTION(1, 1), // -- |
720 // indirect table ---------------------------------------------- | 717 // indirect table ---------------------------------------------- |
721 kDeclFunctionTable, 8, | 718 kDeclFunctionTable, 8, |
722 U16_LE(0), // -- | 719 U32V_1(0), // -- |
723 U16_LE(1), // -- | 720 U32V_1(1), // -- |
724 U16_LE(2), // -- | 721 U32V_1(2), // -- |
725 U16_LE(3), // -- | 722 U32V_1(3), // -- |
726 U16_LE(0), // -- | 723 U32V_1(0), // -- |
727 U16_LE(1), // -- | 724 U32V_1(1), // -- |
728 U16_LE(2), // -- | 725 U32V_1(2), // -- |
729 U16_LE(3), // -- | 726 U32V_1(3), // -- |
730 }; | 727 }; |
731 | 728 |
732 ModuleResult result = DecodeModule(data, data + arraysize(data)); | 729 ModuleResult result = DecodeModule(data, data + arraysize(data)); |
733 EXPECT_TRUE(result.ok()); | 730 EXPECT_TRUE(result.ok()); |
734 if (result.ok()) { | 731 if (result.ok()) { |
735 EXPECT_EQ(2, result.val->signatures.size()); | 732 EXPECT_EQ(2, result.val->signatures.size()); |
736 EXPECT_EQ(4, result.val->functions.size()); | 733 EXPECT_EQ(4, result.val->functions.size()); |
737 EXPECT_EQ(8, result.val->function_table.size()); | 734 EXPECT_EQ(8, result.val->function_table.size()); |
738 for (int i = 0; i < 8; i++) { | 735 for (int i = 0; i < 8; i++) { |
739 EXPECT_EQ(i & 3, result.val->function_table[i]); | 736 EXPECT_EQ(i & 3, result.val->function_table[i]); |
(...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1080 EXPECT_FAILURE(data); | 1077 EXPECT_FAILURE(data); |
1081 } | 1078 } |
1082 | 1079 |
1083 TEST_F(WasmModuleVerifyTest, ImportTable_one_sig) { | 1080 TEST_F(WasmModuleVerifyTest, ImportTable_one_sig) { |
1084 static const byte data[] = { | 1081 static const byte data[] = { |
1085 kDeclSignatures, | 1082 kDeclSignatures, |
1086 1, | 1083 1, |
1087 VOID_VOID_SIG, | 1084 VOID_VOID_SIG, |
1088 kDeclImportTable, | 1085 kDeclImportTable, |
1089 1, // -- | 1086 1, // -- |
1090 SIG_INDEX(0), // sig index | 1087 U32V_1(0), // sig index |
1091 NAME_OFFSET(1), // module name | 1088 NAME_OFFSET(1), // module name |
1092 NAME_OFFSET(1) // function name | 1089 NAME_OFFSET(1) // function name |
1093 }; | 1090 }; |
1094 EXPECT_VERIFIES(data); | 1091 EXPECT_VERIFIES(data); |
1095 } | 1092 } |
1096 | 1093 |
1097 TEST_F(WasmModuleVerifyTest, ImportTable_invalid_module) { | 1094 TEST_F(WasmModuleVerifyTest, ImportTable_invalid_module) { |
1098 static const byte data[] = { | 1095 static const byte data[] = { |
1099 kDeclSignatures, | 1096 kDeclSignatures, |
1100 1, | 1097 1, |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1218 for (int length = 13; length < sizeof(data); length++) { | 1215 for (int length = 13; length < sizeof(data); length++) { |
1219 ModuleResult result = DecodeModule(data, data + length); | 1216 ModuleResult result = DecodeModule(data, data + length); |
1220 EXPECT_FALSE(result.ok()); | 1217 EXPECT_FALSE(result.ok()); |
1221 if (result.val) delete result.val; | 1218 if (result.val) delete result.val; |
1222 } | 1219 } |
1223 } | 1220 } |
1224 | 1221 |
1225 } // namespace wasm | 1222 } // namespace wasm |
1226 } // namespace internal | 1223 } // namespace internal |
1227 } // namespace v8 | 1224 } // namespace v8 |
OLD | NEW |