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

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

Powered by Google App Engine
This is Rietveld 408576698