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

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

Issue 1504713014: Initial import of v8-native WASM. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years 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/unittests/wasm/encoder-unittest.cc ('k') | test/unittests/wasm/wasm-macro-gen-unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "test/unittests/test-utils.h"
6
7 #include "src/wasm/module-decoder.h"
8 #include "src/wasm/wasm-opcodes.h"
9
10 namespace v8 {
11 namespace internal {
12 namespace wasm {
13
14 class WasmModuleVerifyTest : public TestWithZone {
15 public:
16 ModuleResult DecodeModule(const byte* module_start, const byte* module_end) {
17 return DecodeWasmModule(nullptr, zone(), module_start, module_end, false,
18 false);
19 }
20 };
21
22
23 #define EXPECT_VERIFIES(data) \
24 do { \
25 ModuleResult result = DecodeModule(data, data + arraysize(data)); \
26 EXPECT_TRUE(result.ok()); \
27 } while (false)
28
29
30 #define EXPECT_FAILURE(data) \
31 do { \
32 ModuleResult result = DecodeModule(data, data + arraysize(data)); \
33 EXPECT_FALSE(result.ok()); \
34 } while (false)
35
36
37 struct LocalTypePair {
38 uint8_t code;
39 LocalType type;
40 } kLocalTypes[] = {{kLocalI32, kAstI32},
41 {kLocalI64, kAstI64},
42 {kLocalF32, kAstF32},
43 {kLocalF64, kAstF64}};
44
45
46 TEST_F(WasmModuleVerifyTest, DecodeEmpty) {
47 static const byte data[1]{kDeclEnd};
48 {
49 ModuleResult result = DecodeModule(data, data);
50 EXPECT_TRUE(result.ok());
51 }
52 {
53 ModuleResult result = DecodeModule(data, data + 1);
54 EXPECT_TRUE(result.ok());
55 }
56 }
57
58
59 TEST_F(WasmModuleVerifyTest, OneGlobal) {
60 const byte data[] = {
61 kDeclGlobals,
62 1,
63 0,
64 0,
65 0,
66 0, // name offset
67 kMemI32, // memory type
68 0, // exported
69 };
70
71 {
72 // Should decode to exactly one global.
73 ModuleResult result = DecodeModule(data, data + arraysize(data));
74 EXPECT_TRUE(result.ok());
75 EXPECT_EQ(1, result.val->globals->size());
76 EXPECT_EQ(0, result.val->functions->size());
77 EXPECT_EQ(0, result.val->data_segments->size());
78
79 WasmGlobal* global = &result.val->globals->back();
80
81 EXPECT_EQ(0, global->name_offset);
82 EXPECT_EQ(MachineType::Int32(), global->type);
83 EXPECT_EQ(0, global->offset);
84 EXPECT_EQ(false, global->exported);
85 }
86
87 for (size_t size = 1; size < arraysize(data); size++) {
88 // Should fall off end of module bytes.
89 ModuleResult result = DecodeModule(data, data + size);
90 EXPECT_FALSE(result.ok());
91 }
92 }
93
94
95 TEST_F(WasmModuleVerifyTest, ZeroGlobals) {
96 const byte data[] = {
97 kDeclGlobals, 0, // declare 0 globals
98 };
99 ModuleResult result = DecodeModule(data, data + arraysize(data));
100 EXPECT_TRUE(result.ok());
101 }
102
103
104 static void AppendUint32v(std::vector<byte>& buffer, uint32_t val) {
105 while (true) {
106 uint32_t next = val >> 7;
107 uint32_t out = val & 0x7f;
108 if (next) {
109 buffer.push_back(static_cast<byte>(0x80 | out));
110 val = next;
111 } else {
112 buffer.push_back(static_cast<byte>(out));
113 break;
114 }
115 }
116 }
117
118
119 TEST_F(WasmModuleVerifyTest, NGlobals) {
120 const byte data[] = {
121 0, 0, 0, 0, // name offset
122 kMemI32, // memory type
123 0, // exported
124 };
125 for (uint32_t i = 0; i < 1000000; i = i * 7 + 1) {
126 std::vector<byte> buffer;
127 buffer.push_back(kDeclGlobals);
128 AppendUint32v(buffer, i);
129 for (int j = 0; j < i; j++) {
130 buffer.insert(buffer.end(), data, data + arraysize(data));
131 }
132
133 ModuleResult result = DecodeModule(&buffer[0], &buffer[0] + buffer.size());
134 EXPECT_TRUE(result.ok());
135 }
136 }
137
138
139 TEST_F(WasmModuleVerifyTest, GlobalWithInvalidNameOffset) {
140 const byte data[] = {
141 kDeclGlobals,
142 1, // declare one global
143 0,
144 3,
145 0,
146 0, // name offset
147 kMemI32, // memory type
148 0, // exported
149 };
150
151 EXPECT_FAILURE(data);
152 }
153
154
155 TEST_F(WasmModuleVerifyTest, GlobalWithInvalidMemoryType) {
156 const byte data[] = {
157 kDeclGlobals,
158 1, // declare one global
159 0,
160 0,
161 0,
162 0, // name offset
163 33, // memory type
164 0, // exported
165 };
166
167 EXPECT_FAILURE(data);
168 }
169
170
171 TEST_F(WasmModuleVerifyTest, TwoGlobals) {
172 const byte data[] = {
173 kDeclGlobals,
174 2,
175 0,
176 0,
177 0,
178 0, // #0: name offset
179 kMemF32, // memory type
180 0, // exported
181 0,
182 0,
183 0,
184 0, // #1: name offset
185 kMemF64, // memory type
186 1, // exported
187 };
188
189 {
190 // Should decode to exactly two globals.
191 ModuleResult result = DecodeModule(data, data + arraysize(data));
192 EXPECT_TRUE(result.ok());
193 EXPECT_EQ(2, result.val->globals->size());
194 EXPECT_EQ(0, result.val->functions->size());
195 EXPECT_EQ(0, result.val->data_segments->size());
196
197 WasmGlobal* g0 = &result.val->globals->at(0);
198 WasmGlobal* g1 = &result.val->globals->at(1);
199
200 EXPECT_EQ(0, g0->name_offset);
201 EXPECT_EQ(MachineType::Float32(), g0->type);
202 EXPECT_EQ(0, g0->offset);
203 EXPECT_EQ(false, g0->exported);
204
205 EXPECT_EQ(0, g1->name_offset);
206 EXPECT_EQ(MachineType::Float64(), g1->type);
207 EXPECT_EQ(0, g1->offset);
208 EXPECT_EQ(true, g1->exported);
209 }
210
211 for (size_t size = 1; size < arraysize(data); size++) {
212 // Should fall off end of module bytes.
213 ModuleResult result = DecodeModule(data, data + size);
214 EXPECT_FALSE(result.ok());
215 }
216 }
217
218
219 TEST_F(WasmModuleVerifyTest, OneSignature) {
220 static const byte data[] = {
221 kDeclSignatures, 1, 0, kLocalVoid // void -> void
222 };
223 EXPECT_VERIFIES(data);
224 }
225
226
227 TEST_F(WasmModuleVerifyTest, MultipleSignatures) {
228 static const byte data[] = {
229 kDeclSignatures,
230 3,
231 0,
232 kLocalVoid, // void -> void
233 1,
234 kLocalI32,
235 kLocalF32, // f32 -> i32
236 2,
237 kLocalI32,
238 kLocalF64,
239 kLocalF64, // (f64,f64) -> i32
240 };
241
242 ModuleResult result = DecodeModule(data, data + arraysize(data));
243 EXPECT_TRUE(result.ok());
244 EXPECT_EQ(3, result.val->signatures->size());
245 if (result.val->signatures->size() == 3) {
246 EXPECT_EQ(0, result.val->signatures->at(0)->return_count());
247 EXPECT_EQ(1, result.val->signatures->at(1)->return_count());
248 EXPECT_EQ(1, result.val->signatures->at(2)->return_count());
249
250 EXPECT_EQ(0, result.val->signatures->at(0)->parameter_count());
251 EXPECT_EQ(1, result.val->signatures->at(1)->parameter_count());
252 EXPECT_EQ(2, result.val->signatures->at(2)->parameter_count());
253 }
254
255 for (size_t size = 1; size < arraysize(data); size++) {
256 ModuleResult result = DecodeModule(data, data + size);
257 // Should fall off the end of module bytes.
258 EXPECT_FALSE(result.ok());
259 }
260 }
261
262
263 TEST_F(WasmModuleVerifyTest, FunctionWithoutSig) {
264 static const byte data[] = {
265 kDeclFunctions, 1,
266 // func#0 ------------------------------------------------------
267 0, 0, // signature index
268 0, 0, 0, 0, // name offset
269 0, 0, 0, 0, // code start offset
270 0, 0, 0, 0, // code end offset
271 1, 2, // local int32 count
272 3, 4, // local int64 count
273 5, 6, // local float32 count
274 7, 8, // local float64 count
275 0, // exported
276 1 // external
277 };
278
279 ModuleResult result = DecodeModule(data, data + arraysize(data));
280 EXPECT_FALSE(result.ok());
281 }
282
283
284 TEST_F(WasmModuleVerifyTest, OneEmptyVoidVoidFunction) {
285 const int kCodeStartOffset = 23;
286 const int kCodeEndOffset = kCodeStartOffset + 1;
287
288 static const byte data[] = {
289 kDeclSignatures, 1,
290 // sig#0 -------------------------------------------------------
291 0, 0, // void -> void
292 // func#0 ------------------------------------------------------
293 kDeclFunctions, 1,
294 kDeclFunctionLocals | kDeclFunctionExport | kDeclFunctionName, 0,
295 0, // signature index
296 9, 0, 0, 0, // name offset
297 11, 2, // local int32 count
298 13, 4, // local int64 count
299 15, 6, // local float32 count
300 17, 8, // local float64 count
301 1, 0, // size
302 kExprNop,
303 };
304
305 {
306 // Should decode to exactly one function.
307 ModuleResult result = DecodeModule(data, data + arraysize(data));
308 EXPECT_TRUE(result.ok());
309 EXPECT_EQ(0, result.val->globals->size());
310 EXPECT_EQ(1, result.val->signatures->size());
311 EXPECT_EQ(1, result.val->functions->size());
312 EXPECT_EQ(0, result.val->data_segments->size());
313 EXPECT_EQ(0, result.val->function_table->size());
314
315 WasmFunction* function = &result.val->functions->back();
316
317 EXPECT_EQ(9, function->name_offset);
318 EXPECT_EQ(kCodeStartOffset, function->code_start_offset);
319 EXPECT_EQ(kCodeEndOffset, function->code_end_offset);
320
321 EXPECT_EQ(523, function->local_int32_count);
322 EXPECT_EQ(1037, function->local_int64_count);
323 EXPECT_EQ(1551, function->local_float32_count);
324 EXPECT_EQ(2065, function->local_float64_count);
325
326 EXPECT_EQ(true, function->exported);
327 EXPECT_EQ(false, function->external);
328 }
329
330 for (size_t size = 5; size < arraysize(data); size++) {
331 // Should fall off end of module bytes.
332 ModuleResult result = DecodeModule(data, data + size);
333 EXPECT_FALSE(result.ok());
334 }
335 }
336
337
338 TEST_F(WasmModuleVerifyTest, OneFunctionImported) {
339 static const byte data[] = {
340 kDeclSignatures, 1,
341 // sig#0 -------------------------------------------------------
342 0, 0, // void -> void
343 kDeclFunctions, 1,
344 // func#0 ------------------------------------------------------
345 kDeclFunctionImport, // no name, no locals, imported
346 0, 0, // signature index
347 };
348
349 ModuleResult result = DecodeModule(data, data + arraysize(data));
350 EXPECT_TRUE(result.ok());
351 EXPECT_EQ(1, result.val->functions->size());
352 WasmFunction* function = &result.val->functions->back();
353
354 EXPECT_EQ(0, function->name_offset);
355 EXPECT_EQ(0, function->code_start_offset);
356 EXPECT_EQ(0, function->code_end_offset);
357
358 EXPECT_EQ(0, function->local_int32_count);
359 EXPECT_EQ(0, function->local_int64_count);
360 EXPECT_EQ(0, function->local_float32_count);
361 EXPECT_EQ(0, function->local_float64_count);
362
363 EXPECT_EQ(false, function->exported);
364 EXPECT_EQ(true, function->external);
365 }
366
367
368 TEST_F(WasmModuleVerifyTest, OneFunctionWithNopBody) {
369 static const byte kCodeStartOffset = 11;
370 static const byte kCodeEndOffset = kCodeStartOffset + 1;
371
372 static const byte data[] = {
373 kDeclSignatures, 1,
374 // sig#0 -------------------------------------------------------
375 0, 0, // void -> void
376 kDeclFunctions, 1,
377 // func#0 ------------------------------------------------------
378 0, // no name, no locals
379 0, 0, // signature index
380 1, 0, // body size
381 kExprNop // body
382 };
383
384 ModuleResult result = DecodeModule(data, data + arraysize(data));
385 EXPECT_TRUE(result.ok());
386 EXPECT_EQ(1, result.val->functions->size());
387 WasmFunction* function = &result.val->functions->back();
388
389 EXPECT_EQ(0, function->name_offset);
390 EXPECT_EQ(kCodeStartOffset, function->code_start_offset);
391 EXPECT_EQ(kCodeEndOffset, function->code_end_offset);
392
393 EXPECT_EQ(0, function->local_int32_count);
394 EXPECT_EQ(0, function->local_int64_count);
395 EXPECT_EQ(0, function->local_float32_count);
396 EXPECT_EQ(0, function->local_float64_count);
397
398 EXPECT_EQ(false, function->exported);
399 EXPECT_EQ(false, function->external);
400 }
401
402
403 TEST_F(WasmModuleVerifyTest, OneFunctionWithNopBody_WithLocals) {
404 static const byte kCodeStartOffset = 19;
405 static const byte kCodeEndOffset = kCodeStartOffset + 1;
406
407 static const byte data[] = {
408 kDeclSignatures, 1,
409 // sig#0 -------------------------------------------------------
410 0, 0, // void -> void
411 kDeclFunctions, 1,
412 // func#0 ------------------------------------------------------
413 kDeclFunctionLocals, 0, 0, // signature index
414 1, 2, // local int32 count
415 3, 4, // local int64 count
416 5, 6, // local float32 count
417 7, 8, // local float64 count
418 1, 0, // body size
419 kExprNop // body
420 };
421
422 ModuleResult result = DecodeModule(data, data + arraysize(data));
423 EXPECT_TRUE(result.ok());
424 EXPECT_EQ(1, result.val->functions->size());
425 WasmFunction* function = &result.val->functions->back();
426
427 EXPECT_EQ(0, function->name_offset);
428 EXPECT_EQ(kCodeStartOffset, function->code_start_offset);
429 EXPECT_EQ(kCodeEndOffset, function->code_end_offset);
430
431 EXPECT_EQ(513, function->local_int32_count);
432 EXPECT_EQ(1027, function->local_int64_count);
433 EXPECT_EQ(1541, function->local_float32_count);
434 EXPECT_EQ(2055, function->local_float64_count);
435
436 EXPECT_EQ(false, function->exported);
437 EXPECT_EQ(false, function->external);
438 }
439
440
441 TEST_F(WasmModuleVerifyTest, OneGlobalOneFunctionWithNopBodyOneDataSegment) {
442 static const byte kCodeStartOffset = 2 + kDeclGlobalSize + 4 + 2 + 17;
443 static const byte kCodeEndOffset = kCodeStartOffset + 3;
444
445 static const byte data[] = {
446 // global#0 --------------------------------------------------
447 kDeclGlobals, 1, 0, 0, 0, 0, // name offset
448 kMemU8, // memory type
449 0, // exported
450 // sig#0 -----------------------------------------------------
451 kDeclSignatures, 1, 0, 0, // void -> void
452 // func#0 ----------------------------------------------------
453 kDeclFunctions, 1, kDeclFunctionLocals | kDeclFunctionName, 0,
454 0, // signature index
455 9, 0, 0, 0, // name offset
456 1, 2, // local int32 count
457 3, 4, // local int64 count
458 5, 6, // local float32 count
459 7, 8, // local float64 count
460 3, 0, // body size
461 kExprNop, // func#0 body
462 kExprNop, // func#0 body
463 kExprNop, // func#0 body
464 // segment#0 -------------------------------------------------
465 kDeclDataSegments, 1, 0xae, 0xb3, 0x08, 0, // dest addr
466 15, 0, 0, 0, // source offset
467 5, 0, 0, 0, // source size
468 1, // init
469 // rest ------------------------------------------------------
470 kDeclEnd,
471 };
472
473 {
474 ModuleResult result = DecodeModule(data, data + arraysize(data));
475 EXPECT_TRUE(result.ok());
476 EXPECT_EQ(1, result.val->globals->size());
477 EXPECT_EQ(1, result.val->functions->size());
478 EXPECT_EQ(1, result.val->data_segments->size());
479
480 WasmGlobal* global = &result.val->globals->back();
481
482 EXPECT_EQ(0, global->name_offset);
483 EXPECT_EQ(MachineType::Uint8(), global->type);
484 EXPECT_EQ(0, global->offset);
485 EXPECT_EQ(false, global->exported);
486
487 WasmFunction* function = &result.val->functions->back();
488
489 EXPECT_EQ(9, function->name_offset);
490 EXPECT_EQ(kCodeStartOffset, function->code_start_offset);
491 EXPECT_EQ(kCodeEndOffset, function->code_end_offset);
492
493 EXPECT_EQ(false, function->exported);
494 EXPECT_EQ(false, function->external);
495
496 WasmDataSegment* segment = &result.val->data_segments->back();
497
498 EXPECT_EQ(0x8b3ae, segment->dest_addr);
499 EXPECT_EQ(15, segment->source_offset);
500 EXPECT_EQ(5, segment->source_size);
501 EXPECT_EQ(true, segment->init);
502 }
503 }
504
505
506 TEST_F(WasmModuleVerifyTest, OneDataSegment) {
507 const byte data[] = {
508 kDeclDataSegments,
509 1,
510 0xaa,
511 0xbb,
512 0x09,
513 0, // dest addr
514 11,
515 0,
516 0,
517 0, // source offset
518 3,
519 0,
520 0,
521 0, // source size
522 1, // init
523 };
524
525 {
526 ModuleResult result = DecodeModule(data, data + arraysize(data));
527 EXPECT_TRUE(result.ok());
528 EXPECT_EQ(0, result.val->globals->size());
529 EXPECT_EQ(0, result.val->functions->size());
530 EXPECT_EQ(1, result.val->data_segments->size());
531
532 WasmDataSegment* segment = &result.val->data_segments->back();
533
534 EXPECT_EQ(0x9bbaa, segment->dest_addr);
535 EXPECT_EQ(11, segment->source_offset);
536 EXPECT_EQ(3, segment->source_size);
537 EXPECT_EQ(true, segment->init);
538 }
539
540 for (size_t size = 1; size < arraysize(data); size++) {
541 // Should fall off end of module bytes.
542 ModuleResult result = DecodeModule(data, data + size);
543 EXPECT_FALSE(result.ok());
544 }
545 }
546
547
548 TEST_F(WasmModuleVerifyTest, TwoDataSegments) {
549 const byte data[] = {
550 kDeclDataSegments,
551 2,
552 0xee,
553 0xff,
554 0x07,
555 0, // dest addr
556 9,
557 0,
558 0,
559 0, // #0: source offset
560 4,
561 0,
562 0,
563 0, // source size
564 0, // init
565 0xcc,
566 0xdd,
567 0x06,
568 0, // #1: dest addr
569 6,
570 0,
571 0,
572 0, // source offset
573 10,
574 0,
575 0,
576 0, // source size
577 1, // init
578 };
579
580 {
581 ModuleResult result = DecodeModule(data, data + arraysize(data));
582 EXPECT_TRUE(result.ok());
583 EXPECT_EQ(0, result.val->globals->size());
584 EXPECT_EQ(0, result.val->functions->size());
585 EXPECT_EQ(2, result.val->data_segments->size());
586
587 WasmDataSegment* s0 = &result.val->data_segments->at(0);
588 WasmDataSegment* s1 = &result.val->data_segments->at(1);
589
590 EXPECT_EQ(0x7ffee, s0->dest_addr);
591 EXPECT_EQ(9, s0->source_offset);
592 EXPECT_EQ(4, s0->source_size);
593 EXPECT_EQ(false, s0->init);
594
595 EXPECT_EQ(0x6ddcc, s1->dest_addr);
596 EXPECT_EQ(6, s1->source_offset);
597 EXPECT_EQ(10, s1->source_size);
598 EXPECT_EQ(true, s1->init);
599 }
600
601 for (size_t size = 1; size < arraysize(data); size++) {
602 // Should fall off end of module bytes.
603 ModuleResult result = DecodeModule(data, data + size);
604 EXPECT_FALSE(result.ok());
605 }
606 }
607
608
609 // To make below tests for indirect calls much shorter.
610 #define FUNCTION(sig_index, external) \
611 kDeclFunctionImport, static_cast<byte>(sig_index), \
612 static_cast<byte>(sig_index >> 8)
613
614
615 TEST_F(WasmModuleVerifyTest, OneIndirectFunction) {
616 static const byte data[] = {
617 // sig#0 -------------------------------------------------------
618 kDeclSignatures, 1, 0, 0, // void -> void
619 // func#0 ------------------------------------------------------
620 kDeclFunctions, 1, FUNCTION(0, 0),
621 // indirect table ----------------------------------------------
622 kDeclFunctionTable, 1, 0, 0};
623
624 ModuleResult result = DecodeModule(data, data + arraysize(data));
625 EXPECT_TRUE(result.ok());
626 if (result.ok()) {
627 EXPECT_EQ(1, result.val->signatures->size());
628 EXPECT_EQ(1, result.val->functions->size());
629 EXPECT_EQ(1, result.val->function_table->size());
630 EXPECT_EQ(0, result.val->function_table->at(0));
631 }
632 }
633
634
635 TEST_F(WasmModuleVerifyTest, MultipleIndirectFunctions) {
636 static const byte data[] = {
637 // sig#0 -------------------------------------------------------
638 kDeclSignatures, 2, 0, 0, // void -> void
639 0, kLocalI32, // void -> i32
640 // func#0 ------------------------------------------------------
641 kDeclFunctions, 4, FUNCTION(0, 1), FUNCTION(1, 1), FUNCTION(0, 1),
642 FUNCTION(1, 1),
643 // indirect table ----------------------------------------------
644 kDeclFunctionTable, 8, 0, 0, 1, 0, 2, 0, 3, 0, 0, 0, 1, 0, 2, 0, 3, 0,
645 };
646
647 ModuleResult result = DecodeModule(data, data + arraysize(data));
648 EXPECT_TRUE(result.ok());
649 if (result.ok()) {
650 EXPECT_EQ(2, result.val->signatures->size());
651 EXPECT_EQ(4, result.val->functions->size());
652 EXPECT_EQ(8, result.val->function_table->size());
653 for (int i = 0; i < 8; i++) {
654 EXPECT_EQ(i & 3, result.val->function_table->at(i));
655 }
656 }
657 }
658
659
660 TEST_F(WasmModuleVerifyTest, IndirectFunctionNoFunctions) {
661 static const byte data[] = {
662 // sig#0 -------------------------------------------------------
663 kDeclSignatures, 1, 0, 0, // void -> void
664 // indirect table ----------------------------------------------
665 kDeclFunctionTable, 1, 0, 0,
666 };
667
668 EXPECT_FAILURE(data);
669 }
670
671
672 TEST_F(WasmModuleVerifyTest, IndirectFunctionInvalidIndex) {
673 static const byte data[] = {
674 // sig#0 -------------------------------------------------------
675 kDeclSignatures, 1, 0, 0, // void -> void
676 // functions ---------------------------------------------------
677 kDeclFunctions, 1, FUNCTION(0, 1),
678 // indirect table ----------------------------------------------
679 kDeclFunctionTable, 1, 1, 0,
680 };
681
682 EXPECT_FAILURE(data);
683 }
684
685
686 class WasmSignatureDecodeTest : public TestWithZone {};
687
688
689 TEST_F(WasmSignatureDecodeTest, Ok_v_v) {
690 static const byte data[] = {0, 0};
691 Zone zone;
692 FunctionSig* sig =
693 DecodeWasmSignatureForTesting(&zone, data, data + arraysize(data));
694
695 EXPECT_TRUE(sig != nullptr);
696 EXPECT_EQ(0, sig->parameter_count());
697 EXPECT_EQ(0, sig->return_count());
698 }
699
700
701 TEST_F(WasmSignatureDecodeTest, Ok_t_v) {
702 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
703 LocalTypePair ret_type = kLocalTypes[i];
704 const byte data[] = {0, ret_type.code};
705 FunctionSig* sig =
706 DecodeWasmSignatureForTesting(zone(), data, data + arraysize(data));
707
708 EXPECT_TRUE(sig != nullptr);
709 EXPECT_EQ(0, sig->parameter_count());
710 EXPECT_EQ(1, sig->return_count());
711 EXPECT_EQ(ret_type.type, sig->GetReturn());
712 }
713 }
714
715
716 TEST_F(WasmSignatureDecodeTest, Ok_v_t) {
717 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
718 LocalTypePair param_type = kLocalTypes[i];
719 const byte data[] = {1, 0, param_type.code};
720 FunctionSig* sig =
721 DecodeWasmSignatureForTesting(zone(), data, data + arraysize(data));
722
723 EXPECT_TRUE(sig != nullptr);
724 EXPECT_EQ(1, sig->parameter_count());
725 EXPECT_EQ(0, sig->return_count());
726 EXPECT_EQ(param_type.type, sig->GetParam(0));
727 }
728 }
729
730
731 TEST_F(WasmSignatureDecodeTest, Ok_t_t) {
732 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
733 LocalTypePair ret_type = kLocalTypes[i];
734 for (size_t j = 0; j < arraysize(kLocalTypes); j++) {
735 LocalTypePair param_type = kLocalTypes[j];
736 const byte data[] = {1, // param count
737 ret_type.code, // ret
738 param_type.code}; // param
739 FunctionSig* sig =
740 DecodeWasmSignatureForTesting(zone(), data, data + arraysize(data));
741
742 EXPECT_TRUE(sig != nullptr);
743 EXPECT_EQ(1, sig->parameter_count());
744 EXPECT_EQ(1, sig->return_count());
745 EXPECT_EQ(param_type.type, sig->GetParam(0));
746 EXPECT_EQ(ret_type.type, sig->GetReturn());
747 }
748 }
749 }
750
751
752 TEST_F(WasmSignatureDecodeTest, Ok_i_tt) {
753 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
754 LocalTypePair p0_type = kLocalTypes[i];
755 for (size_t j = 0; j < arraysize(kLocalTypes); j++) {
756 LocalTypePair p1_type = kLocalTypes[j];
757 const byte data[] = {2, // param count
758 kLocalI32, // ret
759 p0_type.code, // p0
760 p1_type.code}; // p1
761 FunctionSig* sig =
762 DecodeWasmSignatureForTesting(zone(), data, data + arraysize(data));
763
764 EXPECT_TRUE(sig != nullptr);
765 EXPECT_EQ(2, sig->parameter_count());
766 EXPECT_EQ(1, sig->return_count());
767 EXPECT_EQ(p0_type.type, sig->GetParam(0));
768 EXPECT_EQ(p1_type.type, sig->GetParam(1));
769 }
770 }
771 }
772
773
774 TEST_F(WasmSignatureDecodeTest, Fail_off_end) {
775 byte data[256];
776 for (int p = 0; p <= 255; p = p + 1 + p * 3) {
777 for (int i = 0; i <= p; i++) data[i] = kLocalI32;
778 data[0] = static_cast<byte>(p);
779
780 for (int i = 0; i < p + 1; i++) {
781 // Should fall off the end for all signatures.
782 FunctionSig* sig = DecodeWasmSignatureForTesting(zone(), data, data + i);
783 EXPECT_EQ(nullptr, sig);
784 }
785 }
786 }
787
788
789 TEST_F(WasmSignatureDecodeTest, Fail_invalid_type) {
790 byte kInvalidType = 76;
791 for (int i = 1; i < 3; i++) {
792 byte data[] = {2, kLocalI32, kLocalI32, kLocalI32};
793 data[i] = kInvalidType;
794 FunctionSig* sig =
795 DecodeWasmSignatureForTesting(zone(), data, data + arraysize(data));
796 EXPECT_EQ(nullptr, sig);
797 }
798 }
799
800
801 TEST_F(WasmSignatureDecodeTest, Fail_invalid_param_type) {
802 static const int kParamCount = 3;
803 for (int i = 0; i < kParamCount; i++) {
804 byte data[] = {kParamCount, kLocalI32, kLocalI32, kLocalI32, kLocalI32};
805 data[i + 2] = kLocalVoid;
806 FunctionSig* sig =
807 DecodeWasmSignatureForTesting(zone(), data, data + arraysize(data));
808 EXPECT_EQ(nullptr, sig);
809 }
810 }
811
812
813 class WasmFunctionVerifyTest : public TestWithZone {};
814
815
816 TEST_F(WasmFunctionVerifyTest, Ok_v_v_empty) {
817 byte data[] = {
818 0, kLocalVoid, // signature
819 3, 0, // local int32 count
820 4, 0, // local int64 count
821 5, 0, // local float32 count
822 6, 0, // local float64 count
823 kExprNop // body
824 };
825
826 FunctionResult result = DecodeWasmFunction(nullptr, zone(), nullptr, data,
827 data + arraysize(data));
828 EXPECT_TRUE(result.ok());
829
830 if (result.val && result.ok()) {
831 WasmFunction* function = result.val;
832 EXPECT_EQ(0, function->sig->parameter_count());
833 EXPECT_EQ(0, function->sig->return_count());
834 EXPECT_EQ(0, function->name_offset);
835 EXPECT_EQ(arraysize(data) - 1, function->code_start_offset);
836 EXPECT_EQ(arraysize(data), function->code_end_offset);
837 EXPECT_EQ(3, function->local_int32_count);
838 EXPECT_EQ(4, function->local_int64_count);
839 EXPECT_EQ(5, function->local_float32_count);
840 EXPECT_EQ(6, function->local_float64_count);
841 EXPECT_FALSE(function->external);
842 EXPECT_FALSE(function->exported);
843 }
844 }
845 } // namespace wasm
846 } // namespace internal
847 } // namespace v8
OLDNEW
« no previous file with comments | « test/unittests/wasm/encoder-unittest.cc ('k') | test/unittests/wasm/wasm-macro-gen-unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698