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

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

Issue 1744713003: [wasm] Add an export table. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 10 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-opcodes.h" 8 #include "src/wasm/wasm-opcodes.h"
9 9
10 namespace v8 { 10 namespace v8 {
11 namespace internal { 11 namespace internal {
12 namespace wasm { 12 namespace wasm {
13 13
14 #define VOID_VOID_SIG 0, kLocalVoid
15 #define INT_INT_SIG 1, kLocalI32, kLocalI32
16 #define NOP_FUNCTION(sig_index) \
17 0, static_cast<byte>(sig_index), 0, 1, 0, kExprNop
18 #define EMPTY_FUNCTION(sig_index) 0, static_cast<byte>(sig_index), 0, 0, 0
19
20 #define U32(v) \
21 static_cast<byte>(v), static_cast<byte>(v >> 8), static_cast<byte>(v >> 16), \
22 static_cast<byte>(v >> 24)
23 #define U16(v) static_cast<byte>(v), static_cast<byte>(v >> 8)
24 #define U8(v) static_cast<byte>(v)
25
26 #define SIG_INDEX(v) U16(v)
27 #define FUNC_INDEX(v) U16(v)
28 #define NAME_OFFSET(v) U32(v)
29
14 class WasmModuleVerifyTest : public TestWithZone { 30 class WasmModuleVerifyTest : public TestWithZone {
15 public: 31 public:
16 ModuleResult DecodeModule(const byte* module_start, const byte* module_end) { 32 ModuleResult DecodeModule(const byte* module_start, const byte* module_end) {
17 return DecodeWasmModule(nullptr, zone(), module_start, module_end, false, 33 return DecodeWasmModule(nullptr, zone(), module_start, module_end, false,
18 false); 34 false);
19 } 35 }
20 }; 36 };
21 37
22 38
23 #define EXPECT_VERIFIES(data) \ 39 #define EXPECT_VERIFIES(data) \
(...skipping 14 matching lines...) Expand all
38 54
39 struct LocalTypePair { 55 struct LocalTypePair {
40 uint8_t code; 56 uint8_t code;
41 LocalType type; 57 LocalType type;
42 } kLocalTypes[] = {{kLocalI32, kAstI32}, 58 } kLocalTypes[] = {{kLocalI32, kAstI32},
43 {kLocalI64, kAstI64}, 59 {kLocalI64, kAstI64},
44 {kLocalF32, kAstF32}, 60 {kLocalF32, kAstF32},
45 {kLocalF64, kAstF64}}; 61 {kLocalF64, kAstF64}};
46 62
47 63
48 // TODO(titzer): use these macros everywhere below.
49 #define U32_LE(v) \
50 static_cast<byte>(v), static_cast<byte>((v) >> 8), \
51 static_cast<byte>((v) >> 16), static_cast<byte>((v) >> 24)
52
53
54 #define U16_LE(v) static_cast<byte>(v), static_cast<byte>((v) >> 8)
55
56
57 TEST_F(WasmModuleVerifyTest, DecodeEmpty) { 64 TEST_F(WasmModuleVerifyTest, DecodeEmpty) {
58 static const byte data[1]{kDeclEnd}; 65 static const byte data[1]{kDeclEnd};
59 { 66 {
60 ModuleResult result = DecodeModule(data, data); 67 ModuleResult result = DecodeModule(data, data);
61 EXPECT_TRUE(result.ok()); 68 EXPECT_TRUE(result.ok());
62 if (result.val) delete result.val; 69 if (result.val) delete result.val;
63 } 70 }
64 { 71 {
65 ModuleResult result = DecodeModule(data, data + 1); 72 ModuleResult result = DecodeModule(data, data + 1);
66 EXPECT_TRUE(result.ok()); 73 EXPECT_TRUE(result.ok());
67 if (result.val) delete result.val; 74 if (result.val) delete result.val;
68 } 75 }
69 } 76 }
70 77
71 78
72 TEST_F(WasmModuleVerifyTest, OneGlobal) { 79 TEST_F(WasmModuleVerifyTest, OneGlobal) {
73 static const byte data[] = { 80 static const byte data[] = {
74 kDeclGlobals, 81 kDeclGlobals,
75 1, 82 1,
76 0, 83 NAME_OFFSET(0),
77 0,
78 0,
79 0, // name offset
80 kMemI32, // memory type 84 kMemI32, // memory type
81 0, // exported 85 0, // exported
82 }; 86 };
83 87
84 { 88 {
85 // Should decode to exactly one global. 89 // Should decode to exactly one global.
86 ModuleResult result = DecodeModule(data, data + arraysize(data)); 90 ModuleResult result = DecodeModule(data, data + arraysize(data));
87 EXPECT_TRUE(result.ok()); 91 EXPECT_TRUE(result.ok());
88 EXPECT_EQ(1, result.val->globals->size()); 92 EXPECT_EQ(1, result.val->globals->size());
89 EXPECT_EQ(0, result.val->functions->size()); 93 EXPECT_EQ(0, result.val->functions->size());
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
128 } else { 132 } else {
129 buffer.push_back(static_cast<byte>(out)); 133 buffer.push_back(static_cast<byte>(out));
130 break; 134 break;
131 } 135 }
132 } 136 }
133 } 137 }
134 138
135 139
136 TEST_F(WasmModuleVerifyTest, NGlobals) { 140 TEST_F(WasmModuleVerifyTest, NGlobals) {
137 static const byte data[] = { 141 static const byte data[] = {
138 0, 0, 0, 0, // name offset 142 NAME_OFFSET(0), // name offset
139 kMemI32, // memory type 143 kMemI32, // memory type
140 0, // exported 144 0, // exported
141 }; 145 };
142 for (uint32_t i = 0; i < 1000000; i = i * 7 + 1) { 146 for (uint32_t i = 0; i < 1000000; i = i * 7 + 1) {
143 std::vector<byte> buffer; 147 std::vector<byte> buffer;
144 buffer.push_back(kDeclGlobals); 148 buffer.push_back(kDeclGlobals);
145 AppendUint32v(buffer, i); 149 AppendUint32v(buffer, i);
146 for (uint32_t j = 0; j < i; j++) { 150 for (uint32_t j = 0; j < i; j++) {
147 buffer.insert(buffer.end(), data, data + arraysize(data)); 151 buffer.insert(buffer.end(), data, data + arraysize(data));
148 } 152 }
149 153
150 ModuleResult result = DecodeModule(&buffer[0], &buffer[0] + buffer.size()); 154 ModuleResult result = DecodeModule(&buffer[0], &buffer[0] + buffer.size());
151 EXPECT_TRUE(result.ok()); 155 EXPECT_TRUE(result.ok());
152 if (result.val) delete result.val; 156 if (result.val) delete result.val;
153 } 157 }
154 } 158 }
155 159
156 160
157 TEST_F(WasmModuleVerifyTest, GlobalWithInvalidNameOffset) { 161 TEST_F(WasmModuleVerifyTest, GlobalWithInvalidNameOffset) {
158 static const byte data[] = { 162 static const byte data[] = {
159 kDeclGlobals, 163 kDeclGlobals,
160 1, // declare one global 164 1, // declare one global
161 0, 165 0,
162 3, 166 3,
163 0, 167 NAME_OFFSET(0), // name offset
164 0, // name offset 168 kMemI32, // memory type
165 kMemI32, // memory type 169 0, // exported
166 0, // exported
167 }; 170 };
168 171
169 EXPECT_FAILURE(data); 172 EXPECT_FAILURE(data);
170 } 173 }
171 174
172 175
173 TEST_F(WasmModuleVerifyTest, GlobalWithInvalidMemoryType) { 176 TEST_F(WasmModuleVerifyTest, GlobalWithInvalidMemoryType) {
174 static const byte data[] = { 177 static const byte data[] = {
175 kDeclGlobals, 178 kDeclGlobals,
176 1, // declare one global 179 1, // declare one global
177 0, 180 NAME_OFFSET(0), // name offset
178 0, 181 33, // memory type
179 0, 182 0, // exported
180 0, // name offset
181 33, // memory type
182 0, // exported
183 }; 183 };
184 184
185 EXPECT_FAILURE(data); 185 EXPECT_FAILURE(data);
186 } 186 }
187 187
188 188
189 TEST_F(WasmModuleVerifyTest, TwoGlobals) { 189 TEST_F(WasmModuleVerifyTest, TwoGlobals) {
190 static const byte data[] = { 190 static const byte data[] = {
191 kDeclGlobals, 191 kDeclGlobals,
192 2, 192 2,
193 0, 193 NAME_OFFSET(0), // #0: name offset
194 0, 194 kMemF32, // memory type
195 0, 195 0, // exported
196 0, // #0: name offset 196 NAME_OFFSET(0), // #1: name offset
197 kMemF32, // memory type 197 kMemF64, // memory type
198 0, // exported 198 1, // exported
199 0,
200 0,
201 0,
202 0, // #1: name offset
203 kMemF64, // memory type
204 1, // exported
205 }; 199 };
206 200
207 { 201 {
208 // Should decode to exactly two globals. 202 // Should decode to exactly two globals.
209 ModuleResult result = DecodeModule(data, data + arraysize(data)); 203 ModuleResult result = DecodeModule(data, data + arraysize(data));
210 EXPECT_TRUE(result.ok()); 204 EXPECT_TRUE(result.ok());
211 EXPECT_EQ(2, result.val->globals->size()); 205 EXPECT_EQ(2, result.val->globals->size());
212 EXPECT_EQ(0, result.val->functions->size()); 206 EXPECT_EQ(0, result.val->functions->size());
213 EXPECT_EQ(0, result.val->data_segments->size()); 207 EXPECT_EQ(0, result.val->data_segments->size());
214 208
(...skipping 16 matching lines...) Expand all
231 for (size_t size = 1; size < arraysize(data); size++) { 225 for (size_t size = 1; size < arraysize(data); size++) {
232 // Should fall off end of module bytes. 226 // Should fall off end of module bytes.
233 ModuleResult result = DecodeModule(data, data + size); 227 ModuleResult result = DecodeModule(data, data + size);
234 EXPECT_FALSE(result.ok()); 228 EXPECT_FALSE(result.ok());
235 if (result.val) delete result.val; 229 if (result.val) delete result.val;
236 } 230 }
237 } 231 }
238 232
239 233
240 TEST_F(WasmModuleVerifyTest, OneSignature) { 234 TEST_F(WasmModuleVerifyTest, OneSignature) {
241 static const byte data[] = { 235 {
242 kDeclSignatures, 1, 0, kLocalVoid // void -> void 236 static const byte data[] = {kDeclSignatures, 1, VOID_VOID_SIG};
243 }; 237 EXPECT_VERIFIES(data);
244 EXPECT_VERIFIES(data); 238 }
239
240 {
241 static const byte data[] = {kDeclSignatures, 1, INT_INT_SIG};
242 EXPECT_VERIFIES(data);
243 }
245 } 244 }
246 245
247 246
248 TEST_F(WasmModuleVerifyTest, MultipleSignatures) { 247 TEST_F(WasmModuleVerifyTest, MultipleSignatures) {
249 static const byte data[] = { 248 static const byte data[] = {
250 kDeclSignatures, 249 kDeclSignatures,
251 3, 250 3,
252 0, 251 0,
253 kLocalVoid, // void -> void 252 kLocalVoid, // void -> void
254 1, 253 1,
(...skipping 25 matching lines...) Expand all
280 EXPECT_FALSE(result.ok()); 279 EXPECT_FALSE(result.ok());
281 if (result.val) delete result.val; 280 if (result.val) delete result.val;
282 } 281 }
283 } 282 }
284 283
285 284
286 TEST_F(WasmModuleVerifyTest, FunctionWithoutSig) { 285 TEST_F(WasmModuleVerifyTest, FunctionWithoutSig) {
287 static const byte data[] = { 286 static const byte data[] = {
288 kDeclFunctions, 1, 287 kDeclFunctions, 1,
289 // func#0 ------------------------------------------------------ 288 // func#0 ------------------------------------------------------
290 0, 0, // signature index 289 SIG_INDEX(0), // signature index
291 0, 0, 0, 0, // name offset 290 NAME_OFFSET(0), // name offset
292 0, 0, 0, 0, // code start offset 291 U32(0), // code start offset
293 0, 0, 0, 0, // code end offset 292 U32(0), // code end offset
294 1, 2, // local int32 count 293 U16(899), // local int32 count
295 3, 4, // local int64 count 294 U16(799), // local int64 count
296 5, 6, // local float32 count 295 U16(699), // local float32 count
297 7, 8, // local float64 count 296 U16(599), // local float64 count
298 0, // exported 297 0, // exported
299 1 // external 298 1 // external
300 }; 299 };
301 300
302 ModuleResult result = DecodeModule(data, data + arraysize(data)); 301 ModuleResult result = DecodeModule(data, data + arraysize(data));
303 EXPECT_FALSE(result.ok()); 302 EXPECT_FALSE(result.ok());
304 if (result.val) delete result.val; 303 if (result.val) delete result.val;
305 } 304 }
306 305
307 306
308 TEST_F(WasmModuleVerifyTest, OneEmptyVoidVoidFunction) { 307 TEST_F(WasmModuleVerifyTest, OneEmptyVoidVoidFunction) {
309 const int kCodeStartOffset = 23; 308 const int kCodeStartOffset = 23;
310 const int kCodeEndOffset = kCodeStartOffset + 1; 309 const int kCodeEndOffset = kCodeStartOffset + 1;
311 310
312 static const byte data[] = { 311 static const byte data[] = {
313 kDeclSignatures, 1, 312 kDeclSignatures, 1,
314 // sig#0 ------------------------------------------------------- 313 // sig#0 -------------------------------------------------------
315 0, 0, // void -> void 314 VOID_VOID_SIG,
316 // func#0 ------------------------------------------------------ 315 // func#0 ------------------------------------------------------
317 kDeclFunctions, 1, 316 kDeclFunctions, 1,
318 kDeclFunctionLocals | kDeclFunctionExport | kDeclFunctionName, 0, 317 kDeclFunctionLocals | kDeclFunctionExport | kDeclFunctionName, 0,
319 0, // signature index 318 0, // signature index
320 9, 0, 0, 0, // name offset 319 NAME_OFFSET(9), // name offset
321 11, 2, // local int32 count 320 U16(1466), // local int32 count
322 13, 4, // local int64 count 321 U16(1355), // local int64 count
323 15, 6, // local float32 count 322 U16(1244), // local float32 count
324 17, 8, // local float64 count 323 U16(1133), // local float64 count
325 1, 0, // size 324 1, 0, // size
326 kExprNop, 325 kExprNop,
327 }; 326 };
328 327
329 { 328 {
330 // Should decode to exactly one function. 329 // Should decode to exactly one function.
331 ModuleResult result = DecodeModule(data, data + arraysize(data)); 330 ModuleResult result = DecodeModule(data, data + arraysize(data));
332 EXPECT_TRUE(result.ok()); 331 EXPECT_TRUE(result.ok());
333 EXPECT_EQ(0, result.val->globals->size()); 332 EXPECT_EQ(0, result.val->globals->size());
334 EXPECT_EQ(1, result.val->signatures->size()); 333 EXPECT_EQ(1, result.val->signatures->size());
335 EXPECT_EQ(1, result.val->functions->size()); 334 EXPECT_EQ(1, result.val->functions->size());
336 EXPECT_EQ(0, result.val->data_segments->size()); 335 EXPECT_EQ(0, result.val->data_segments->size());
337 EXPECT_EQ(0, result.val->function_table->size()); 336 EXPECT_EQ(0, result.val->function_table->size());
338 337
339 WasmFunction* function = &result.val->functions->back(); 338 WasmFunction* function = &result.val->functions->back();
340 339
341 EXPECT_EQ(9, function->name_offset); 340 EXPECT_EQ(9, function->name_offset);
342 EXPECT_EQ(kCodeStartOffset, function->code_start_offset); 341 EXPECT_EQ(kCodeStartOffset, function->code_start_offset);
343 EXPECT_EQ(kCodeEndOffset, function->code_end_offset); 342 EXPECT_EQ(kCodeEndOffset, function->code_end_offset);
344 343
345 EXPECT_EQ(523, function->local_i32_count); 344 EXPECT_EQ(1466, function->local_i32_count);
346 EXPECT_EQ(1037, function->local_i64_count); 345 EXPECT_EQ(1355, function->local_i64_count);
347 EXPECT_EQ(1551, function->local_f32_count); 346 EXPECT_EQ(1244, function->local_f32_count);
348 EXPECT_EQ(2065, function->local_f64_count); 347 EXPECT_EQ(1133, function->local_f64_count);
349 348
350 EXPECT_TRUE(function->exported); 349 EXPECT_TRUE(function->exported);
351 EXPECT_FALSE(function->external); 350 EXPECT_FALSE(function->external);
352 351
353 if (result.val) delete result.val; 352 if (result.val) delete result.val;
354 } 353 }
355 354
356 for (size_t size = 5; size < arraysize(data); size++) { 355 for (size_t size = 5; size < arraysize(data); size++) {
357 // Should fall off end of module bytes. 356 // Should fall off end of module bytes.
358 ModuleResult result = DecodeModule(data, data + size); 357 ModuleResult result = DecodeModule(data, data + size);
359 EXPECT_FALSE(result.ok()); 358 EXPECT_FALSE(result.ok());
360 if (result.val) delete result.val; 359 if (result.val) delete result.val;
361 } 360 }
362 } 361 }
363 362
364 363
365 TEST_F(WasmModuleVerifyTest, OneFunctionImported) { 364 TEST_F(WasmModuleVerifyTest, OneFunctionImported) {
366 static const byte data[] = { 365 static const byte data[] = {
367 kDeclSignatures, 1, 366 kDeclSignatures, 1,
368 // sig#0 ------------------------------------------------------- 367 // sig#0 -------------------------------------------------------
369 0, 0, // void -> void 368 VOID_VOID_SIG, kDeclFunctions, 1,
370 kDeclFunctions, 1,
371 // func#0 ------------------------------------------------------ 369 // func#0 ------------------------------------------------------
372 kDeclFunctionImport, // no name, no locals, imported 370 kDeclFunctionImport, // no name, no locals, imported
373 0, 0, // signature index 371 U16(0),
374 }; 372 };
375 373
376 ModuleResult result = DecodeModule(data, data + arraysize(data)); 374 ModuleResult result = DecodeModule(data, data + arraysize(data));
377 EXPECT_TRUE(result.ok()); 375 EXPECT_TRUE(result.ok());
378 EXPECT_EQ(1, result.val->functions->size()); 376 EXPECT_EQ(1, result.val->functions->size());
379 WasmFunction* function = &result.val->functions->back(); 377 WasmFunction* function = &result.val->functions->back();
380 378
381 EXPECT_EQ(0, function->name_offset); 379 EXPECT_EQ(0, function->name_offset);
382 EXPECT_EQ(0, function->code_start_offset); 380 EXPECT_EQ(0, function->code_start_offset);
383 EXPECT_EQ(0, function->code_end_offset); 381 EXPECT_EQ(0, function->code_end_offset);
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after
636 634
637 for (int source_offset = 0; source_offset < 5 + kDataSize; source_offset++) { 635 for (int source_offset = 0; source_offset < 5 + kDataSize; source_offset++) {
638 for (int source_size = -1; source_size < 5 + kDataSize; source_size += 3) { 636 for (int source_size = -1; source_size < 5 + kDataSize; source_size += 3) {
639 byte data[] = { 637 byte data[] = {
640 kDeclMemory, 638 kDeclMemory,
641 mem_size_log2, 639 mem_size_log2,
642 mem_size_log2, 640 mem_size_log2,
643 1, 641 1,
644 kDeclDataSegments, 642 kDeclDataSegments,
645 1, 643 1,
646 U32_LE(dest_addr), 644 U32(dest_addr),
647 U32_LE(source_offset), 645 U32(source_offset),
648 U32_LE(source_size), 646 U32(source_size),
649 1, // init 647 1, // init
650 }; 648 };
651 649
652 STATIC_ASSERT(kDataSize == arraysize(data)); 650 STATIC_ASSERT(kDataSize == arraysize(data));
653 651
654 if (source_offset < kDataSize && source_size >= 0 && 652 if (source_offset < kDataSize && source_size >= 0 &&
655 (source_offset + source_size) <= kDataSize) { 653 (source_offset + source_size) <= kDataSize) {
656 EXPECT_VERIFIES(data); 654 EXPECT_VERIFIES(data);
657 } else { 655 } else {
658 EXPECT_FAILURE(data); 656 EXPECT_FAILURE(data);
(...skipping 12 matching lines...) Expand all
671 669
672 for (int dest_addr = mem_size - source_size; 670 for (int dest_addr = mem_size - source_size;
673 dest_addr < mem_size + source_size; dest_addr++) { 671 dest_addr < mem_size + source_size; dest_addr++) {
674 byte data[] = { 672 byte data[] = {
675 kDeclMemory, 673 kDeclMemory,
676 mem_size_log2, 674 mem_size_log2,
677 mem_size_log2, 675 mem_size_log2,
678 1, 676 1,
679 kDeclDataSegments, 677 kDeclDataSegments,
680 1, 678 1,
681 U32_LE(dest_addr), 679 U32(dest_addr),
682 U32_LE(source_offset), 680 U32(source_offset),
683 U32_LE(source_size), 681 U32(source_size),
684 1, // init 682 1, // init
685 }; 683 };
686 684
687 if (dest_addr <= (mem_size - source_size)) { 685 if (dest_addr <= (mem_size - source_size)) {
688 EXPECT_VERIFIES(data); 686 EXPECT_VERIFIES(data);
689 } else { 687 } else {
690 EXPECT_FAILURE(data); 688 EXPECT_FAILURE(data);
691 } 689 }
692 } 690 }
693 } 691 }
(...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after
1011 EXPECT_VERIFIES(data); 1009 EXPECT_VERIFIES(data);
1012 } 1010 }
1013 1011
1014 TEST_F(WasmModuleVerifyTest, ImportTable_nosigs) { 1012 TEST_F(WasmModuleVerifyTest, ImportTable_nosigs) {
1015 static const byte data[] = {kDeclImportTable, 0}; 1013 static const byte data[] = {kDeclImportTable, 0};
1016 EXPECT_FAILURE(data); 1014 EXPECT_FAILURE(data);
1017 } 1015 }
1018 1016
1019 TEST_F(WasmModuleVerifyTest, ImportTable_invalid_sig) { 1017 TEST_F(WasmModuleVerifyTest, ImportTable_invalid_sig) {
1020 static const byte data[] = { 1018 static const byte data[] = {
1021 kDeclSignatures, 1019 kDeclSignatures, 0, kDeclImportTable, 1,
1022 0, 1020 SIG_INDEX(0), // sig index
1023 kDeclImportTable, 1021 NAME_OFFSET(1), // module name
1024 1, 1022 NAME_OFFSET(1), // function name
1025 0,
1026 0, // sig index
1027 1,
1028 0,
1029 0,
1030 0, // module name
1031 1,
1032 0,
1033 0,
1034 0 // function name
1035 }; 1023 };
1036 EXPECT_FAILURE(data); 1024 EXPECT_FAILURE(data);
1037 } 1025 }
1038 1026
1039 TEST_F(WasmModuleVerifyTest, ImportTable_one_sig) { 1027 TEST_F(WasmModuleVerifyTest, ImportTable_one_sig) {
1040 static const byte data[] = { 1028 static const byte data[] = {
1041 kDeclSignatures, 1029 kDeclSignatures,
1042 1, 1030 1,
1043 0, 1031 VOID_VOID_SIG,
1044 static_cast<byte>(kAstStmt),
1045 kDeclImportTable, 1032 kDeclImportTable,
1046 1, 1033 1, // --
1047 0, 1034 SIG_INDEX(0), // sig index
1048 0, // sig index 1035 NAME_OFFSET(1), // module name
1049 1, 1036 NAME_OFFSET(1) // function name
1050 0,
1051 0,
1052 0, // module name
1053 1,
1054 0,
1055 0,
1056 0 // function name
1057 }; 1037 };
1058 EXPECT_VERIFIES(data); 1038 EXPECT_VERIFIES(data);
1059 } 1039 }
1060 1040
1061 TEST_F(WasmModuleVerifyTest, ImportTable_off_end) { 1041 TEST_F(WasmModuleVerifyTest, ImportTable_off_end) {
1062 static const byte data[] = { 1042 static const byte data[] = {
1063 kDeclSignatures, 1043 kDeclSignatures, 1, VOID_VOID_SIG, kDeclImportTable, 1,
1064 1, 1044 SIG_INDEX(0), // sig index
1065 0, 1045 NAME_OFFSET(1), // module name
1066 static_cast<byte>(kAstStmt), 1046 NAME_OFFSET(1), // function name
1067 kDeclImportTable,
1068 1,
1069 0,
1070 0, // sig index
1071 1,
1072 0,
1073 0,
1074 0, // module name
1075 1,
1076 0,
1077 0,
1078 0 // function name
1079 }; 1047 };
1080 1048
1081 for (size_t length = 5; length < sizeof(data); length++) { 1049 for (size_t length = 5; length < sizeof(data); length++) {
1082 ModuleResult result = DecodeModule(data, data + length); 1050 ModuleResult result = DecodeModule(data, data + length);
1083 EXPECT_FALSE(result.ok()); 1051 EXPECT_FALSE(result.ok());
1084 if (result.val) delete result.val; 1052 if (result.val) delete result.val;
1085 } 1053 }
1086 } 1054 }
1087 1055
1056 TEST_F(WasmModuleVerifyTest, ExportTable_empty) {
1057 static const byte data[] = {kDeclSignatures, 0, kDeclFunctions, 0,
1058 kDeclExportTable, 0};
1059 EXPECT_VERIFIES(data);
1060 }
1061
1062 TEST_F(WasmModuleVerifyTest, ExportTable_NoFunctions1) {
1063 static const byte data[] = {kDeclSignatures, 0, kDeclExportTable, 0};
1064 EXPECT_FAILURE(data);
1065 }
1066
1067 TEST_F(WasmModuleVerifyTest, ExportTable_NoFunctions2) {
1068 static const byte data[] = {kDeclExportTable, 0};
1069 EXPECT_FAILURE(data);
1070 }
1071
1072 TEST_F(WasmModuleVerifyTest, ExportTableOne) {
1073 static const byte data[] = {
1074 kDeclSignatures, 1, // sigs
1075 VOID_VOID_SIG, // --
1076 kDeclFunctions, 1, // functions
1077 EMPTY_FUNCTION(0), // --
1078 kDeclExportTable, 1, // exports
1079 FUNC_INDEX(0), // --
1080 NAME_OFFSET(0) // --
1081 };
1082 EXPECT_VERIFIES(data);
1083 }
1084
1085 TEST_F(WasmModuleVerifyTest, ExportTableTwo) {
1086 static const byte data[] = {
1087 kDeclSignatures, 1, // sigs
1088 VOID_VOID_SIG, // --
1089 kDeclFunctions, 1, // functions
1090 EMPTY_FUNCTION(0), // --
1091 kDeclExportTable, 2, // exports
1092 FUNC_INDEX(0), // --
1093 NAME_OFFSET(1), // --
1094 FUNC_INDEX(0), // --
1095 NAME_OFFSET(2) // --
1096 };
1097 EXPECT_VERIFIES(data);
1098 }
1099
1100 TEST_F(WasmModuleVerifyTest, ExportTableThree) {
1101 static const byte data[] = {
1102 kDeclSignatures, 1, // sigs
1103 VOID_VOID_SIG, // --
1104 kDeclFunctions, 3, // functions
1105 EMPTY_FUNCTION(0), // --
1106 EMPTY_FUNCTION(0), // --
1107 EMPTY_FUNCTION(0), // --
1108 kDeclExportTable, 3, // exports
1109 FUNC_INDEX(0), // --
1110 NAME_OFFSET(1), // --
1111 FUNC_INDEX(1), // --
1112 NAME_OFFSET(2), // --
1113 FUNC_INDEX(2), // --
1114 NAME_OFFSET(2) // --
1115 };
1116 EXPECT_VERIFIES(data);
1117 }
1118
1119 TEST_F(WasmModuleVerifyTest, ExportTableThreeOne) {
1120 for (byte i = 0; i < 6; i++) {
1121 const byte data[] = {
1122 kDeclSignatures, 1, // sigs
1123 VOID_VOID_SIG, // --
1124 kDeclFunctions, 3, // functions
1125 EMPTY_FUNCTION(0), // --
1126 EMPTY_FUNCTION(0), // --
1127 EMPTY_FUNCTION(0), // --
1128 kDeclExportTable, 1, // exports
1129 FUNC_INDEX(i), // --
1130 NAME_OFFSET(1) // --
1131 };
1132
1133 if (i < 3) {
1134 EXPECT_VERIFIES(data);
1135 } else {
1136 EXPECT_FAILURE(data);
1137 }
1138 }
1139 }
1140
1141 TEST_F(WasmModuleVerifyTest, ExportTableOne_off_end) {
1142 static const byte data[] = {
1143 kDeclSignatures, 1, // sigs
1144 VOID_VOID_SIG, // --
1145 kDeclFunctions, 1, // functions
1146 EMPTY_FUNCTION(0), // --
1147 kDeclExportTable, 1, // exports
1148 FUNC_INDEX(0), // --
1149 NAME_OFFSET(0) // --
1150 };
1151
1152 for (int length = 13; length < sizeof(data); length++) {
1153 ModuleResult result = DecodeModule(data, data + length);
1154 EXPECT_FALSE(result.ok());
1155 if (result.val) delete result.val;
1156 }
1157 }
1158
1088 } // namespace wasm 1159 } // namespace wasm
1089 } // namespace internal 1160 } // namespace internal
1090 } // namespace v8 1161 } // namespace v8
OLDNEW
« test/mjsunit/wasm/export-table.js ('K') | « test/mjsunit/wasm/wasm-constants.js ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698