blob: ca7467b7591ada1903ce192b54506355fe7978e9 [file] [log] [blame]
Kaido Kertf309f9a2021-04-30 12:09:15 -07001// Copyright 2017 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// Flags: --experimental-wasm-mv
6
7load("test/mjsunit/wasm/wasm-module-builder.js");
8
9(function MultiBlockResultTest() {
10 print("MultiBlockResultTest");
11 let builder = new WasmModuleBuilder();
12 let sig_i_ii = builder.addType(kSig_i_ii);
13 let sig_ii_v = builder.addType(kSig_ii_v);
14
15 builder.addFunction("main", kSig_i_ii)
16 .addBody([
17 kExprBlock, sig_ii_v,
18 kExprLocalGet, 0,
19 kExprLocalGet, 1,
20 kExprEnd,
21 kExprI32Add])
22 .exportAs("main");
23
24 let module = new WebAssembly.Module(builder.toBuffer());
25 let instance = new WebAssembly.Instance(module);
26 assertEquals(instance.exports.main(1, 4), 5);
27})();
28
29(function MultiBlockParamTest() {
30 print("MultiBlockParamTest");
31 let builder = new WasmModuleBuilder();
32 let sig_i_ii = builder.addType(kSig_i_ii);
33
34 builder.addFunction("main", kSig_i_ii)
35 .addBody([
36 kExprLocalGet, 0,
37 kExprLocalGet, 1,
38 kExprBlock, sig_i_ii,
39 kExprI32Add,
40 kExprEnd])
41 .exportAs("main");
42
43 let module = new WebAssembly.Module(builder.toBuffer());
44 let instance = new WebAssembly.Instance(module);
45 assertEquals(instance.exports.main(1, 4), 5);
46})();
47
48(function MultiBlockBrTest() {
49 print("MultiBlockBrTest");
50 let builder = new WasmModuleBuilder();
51 let sig_i_ii = builder.addType(kSig_i_ii);
52 let sig_ii_v = builder.addType(kSig_ii_v);
53
54 builder.addFunction("main", kSig_i_ii)
55 .addBody([
56 kExprBlock, sig_ii_v,
57 kExprLocalGet, 0,
58 kExprLocalGet, 1,
59 kExprBr, 0,
60 kExprEnd,
61 kExprI32Add])
62 .exportAs("main");
63
64 let module = new WebAssembly.Module(builder.toBuffer());
65 let instance = new WebAssembly.Instance(module);
66 assertEquals(instance.exports.main(1, 4), 5);
67})();
68
69(function MultiBlockUnreachableTest() {
70 print(arguments.callee.name);
71 let builder = new WasmModuleBuilder();
72 let sig_il_v = builder.addType(makeSig([], [kWasmI32, kWasmI64]));
73
74 builder.addFunction("main", kSig_i_v)
75 .addBody([
76 kExprBlock, sig_il_v,
77 kExprI32Const, 1,
78 kExprI64Const, 1,
79 kExprBr, 0,
80 kExprI32Const, 1,
81 kExprI64Const, 1,
82 kExprEnd,
83 kExprDrop])
84 .exportAs("main");
85
86 let module = new WebAssembly.Module(builder.toBuffer());
87 let instance = new WebAssembly.Instance(module);
88 assertEquals(instance.exports.main(1, 2), 1);
89})();
90
91(function MultiBlockUnreachableTypeErrorTest() {
92 print(arguments.callee.name);
93 let builder = new WasmModuleBuilder();
94 let sig_il_v = builder.addType(makeSig([], [kWasmI32, kWasmI64]));
95
96 builder.addFunction("main", kSig_i_v)
97 .addBody([
98 kExprBlock, sig_il_v,
99 kExprI32Const, 1,
100 kExprI64Const, 1,
101 kExprBr, 0,
102 kExprI64Const, 1,
103 kExprI32Const, 1,
104 // Wrong order: expect i32, i64.
105 kExprEnd,
106 kExprDrop])
107 .exportAs("main");
108
109 assertThrows(() => new WebAssembly.Module(builder.toBuffer()),
110 WebAssembly.CompileError, /expected type i64, found i32.const/);
111})();
112
113(function MultiLoopResultTest() {
114 print("MultiLoopResultTest");
115 let builder = new WasmModuleBuilder();
116 let sig_i_ii = builder.addType(kSig_i_ii);
117 let sig_ii_v = builder.addType(kSig_ii_v);
118
119 builder.addFunction("main", kSig_i_ii)
120 .addBody([
121 kExprLoop, sig_ii_v,
122 kExprLocalGet, 0,
123 kExprLocalGet, 1,
124 kExprEnd,
125 kExprI32Add])
126 .exportAs("main");
127
128 let module = new WebAssembly.Module(builder.toBuffer());
129 let instance = new WebAssembly.Instance(module);
130 assertEquals(instance.exports.main(1, 4), 5);
131})();
132
133(function MultiLoopParamTest() {
134 print("MultiLoopParamTest");
135 let builder = new WasmModuleBuilder();
136 let sig_i_ii = builder.addType(kSig_i_ii);
137
138 builder.addFunction("main", kSig_i_ii)
139 .addBody([
140 kExprLocalGet, 0,
141 kExprLocalGet, 1,
142 kExprLoop, sig_i_ii,
143 kExprI32Add,
144 kExprEnd])
145 .exportAs("main");
146
147 let module = new WebAssembly.Module(builder.toBuffer());
148 let instance = new WebAssembly.Instance(module);
149 assertEquals(instance.exports.main(1, 4), 5);
150})();
151
152(function MultiLoopBrTest() {
153 print("MultiLoopBrTest");
154 let builder = new WasmModuleBuilder();
155 let sig_i_ii = builder.addType(kSig_i_ii);
156 let sig_ii_i = builder.addType(kSig_ii_i);
157 let sig_ii_ii = builder.addType(kSig_ii_ii);
158
159 builder.addFunction("dup", kSig_ii_i)
160 .addBody([kExprLocalGet, 0, kExprLocalGet, 0]);
161 builder.addFunction("swap", kSig_ii_ii)
162 .addBody([kExprLocalGet, 1, kExprLocalGet, 0]);
163 builder.addFunction("main", kSig_i_ii)
164 .addBody([
165 kExprLocalGet, 0,
166 kExprLocalGet, 1,
167 kExprLoop, sig_ii_ii,
168 kExprCallFunction, 1, // swap
169 kExprCallFunction, 0, // dup
170 kExprI32Add,
171 kExprCallFunction, 0, // dup
172 kExprI32Const, 20,
173 kExprI32LeU,
174 kExprBrIf, 0,
175 kExprEnd,
176 kExprDrop])
177 .exportAs("main");
178
179 let module = new WebAssembly.Module(builder.toBuffer());
180 let instance = new WebAssembly.Instance(module);
181 assertEquals(0, instance.exports.main(0, 1));
182 assertEquals(16, instance.exports.main(1, 1));
183 assertEquals(4, instance.exports.main(3, 1));
184 assertEquals(4, instance.exports.main(4, 1));
185 assertEquals(0, instance.exports.main(0, 2));
186 assertEquals(16, instance.exports.main(1, 2));
187 assertEquals(8, instance.exports.main(3, 2));
188 assertEquals(8, instance.exports.main(4, 2));
189 assertEquals(0, instance.exports.main(0, 3));
190 assertEquals(8, instance.exports.main(1, 3));
191 assertEquals(12, instance.exports.main(3, 3));
192 assertEquals(12, instance.exports.main(4, 3));
193 assertEquals(0, instance.exports.main(0, 4));
194 assertEquals(8, instance.exports.main(1, 4));
195 assertEquals(16, instance.exports.main(3, 4));
196 assertEquals(16, instance.exports.main(4, 4));
197 assertEquals(3, instance.exports.main(100, 3));
198 assertEquals(6, instance.exports.main(3, 100));
199})();
200
201
202(function MultiIfResultTest() {
203 print("MultiIfResultTest");
204 let builder = new WasmModuleBuilder();
205 let sig_i_ii = builder.addType(kSig_i_ii);
206 let sig_ii_v = builder.addType(kSig_ii_v);
207
208 builder.addFunction("main", kSig_i_ii)
209 .addBody([
210 kExprLocalGet, 0,
211 kExprIf, sig_ii_v,
212 kExprLocalGet, 0,
213 kExprLocalGet, 1,
214 kExprElse,
215 kExprLocalGet, 1,
216 kExprLocalGet, 0,
217 kExprEnd,
218 kExprI32Sub])
219 .exportAs("main");
220
221 let module = new WebAssembly.Module(builder.toBuffer());
222 let instance = new WebAssembly.Instance(module);
223 assertEquals(instance.exports.main(8, 3), 5);
224 assertEquals(instance.exports.main(0, 3), 3);
225})();
226
227(function MultiIfParamTest() {
228 print("MultiIfParamTest");
229 let builder = new WasmModuleBuilder();
230 let sig_i_ii = builder.addType(kSig_i_ii);
231
232 builder.addFunction("main", kSig_i_ii)
233 .addBody([
234 kExprLocalGet, 0,
235 kExprLocalGet, 1,
236 kExprLocalGet, 0,
237 kExprIf, sig_i_ii,
238 kExprI32Add,
239 kExprElse,
240 kExprI32Sub,
241 kExprEnd])
242 .exportAs("main");
243
244 let module = new WebAssembly.Module(builder.toBuffer());
245 let instance = new WebAssembly.Instance(module);
246 assertEquals(instance.exports.main(1, 4), 5);
247 assertEquals(instance.exports.main(0, 4), -4);
248})();
249
250(function MultiIfBrTest() {
251 print("MultiIfBrTest");
252 let builder = new WasmModuleBuilder();
253 let sig_i_ii = builder.addType(kSig_i_ii);
254 let sig_ii_v = builder.addType(kSig_ii_v);
255
256 builder.addFunction("main", kSig_i_ii)
257 .addBody([
258 kExprLocalGet, 0,
259 kExprIf, sig_ii_v,
260 kExprLocalGet, 0,
261 kExprLocalGet, 1,
262 kExprBr, 0,
263 kExprElse,
264 kExprLocalGet, 1,
265 kExprLocalGet, 0,
266 kExprBr, 0,
267 kExprEnd,
268 kExprI32Sub])
269 .exportAs("main");
270
271 let module = new WebAssembly.Module(builder.toBuffer());
272 let instance = new WebAssembly.Instance(module);
273 assertEquals(instance.exports.main(8, 3), 5);
274 assertEquals(instance.exports.main(0, 3), 3);
275})();
276
277(function MultiIfParamOneArmedTest() {
278 print("MultiIfParamOneArmedTest");
279 let builder = new WasmModuleBuilder();
280 let sig_i_i = builder.addType(kSig_i_i);
281
282 builder.addFunction("main", kSig_i_i)
283 .addBody([
284 kExprLocalGet, 0,
285 kExprLocalGet, 0,
286 kExprIf, sig_i_i,
287 kExprI32Const, 5,
288 kExprI32Add,
289 kExprEnd])
290 .exportAs("main");
291
292 let module = new WebAssembly.Module(builder.toBuffer());
293 let instance = new WebAssembly.Instance(module);
294 assertEquals(instance.exports.main(0), 0);
295 assertEquals(instance.exports.main(1), 6);
296})();
297
298(function MultiIfOneArmedNoTypeCheckTest() {
299 print(arguments.callee.name);
300 let builder = new WasmModuleBuilder();
301 let sig_i_l = builder.addType(kSig_i_l);
302
303 builder.addFunction("main", kSig_i_v)
304 .addBody([
305 kExprI64Const, 0,
306 kExprI32Const, 0,
307 kExprIf, sig_i_l,
308 kExprDrop,
309 kExprI32Const, 0,
310 kExprEnd]);
311
312 assertThrows(() => new WebAssembly.Module(builder.toBuffer()),
313 WebAssembly.CompileError, /expected i32, got i64/);
314})();
315
316(function MultiResultTest() {
317 print("MultiResultTest");
318 let builder = new WasmModuleBuilder();
319 let sig_i_ii = builder.addType(kSig_i_ii);
320 let sig_iii_ii = builder.addType(kSig_iii_ii);
321
322 builder.addFunction("callee", kSig_iii_ii)
323 .addBody([
324 kExprLocalGet, 0,
325 kExprLocalGet, 1,
326 kExprLocalGet, 0,
327 kExprLocalGet, 1,
328 kExprI32Sub]);
329 builder.addFunction("main", kSig_i_ii)
330 .addBody([
331 kExprLocalGet, 0,
332 kExprLocalGet, 1,
333 kExprCallFunction, 0,
334 kExprI32Mul,
335 kExprI32Add])
336 .exportAs("main");
337
338 let module = new WebAssembly.Module(builder.toBuffer());
339 let instance = new WebAssembly.Instance(module);
340 assertEquals(instance.exports.main(0, 0), 0);
341 assertEquals(instance.exports.main(1, 0), 1);
342 assertEquals(instance.exports.main(2, 0), 2);
343 assertEquals(instance.exports.main(0, 1), -1);
344 assertEquals(instance.exports.main(0, 2), -4);
345 assertEquals(instance.exports.main(3, 4), -1);
346 assertEquals(instance.exports.main(4, 3), 7);
347})();
348
349(function MultiReturnTest() {
350 print("MultiReturnTest");
351 let builder = new WasmModuleBuilder();
352 let sig_i_i = builder.addType(kSig_i_i);
353 let sig_ii_i = builder.addType(kSig_ii_i);
354
355 builder.addFunction("callee", kSig_ii_i)
356 .addBody([
357 kExprLocalGet, 0,
358 kExprLocalGet, 0,
359 kExprLocalGet, 0,
360 kExprI32Add,
361 kExprReturn]);
362 builder.addFunction("main", kSig_i_i)
363 .addBody([
364 kExprLocalGet, 0,
365 kExprCallFunction, 0,
366 kExprI32Mul])
367 .exportAs("main");
368
369 let module = new WebAssembly.Module(builder.toBuffer());
370 let instance = new WebAssembly.Instance(module);
371 assertEquals(instance.exports.main(0), 0);
372 assertEquals(instance.exports.main(1), 2);
373 assertEquals(instance.exports.main(2), 8);
374 assertEquals(instance.exports.main(10), 200);
375})();
376
377(function MultiBrReturnTest() {
378 print("MultiBrReturnTest");
379 let builder = new WasmModuleBuilder();
380 let sig_i_i = builder.addType(kSig_i_i);
381 let sig_ii_i = builder.addType(kSig_ii_i);
382
383 builder.addFunction("callee", kSig_ii_i)
384 .addBody([
385 kExprLocalGet, 0,
386 kExprLocalGet, 0,
387 kExprLocalGet, 0,
388 kExprI32Add,
389 kExprBr, 0]);
390 builder.addFunction("main", kSig_i_i)
391 .addBody([
392 kExprLocalGet, 0,
393 kExprCallFunction, 0,
394 kExprI32Mul])
395 .exportAs("main");
396
397 let module = new WebAssembly.Module(builder.toBuffer());
398 let instance = new WebAssembly.Instance(module);
399 assertEquals(instance.exports.main(0), 0);
400 assertEquals(instance.exports.main(1), 2);
401 assertEquals(instance.exports.main(2), 8);
402 assertEquals(instance.exports.main(10), 200);
403})();
404
405(function MultiBrTableTest() {
406 print(arguments.callee.name);
407 let builder = new WasmModuleBuilder();
408 let sig_ii_v = builder.addType(kSig_v_v);
409
410 builder.addFunction("main", kSig_ii_v)
411 .addBody([
412 kExprI32Const, 1, kExprI32Const, 2,
413 kExprI32Const, 0,
414 kExprBrTable, 1, 0, 0,
415 ])
416 .exportAs("main");
417
418 let instance = builder.instantiate();
419 assertEquals(instance.exports.main(), [1, 2]);
420})();
421
422(function MultiUnreachablePolymorphicTest() {
423 print(arguments.callee.name);
424 let builder = new WasmModuleBuilder();
425 let sig_v_i = builder.addType(kSig_v_i);
426 let sig_i_i = builder.addType(kSig_i_i);
427
428 builder.addFunction("block", kSig_v_v)
429 .addBody([
430 kExprReturn,
431 kExprBlock, sig_v_i,
432 kExprDrop,
433 kExprEnd
434 ])
435 .exportAs("block");
436 builder.addFunction("if_else", kSig_v_v)
437 .addBody([
438 kExprReturn,
439 kExprIf, sig_v_i,
440 kExprDrop,
441 kExprElse,
442 kExprDrop,
443 kExprEnd
444 ])
445 .exportAs("if_else");
446 builder.addFunction("loop", kSig_v_v)
447 .addBody([
448 kExprReturn,
449 kExprLoop, sig_i_i,
450 kExprEnd,
451 kExprDrop
452 ])
453 .exportAs("loop");
454 // TODO(thibaudm): Create eh + mv mjsunit test and add try/catch case.
455 let instance = builder.instantiate();
456 instance.exports.block();
457 instance.exports.if_else();
458 instance.exports.loop();
459})();
460
461(function MultiWasmToJSReturnTest() {
462 print(arguments.callee.name);
463 let builder = new WasmModuleBuilder();
464 let sig_fi_if = makeSig([kWasmI32, kWasmF32], [kWasmF32, kWasmI32]);
465
466 builder.addFunction("swap", sig_fi_if)
467 .addBody([
468 kExprLocalGet, 1,
469 kExprLocalGet, 0])
470 .exportAs("swap");
471 builder.addFunction("addsubmul", kSig_iii_i)
472 .addBody([
473 kExprLocalGet, 0,
474 kExprLocalGet, 0,
475 kExprI32Add,
476 kExprLocalGet, 0,
477 kExprLocalGet, 0,
478 kExprI32Sub,
479 kExprLocalGet, 0,
480 kExprLocalGet, 0,
481 kExprI32Mul])
482 .exportAs("addsubmul");
483
484 let module = new WebAssembly.Module(builder.toBuffer());
485 let instance = new WebAssembly.Instance(module);
486 assertEquals(instance.exports.swap(0, 1.5), [1.5, 0]);
487 assertEquals(instance.exports.swap(2, 3.75), [3.75, 2]);
488 assertEquals(instance.exports.addsubmul(4), [8, 0, 16]);
489 assertEquals(instance.exports.addsubmul(5), [10, 0, 25]);
490})();
491
492(function MultiJSToWasmReturnTest() {
493 print(arguments.callee.name);
494 let builder = new WasmModuleBuilder();
495 function swap(x, y) { return [y, x]; }
496 function swap_proxy(x, y) {
497 return new Proxy([y, x], {
498 get: function(obj, prop) { return Reflect.get(obj, prop); },
499 });
500 }
501 function proxy_throw(x, y) {
502 return new Proxy([y, x], {
503 get: function(obj, prop) {
504 if (prop == 1) {
505 throw new Error("abc");
506 }
507 return Reflect.get(obj, prop); },
508 });
509 }
510 function drop_first(x, y) {
511 return [y];
512 }
513 function repeat(x, y) {
514 return [x, y, x, y];
515 }
516 function not_receiver(x, y) {
517 return 0;
518 }
519 function not_iterable(x, y) {
520 a = [x, y];
521 a[Symbol.iterator] = undefined;
522 return a;
523 }
524 function* generator(x, y) {
525 yield x;
526 yield y;
527 }
528 function* generator_throw(x, y) {
529 yield x;
530 throw new Error("def");
531 }
532
533 builder.addImport('imports', 'f', kSig_ii_ii);
534 builder.addFunction("main", kSig_ii_ii)
535 .addBody([
536 kExprLocalGet, 0,
537 kExprLocalGet, 1,
538 kExprCallFunction, 0])
539 .exportAs("main")
540
541 let module = new WebAssembly.Module(builder.toBuffer());
542
543 var instance = new WebAssembly.Instance(module, { 'imports' : { 'f' : swap } });
544 assertEquals(instance.exports.main(1, 2), [2, 1]);
545 instance = new WebAssembly.Instance(module, { 'imports' : { 'f' : swap_proxy } });
546 assertEquals(instance.exports.main(1, 2), [2, 1]);
547 instance = new WebAssembly.Instance(module, { 'imports' : { 'f' : generator } });
548 assertEquals(instance.exports.main(1, 2), [1, 2]);
549
550 instance = new WebAssembly.Instance(module, { 'imports' : { 'f' : drop_first } });
551 assertThrows(() => instance.exports.main(1, 2), TypeError, "multi-return length mismatch");
552 instance = new WebAssembly.Instance(module, { 'imports' : { 'f' : repeat } });
553 assertThrows(() => instance.exports.main(1, 2), TypeError, "multi-return length mismatch");
554 instance = new WebAssembly.Instance(module, { 'imports' : { 'f' : proxy_throw } });
555 assertThrows(() => instance.exports.main(1, 2), Error, "abc");
556 instance = new WebAssembly.Instance(module, { 'imports' : { 'f' : not_receiver } });
557 assertThrows(() => instance.exports.main(1, 2), TypeError, /not iterable/);
558 instance = new WebAssembly.Instance(module, { 'imports' : { 'f' : not_iterable } });
559 assertThrows(() => instance.exports.main(1, 2), TypeError, /not iterable/);
560 instance = new WebAssembly.Instance(module, { 'imports' : { 'f' : generator_throw } });
561 assertThrows(() => instance.exports.main(1, 2), Error, "def");
562})();