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/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-limits.h" | 10 #include "src/wasm/wasm-limits.h" |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
119 | 119 |
120 static size_t SizeOfVarInt(size_t value) { | 120 static size_t SizeOfVarInt(size_t value) { |
121 size_t size = 0; | 121 size_t size = 0; |
122 do { | 122 do { |
123 size++; | 123 size++; |
124 value = value >> 7; | 124 value = value >> 7; |
125 } while (value > 0); | 125 } while (value > 0); |
126 return size; | 126 return size; |
127 } | 127 } |
128 | 128 |
129 struct LocalTypePair { | 129 struct ValueTypePair { |
130 uint8_t code; | 130 uint8_t code; |
131 LocalType type; | 131 ValueType type; |
132 } kLocalTypes[] = {{kLocalI32, kAstI32}, | 132 } kValueTypes[] = {{kLocalI32, kWasmI32}, |
133 {kLocalI64, kAstI64}, | 133 {kLocalI64, kWasmI64}, |
134 {kLocalF32, kAstF32}, | 134 {kLocalF32, kWasmF32}, |
135 {kLocalF64, kAstF64}}; | 135 {kLocalF64, kWasmF64}}; |
136 | 136 |
137 class WasmModuleVerifyTest : public TestWithIsolateAndZone { | 137 class WasmModuleVerifyTest : public TestWithIsolateAndZone { |
138 public: | 138 public: |
139 ModuleResult DecodeModule(const byte* module_start, const byte* module_end) { | 139 ModuleResult DecodeModule(const byte* module_start, const byte* module_end) { |
140 // Add the WASM magic and version number automatically. | 140 // Add the WASM magic and version number automatically. |
141 size_t size = static_cast<size_t>(module_end - module_start); | 141 size_t size = static_cast<size_t>(module_end - module_start); |
142 byte header[] = {WASM_MODULE_HEADER}; | 142 byte header[] = {WASM_MODULE_HEADER}; |
143 size_t total = sizeof(header) + size; | 143 size_t total = sizeof(header) + size; |
144 auto temp = new byte[total]; | 144 auto temp = new byte[total]; |
145 memcpy(temp, header, sizeof(header)); | 145 memcpy(temp, header, sizeof(header)); |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
192 { | 192 { |
193 // Should decode to exactly one global. | 193 // Should decode to exactly one global. |
194 ModuleResult result = DecodeModule(data, data + sizeof(data)); | 194 ModuleResult result = DecodeModule(data, data + sizeof(data)); |
195 EXPECT_OK(result); | 195 EXPECT_OK(result); |
196 EXPECT_EQ(1u, result.val->globals.size()); | 196 EXPECT_EQ(1u, result.val->globals.size()); |
197 EXPECT_EQ(0u, result.val->functions.size()); | 197 EXPECT_EQ(0u, result.val->functions.size()); |
198 EXPECT_EQ(0u, result.val->data_segments.size()); | 198 EXPECT_EQ(0u, result.val->data_segments.size()); |
199 | 199 |
200 const WasmGlobal* global = &result.val->globals.back(); | 200 const WasmGlobal* global = &result.val->globals.back(); |
201 | 201 |
202 EXPECT_EQ(kAstI32, global->type); | 202 EXPECT_EQ(kWasmI32, global->type); |
203 EXPECT_EQ(0u, global->offset); | 203 EXPECT_EQ(0u, global->offset); |
204 EXPECT_FALSE(global->mutability); | 204 EXPECT_FALSE(global->mutability); |
205 EXPECT_EQ(WasmInitExpr::kI32Const, global->init.kind); | 205 EXPECT_EQ(WasmInitExpr::kI32Const, global->init.kind); |
206 EXPECT_EQ(13, global->init.val.i32_const); | 206 EXPECT_EQ(13, global->init.val.i32_const); |
207 | 207 |
208 if (result.val) delete result.val; | 208 if (result.val) delete result.val; |
209 } | 209 } |
210 | 210 |
211 EXPECT_OFF_END_FAILURE(data, 1, sizeof(data)); | 211 EXPECT_OFF_END_FAILURE(data, 1, sizeof(data)); |
212 } | 212 } |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
353 { | 353 { |
354 // Should decode to exactly two globals. | 354 // Should decode to exactly two globals. |
355 ModuleResult result = DecodeModule(data, data + sizeof(data)); | 355 ModuleResult result = DecodeModule(data, data + sizeof(data)); |
356 EXPECT_OK(result); | 356 EXPECT_OK(result); |
357 EXPECT_EQ(2u, result.val->globals.size()); | 357 EXPECT_EQ(2u, result.val->globals.size()); |
358 EXPECT_EQ(0u, result.val->functions.size()); | 358 EXPECT_EQ(0u, result.val->functions.size()); |
359 EXPECT_EQ(0u, result.val->data_segments.size()); | 359 EXPECT_EQ(0u, result.val->data_segments.size()); |
360 | 360 |
361 const WasmGlobal* g0 = &result.val->globals[0]; | 361 const WasmGlobal* g0 = &result.val->globals[0]; |
362 | 362 |
363 EXPECT_EQ(kAstF32, g0->type); | 363 EXPECT_EQ(kWasmF32, g0->type); |
364 EXPECT_EQ(0u, g0->offset); | 364 EXPECT_EQ(0u, g0->offset); |
365 EXPECT_FALSE(g0->mutability); | 365 EXPECT_FALSE(g0->mutability); |
366 EXPECT_EQ(WasmInitExpr::kF32Const, g0->init.kind); | 366 EXPECT_EQ(WasmInitExpr::kF32Const, g0->init.kind); |
367 | 367 |
368 const WasmGlobal* g1 = &result.val->globals[1]; | 368 const WasmGlobal* g1 = &result.val->globals[1]; |
369 | 369 |
370 EXPECT_EQ(kAstF64, g1->type); | 370 EXPECT_EQ(kWasmF64, g1->type); |
371 EXPECT_EQ(8u, g1->offset); | 371 EXPECT_EQ(8u, g1->offset); |
372 EXPECT_TRUE(g1->mutability); | 372 EXPECT_TRUE(g1->mutability); |
373 EXPECT_EQ(WasmInitExpr::kF64Const, g1->init.kind); | 373 EXPECT_EQ(WasmInitExpr::kF64Const, g1->init.kind); |
374 | 374 |
375 if (result.val) delete result.val; | 375 if (result.val) delete result.val; |
376 } | 376 } |
377 | 377 |
378 EXPECT_OFF_END_FAILURE(data, 1, sizeof(data)); | 378 EXPECT_OFF_END_FAILURE(data, 1, sizeof(data)); |
379 } | 379 } |
380 | 380 |
(...skipping 396 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
777 Zone zone(&allocator, ZONE_NAME); | 777 Zone zone(&allocator, ZONE_NAME); |
778 FunctionSig* sig = | 778 FunctionSig* sig = |
779 DecodeWasmSignatureForTesting(&zone, data, data + sizeof(data)); | 779 DecodeWasmSignatureForTesting(&zone, data, data + sizeof(data)); |
780 | 780 |
781 EXPECT_TRUE(sig != nullptr); | 781 EXPECT_TRUE(sig != nullptr); |
782 EXPECT_EQ(0u, sig->parameter_count()); | 782 EXPECT_EQ(0u, sig->parameter_count()); |
783 EXPECT_EQ(0u, sig->return_count()); | 783 EXPECT_EQ(0u, sig->return_count()); |
784 } | 784 } |
785 | 785 |
786 TEST_F(WasmSignatureDecodeTest, Ok_t_v) { | 786 TEST_F(WasmSignatureDecodeTest, Ok_t_v) { |
787 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { | 787 for (size_t i = 0; i < arraysize(kValueTypes); i++) { |
788 LocalTypePair ret_type = kLocalTypes[i]; | 788 ValueTypePair ret_type = kValueTypes[i]; |
789 const byte data[] = {SIG_ENTRY_x(ret_type.code)}; | 789 const byte data[] = {SIG_ENTRY_x(ret_type.code)}; |
790 FunctionSig* sig = | 790 FunctionSig* sig = |
791 DecodeWasmSignatureForTesting(zone(), data, data + sizeof(data)); | 791 DecodeWasmSignatureForTesting(zone(), data, data + sizeof(data)); |
792 | 792 |
793 EXPECT_TRUE(sig != nullptr); | 793 EXPECT_TRUE(sig != nullptr); |
794 EXPECT_EQ(0u, sig->parameter_count()); | 794 EXPECT_EQ(0u, sig->parameter_count()); |
795 EXPECT_EQ(1u, sig->return_count()); | 795 EXPECT_EQ(1u, sig->return_count()); |
796 EXPECT_EQ(ret_type.type, sig->GetReturn()); | 796 EXPECT_EQ(ret_type.type, sig->GetReturn()); |
797 } | 797 } |
798 } | 798 } |
799 | 799 |
800 TEST_F(WasmSignatureDecodeTest, Ok_v_t) { | 800 TEST_F(WasmSignatureDecodeTest, Ok_v_t) { |
801 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { | 801 for (size_t i = 0; i < arraysize(kValueTypes); i++) { |
802 LocalTypePair param_type = kLocalTypes[i]; | 802 ValueTypePair param_type = kValueTypes[i]; |
803 const byte data[] = {SIG_ENTRY_v_x(param_type.code)}; | 803 const byte data[] = {SIG_ENTRY_v_x(param_type.code)}; |
804 FunctionSig* sig = | 804 FunctionSig* sig = |
805 DecodeWasmSignatureForTesting(zone(), data, data + sizeof(data)); | 805 DecodeWasmSignatureForTesting(zone(), data, data + sizeof(data)); |
806 | 806 |
807 EXPECT_TRUE(sig != nullptr); | 807 EXPECT_TRUE(sig != nullptr); |
808 EXPECT_EQ(1u, sig->parameter_count()); | 808 EXPECT_EQ(1u, sig->parameter_count()); |
809 EXPECT_EQ(0u, sig->return_count()); | 809 EXPECT_EQ(0u, sig->return_count()); |
810 EXPECT_EQ(param_type.type, sig->GetParam(0)); | 810 EXPECT_EQ(param_type.type, sig->GetParam(0)); |
811 } | 811 } |
812 } | 812 } |
813 | 813 |
814 TEST_F(WasmSignatureDecodeTest, Ok_t_t) { | 814 TEST_F(WasmSignatureDecodeTest, Ok_t_t) { |
815 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { | 815 for (size_t i = 0; i < arraysize(kValueTypes); i++) { |
816 LocalTypePair ret_type = kLocalTypes[i]; | 816 ValueTypePair ret_type = kValueTypes[i]; |
817 for (size_t j = 0; j < arraysize(kLocalTypes); j++) { | 817 for (size_t j = 0; j < arraysize(kValueTypes); j++) { |
818 LocalTypePair param_type = kLocalTypes[j]; | 818 ValueTypePair param_type = kValueTypes[j]; |
819 const byte data[] = {SIG_ENTRY_x_x(ret_type.code, param_type.code)}; | 819 const byte data[] = {SIG_ENTRY_x_x(ret_type.code, param_type.code)}; |
820 FunctionSig* sig = | 820 FunctionSig* sig = |
821 DecodeWasmSignatureForTesting(zone(), data, data + sizeof(data)); | 821 DecodeWasmSignatureForTesting(zone(), data, data + sizeof(data)); |
822 | 822 |
823 EXPECT_TRUE(sig != nullptr); | 823 EXPECT_TRUE(sig != nullptr); |
824 EXPECT_EQ(1u, sig->parameter_count()); | 824 EXPECT_EQ(1u, sig->parameter_count()); |
825 EXPECT_EQ(1u, sig->return_count()); | 825 EXPECT_EQ(1u, sig->return_count()); |
826 EXPECT_EQ(param_type.type, sig->GetParam(0)); | 826 EXPECT_EQ(param_type.type, sig->GetParam(0)); |
827 EXPECT_EQ(ret_type.type, sig->GetReturn()); | 827 EXPECT_EQ(ret_type.type, sig->GetReturn()); |
828 } | 828 } |
829 } | 829 } |
830 } | 830 } |
831 | 831 |
832 TEST_F(WasmSignatureDecodeTest, Ok_i_tt) { | 832 TEST_F(WasmSignatureDecodeTest, Ok_i_tt) { |
833 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { | 833 for (size_t i = 0; i < arraysize(kValueTypes); i++) { |
834 LocalTypePair p0_type = kLocalTypes[i]; | 834 ValueTypePair p0_type = kValueTypes[i]; |
835 for (size_t j = 0; j < arraysize(kLocalTypes); j++) { | 835 for (size_t j = 0; j < arraysize(kValueTypes); j++) { |
836 LocalTypePair p1_type = kLocalTypes[j]; | 836 ValueTypePair p1_type = kValueTypes[j]; |
837 const byte data[] = { | 837 const byte data[] = { |
838 SIG_ENTRY_x_xx(kLocalI32, p0_type.code, p1_type.code)}; | 838 SIG_ENTRY_x_xx(kLocalI32, p0_type.code, p1_type.code)}; |
839 FunctionSig* sig = | 839 FunctionSig* sig = |
840 DecodeWasmSignatureForTesting(zone(), data, data + sizeof(data)); | 840 DecodeWasmSignatureForTesting(zone(), data, data + sizeof(data)); |
841 | 841 |
842 EXPECT_TRUE(sig != nullptr); | 842 EXPECT_TRUE(sig != nullptr); |
843 EXPECT_EQ(2u, sig->parameter_count()); | 843 EXPECT_EQ(2u, sig->parameter_count()); |
844 EXPECT_EQ(1u, sig->return_count()); | 844 EXPECT_EQ(1u, sig->return_count()); |
845 EXPECT_EQ(p0_type.type, sig->GetParam(0)); | 845 EXPECT_EQ(p0_type.type, sig->GetParam(0)); |
846 EXPECT_EQ(p1_type.type, sig->GetParam(1)); | 846 EXPECT_EQ(p1_type.type, sig->GetParam(1)); |
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1047 }; | 1047 }; |
1048 ModuleResult result = DecodeModule(data, data + sizeof(data)); | 1048 ModuleResult result = DecodeModule(data, data + sizeof(data)); |
1049 EXPECT_OK(result); | 1049 EXPECT_OK(result); |
1050 | 1050 |
1051 EXPECT_EQ(1u, result.val->globals.size()); | 1051 EXPECT_EQ(1u, result.val->globals.size()); |
1052 EXPECT_EQ(0u, result.val->functions.size()); | 1052 EXPECT_EQ(0u, result.val->functions.size()); |
1053 EXPECT_EQ(0u, result.val->data_segments.size()); | 1053 EXPECT_EQ(0u, result.val->data_segments.size()); |
1054 | 1054 |
1055 const WasmGlobal* global = &result.val->globals.back(); | 1055 const WasmGlobal* global = &result.val->globals.back(); |
1056 | 1056 |
1057 EXPECT_EQ(kAstI32, global->type); | 1057 EXPECT_EQ(kWasmI32, global->type); |
1058 EXPECT_EQ(0u, global->offset); | 1058 EXPECT_EQ(0u, global->offset); |
1059 | 1059 |
1060 if (result.val) delete result.val; | 1060 if (result.val) delete result.val; |
1061 } | 1061 } |
1062 | 1062 |
1063 TEST_F(WasmModuleVerifyTest, ImportTable_empty) { | 1063 TEST_F(WasmModuleVerifyTest, ImportTable_empty) { |
1064 static const byte data[] = {SECTION(Type, 1), 0, SECTION(Import, 1), 0}; | 1064 static const byte data[] = {SECTION(Type, 1), 0, SECTION(Import, 1), 0}; |
1065 EXPECT_VERIFIES(data); | 1065 EXPECT_VERIFIES(data); |
1066 } | 1066 } |
1067 | 1067 |
(...skipping 436 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1504 SECTION(Unknown, 4), 1, 'X', 17, 18, // -- | 1504 SECTION(Unknown, 4), 1, 'X', 17, 18, // -- |
1505 SECTION(Unknown, 9), 3, 'f', 'o', 'o', 5, 6, 7, 8, 9, // -- | 1505 SECTION(Unknown, 9), 3, 'f', 'o', 'o', 5, 6, 7, 8, 9, // -- |
1506 SECTION(Unknown, 8), 5, 'o', 't', 'h', 'e', 'r', 7, 8, // -- | 1506 SECTION(Unknown, 8), 5, 'o', 't', 'h', 'e', 'r', 7, 8, // -- |
1507 }; | 1507 }; |
1508 EXPECT_VERIFIES(data); | 1508 EXPECT_VERIFIES(data); |
1509 } | 1509 } |
1510 | 1510 |
1511 } // namespace wasm | 1511 } // namespace wasm |
1512 } // namespace internal | 1512 } // namespace internal |
1513 } // namespace v8 | 1513 } // namespace v8 |
OLD | NEW |