blob: 3f936f5f211db0fcc7a14d2b033a83f66969316a [file] [log] [blame]
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001// 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// Flags: --expose-wasm
6
7function EmptyTest() {
8 "use asm";
9 function caller() {
10 empty();
11 return 11;
12 }
13 function empty() {
14 }
15 return {caller: caller};
16}
17
Ben Murdoch097c5b22016-05-18 11:27:45 +010018assertEquals(11, _WASMEXP_.instantiateModuleFromAsm(
19 EmptyTest.toString()).caller());
20
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000021
22function IntTest() {
23 "use asm";
24 function sum(a, b) {
25 a = a|0;
26 b = b|0;
27 var c = (b + 1)|0
28 var d = 3.0;
Ben Murdoch097c5b22016-05-18 11:27:45 +010029 var e = ~~d; // double conversion
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000030 return (a + c + 1)|0;
31 }
32
33 function caller() {
34 return sum(77,22) | 0;
35 }
36
37 return {caller: caller};
38}
39
Ben Murdoch097c5b22016-05-18 11:27:45 +010040assertEquals(101, _WASMEXP_.instantiateModuleFromAsm(
41 IntTest.toString()).caller());
42
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000043
44function Float64Test() {
45 "use asm";
46 function sum(a, b) {
47 a = +a;
48 b = +b;
49 return +(a + b);
50 }
51
52 function caller() {
53 var a = +sum(70.1,10.2);
54 var ret = 0|0;
55 if (a == 80.3) {
56 ret = 1|0;
57 } else {
58 ret = 0|0;
59 }
60 return ret|0;
61 }
62
63 return {caller: caller};
64}
65
Ben Murdoch097c5b22016-05-18 11:27:45 +010066assertEquals(1, _WASMEXP_.instantiateModuleFromAsm(
67 Float64Test.toString()).caller());
68
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000069
70function BadModule() {
71 "use asm";
72 function caller(a, b) {
73 a = a|0;
74 b = b+0;
75 var c = (b + 1)|0
76 return (a + c + 1)|0;
77 }
78
79 function caller() {
80 return call(1, 2)|0;
81 }
82
83 return {caller: caller};
84}
85
86assertThrows(function() {
Ben Murdoch097c5b22016-05-18 11:27:45 +010087 _WASMEXP_.instantiateModuleFromAsm(BadModule.toString()).caller();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000088});
89
Ben Murdoch097c5b22016-05-18 11:27:45 +010090
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000091function TestReturnInBlock() {
92 "use asm";
93
94 function caller() {
95 if(1) {
96 {
97 {
98 return 1;
99 }
100 }
101 }
102 return 0;
103 }
104
105 return {caller: caller};
106}
107
Ben Murdoch097c5b22016-05-18 11:27:45 +0100108assertEquals(1, _WASMEXP_.instantiateModuleFromAsm(
109 TestReturnInBlock.toString()).caller());
110
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000111
112function TestWhileSimple() {
113 "use asm";
114
115 function caller() {
116 var x = 0;
117 while(x < 5) {
118 x = (x + 1)|0;
119 }
120 return x|0;
121 }
122
123 return {caller: caller};
124}
125
Ben Murdoch097c5b22016-05-18 11:27:45 +0100126assertEquals(5, _WASMEXP_.instantiateModuleFromAsm(
127 TestWhileSimple.toString()).caller());
128
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000129
130function TestWhileWithoutBraces() {
131 "use asm";
132
133 function caller() {
134 var x = 0;
135 while(x <= 3)
136 x = (x + 1)|0;
137 return x|0;
138 }
139
140 return {caller: caller};
141}
142
Ben Murdoch097c5b22016-05-18 11:27:45 +0100143assertEquals(4, _WASMEXP_.instantiateModuleFromAsm(
144 TestWhileWithoutBraces.toString()).caller());
145
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000146
147function TestReturnInWhile() {
148 "use asm";
149
150 function caller() {
151 var x = 0;
152 while(x < 10) {
153 x = (x + 6)|0;
154 return x|0;
155 }
156 return x|0;
157 }
158
159 return {caller: caller};
160}
161
Ben Murdoch097c5b22016-05-18 11:27:45 +0100162assertEquals(6, _WASMEXP_.instantiateModuleFromAsm(
163 TestReturnInWhile.toString()).caller());
164
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000165
166function TestReturnInWhileWithoutBraces() {
167 "use asm";
168
169 function caller() {
170 var x = 0;
171 while(x < 5)
172 return 7;
173 return x|0;
174 }
175
176 return {caller: caller};
177}
178
Ben Murdoch097c5b22016-05-18 11:27:45 +0100179assertEquals(
180 7, _WASMEXP_.instantiateModuleFromAsm(
181 TestReturnInWhileWithoutBraces.toString()).caller());
182
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000183
184function TestBreakInWhile() {
185 "use asm";
186
187 function caller() {
188 while(1) {
189 break;
190 }
191 return 8;
192 }
193
194 return {caller: caller};
195}
196
Ben Murdoch097c5b22016-05-18 11:27:45 +0100197assertEquals(8, _WASMEXP_.instantiateModuleFromAsm(
198 TestBreakInWhile.toString()).caller());
199
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000200
201function TestBreakInNestedWhile() {
202 "use asm";
203
204 function caller() {
205 var x = 1.0;
206 while(x < 1.5) {
207 while(1)
208 break;
209 x = +(x + 0.25);
210 }
211 var ret = 0;
212 if (x == 1.5) {
213 ret = 9;
214 }
215 return ret|0;
216 }
217
218 return {caller: caller};
219}
220
Ben Murdoch097c5b22016-05-18 11:27:45 +0100221assertEquals(9, _WASMEXP_.instantiateModuleFromAsm(
222 TestBreakInNestedWhile.toString()).caller());
223
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000224
225function TestBreakInBlock() {
226 "use asm";
227
228 function caller() {
229 var x = 0;
230 abc: {
231 x = 10;
232 if (x == 10) {
233 break abc;
234 }
235 x = 20;
236 }
237 return x|0;
238 }
239
240 return {caller: caller};
241}
242
Ben Murdoch097c5b22016-05-18 11:27:45 +0100243assertEquals(10, _WASMEXP_.instantiateModuleFromAsm(
244 TestBreakInBlock.toString()).caller());
245
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000246
247function TestBreakInNamedWhile() {
248 "use asm";
249
250 function caller() {
251 var x = 0;
252 outer: while (1) {
253 x = (x + 1)|0;
254 while (x == 11) {
255 break outer;
256 }
257 }
258 return x|0;
259 }
260
261 return {caller: caller};
262}
263
Ben Murdoch097c5b22016-05-18 11:27:45 +0100264assertEquals(11, _WASMEXP_.instantiateModuleFromAsm(
265 TestBreakInNamedWhile.toString()).caller());
266
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000267
268function TestContinue() {
269 "use asm";
270
271 function caller() {
272 var x = 5;
273 var ret = 0;
274 while (x >= 0) {
275 x = (x - 1)|0;
276 if (x == 2) {
277 continue;
278 }
279 ret = (ret - 1)|0;
280 }
281 return ret|0;
282 }
283
284 return {caller: caller};
285}
286
Ben Murdoch097c5b22016-05-18 11:27:45 +0100287assertEquals(-5, _WASMEXP_.instantiateModuleFromAsm(
288 TestContinue.toString()).caller());
289
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000290
291function TestContinueInNamedWhile() {
292 "use asm";
293
294 function caller() {
295 var x = 5;
296 var y = 0;
297 var ret = 0;
298 outer: while (x > 0) {
299 x = (x - 1)|0;
300 y = 0;
301 while (y < 5) {
302 if (x == 3) {
303 continue outer;
304 }
305 ret = (ret + 1)|0;
306 y = (y + 1)|0;
307 }
308 }
309 return ret|0;
310 }
311
312 return {caller: caller};
313}
314
Ben Murdoch097c5b22016-05-18 11:27:45 +0100315assertEquals(20, _WASMEXP_.instantiateModuleFromAsm(
316 TestContinueInNamedWhile.toString()).caller());
317
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000318
319function TestNot() {
320 "use asm";
321
322 function caller() {
323 var a = !(2 > 3);
324 return a | 0;
325 }
326
327 return {caller:caller};
328}
329
Ben Murdoch097c5b22016-05-18 11:27:45 +0100330assertEquals(1, _WASMEXP_.instantiateModuleFromAsm(
331 TestNot.toString()).caller());
332
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000333
334function TestNotEquals() {
335 "use asm";
336
337 function caller() {
338 var a = 3;
339 if (a != 2) {
340 return 21;
341 }
342 return 0;
343 }
344
345 return {caller:caller};
346}
347
Ben Murdoch097c5b22016-05-18 11:27:45 +0100348assertEquals(21, _WASMEXP_.instantiateModuleFromAsm(
349 TestNotEquals.toString()).caller());
350
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000351
352function TestUnsignedComparison() {
353 "use asm";
354
355 function caller() {
356 var a = 0xffffffff;
357 if ((a>>>0) > (0>>>0)) {
358 return 22;
359 }
360 return 0;
361 }
362
363 return {caller:caller};
364}
365
Ben Murdoch097c5b22016-05-18 11:27:45 +0100366assertEquals(22, _WASMEXP_.instantiateModuleFromAsm(
367 TestUnsignedComparison.toString()).caller());
368
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000369
370function TestMixedAdd() {
371 "use asm";
372
373 function caller() {
374 var a = 0x80000000;
375 var b = 0x7fffffff;
376 var c = 0;
377 c = ((a>>>0) + b)|0;
378 if ((c >>> 0) > (0>>>0)) {
379 if (c < 0) {
380 return 23;
381 }
382 }
383 return 0;
384 }
385
386 return {caller:caller};
387}
388
Ben Murdoch097c5b22016-05-18 11:27:45 +0100389assertEquals(23, _WASMEXP_.instantiateModuleFromAsm(
390 TestMixedAdd.toString()).caller());
391
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000392
393function TestInt32HeapAccess(stdlib, foreign, buffer) {
394 "use asm";
395
396 var m = new stdlib.Int32Array(buffer);
397 function caller() {
398 var i = 4;
399
400 m[0] = (i + 1) | 0;
401 m[i >> 2] = ((m[0]|0) + 1) | 0;
402 m[2] = ((m[i >> 2]|0) + 1) | 0;
403 return m[2] | 0;
404 }
405
406 return {caller: caller};
407}
408
Ben Murdoch097c5b22016-05-18 11:27:45 +0100409assertEquals(7, _WASMEXP_.instantiateModuleFromAsm(
410 TestInt32HeapAccess.toString()).caller());
411
412
413function TestInt32HeapAccessExternal() {
414 var memory = new ArrayBuffer(1024);
415 var memory_int32 = new Int32Array(memory);
416 var module = _WASMEXP_.instantiateModuleFromAsm(
417 TestInt32HeapAccess.toString(), null, memory);
418 module.__init__();
419 assertEquals(7, module.caller());
420 assertEquals(7, memory_int32[2]);
421}
422
423TestInt32HeapAccessExternal();
424
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000425
426function TestHeapAccessIntTypes() {
427 var types = [
Ben Murdoch097c5b22016-05-18 11:27:45 +0100428 [Int8Array, 'Int8Array', '>> 0'],
429 [Uint8Array, 'Uint8Array', '>> 0'],
430 [Int16Array, 'Int16Array', '>> 1'],
431 [Uint16Array, 'Uint16Array', '>> 1'],
432 [Int32Array, 'Int32Array', '>> 2'],
433 [Uint32Array, 'Uint32Array', '>> 2'],
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000434 ];
435 for (var i = 0; i < types.length; i++) {
436 var code = TestInt32HeapAccess.toString();
Ben Murdoch097c5b22016-05-18 11:27:45 +0100437 code = code.replace('Int32Array', types[i][1]);
438 code = code.replace(/>> 2/g, types[i][2]);
439 var memory = new ArrayBuffer(1024);
440 var memory_view = new types[i][0](memory);
441 var module = _WASMEXP_.instantiateModuleFromAsm(code, null, memory);
442 module.__init__();
443 assertEquals(7, module.caller());
444 assertEquals(7, memory_view[2]);
445 assertEquals(7, _WASMEXP_.instantiateModuleFromAsm(code).caller());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000446 }
447}
448
449TestHeapAccessIntTypes();
450
Ben Murdoch097c5b22016-05-18 11:27:45 +0100451
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000452function TestFloatHeapAccess(stdlib, foreign, buffer) {
453 "use asm";
454
455 var f32 = new stdlib.Float32Array(buffer);
456 var f64 = new stdlib.Float64Array(buffer);
457 var fround = stdlib.Math.fround;
458 function caller() {
459 var i = 8;
460 var j = 8;
461 var v = 6.0;
462
463 // TODO(bradnelson): Add float32 when asm-wasm supports it.
464 f64[2] = v + 1.0;
465 f64[i >> 3] = +f64[2] + 1.0;
466 f64[j >> 3] = +f64[j >> 3] + 1.0;
467 i = +f64[i >> 3] == 9.0;
468 return i|0;
469 }
470
471 return {caller: caller};
472}
473
Ben Murdoch097c5b22016-05-18 11:27:45 +0100474assertEquals(1, _WASMEXP_.instantiateModuleFromAsm(
475 TestFloatHeapAccess.toString()).caller());
476
477
478function TestFloatHeapAccessExternal() {
479 var memory = new ArrayBuffer(1024);
480 var memory_float64 = new Float64Array(memory);
481 var module = _WASMEXP_.instantiateModuleFromAsm(
482 TestFloatHeapAccess.toString(), null, memory);
483 module.__init__();
484 assertEquals(1, module.caller());
485 assertEquals(9.0, memory_float64[1]);
486}
487
488TestFloatHeapAccessExternal();
489
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000490
491function TestConvertI32() {
492 "use asm";
493
494 function caller() {
495 var a = 1.5;
496 if ((~~(a + a)) == 3) {
497 return 24;
498 }
499 return 0;
500 }
501
502 return {caller:caller};
503}
504
Ben Murdoch097c5b22016-05-18 11:27:45 +0100505assertEquals(24, _WASMEXP_.instantiateModuleFromAsm(
506 TestConvertI32.toString()).caller());
507
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000508
509function TestConvertF64FromInt() {
510 "use asm";
511
512 function caller() {
513 var a = 1;
514 if ((+(a + a)) > 1.5) {
515 return 25;
516 }
517 return 0;
518 }
519
520 return {caller:caller};
521}
522
Ben Murdoch097c5b22016-05-18 11:27:45 +0100523assertEquals(25, _WASMEXP_.instantiateModuleFromAsm(
524 TestConvertF64FromInt.toString()).caller());
525
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000526
527function TestConvertF64FromUnsigned() {
528 "use asm";
529
530 function caller() {
531 var a = 0xffffffff;
532 if ((+(a>>>0)) > 0.0) {
533 if((+a) < 0.0) {
534 return 26;
535 }
536 }
537 return 0;
538 }
539
540 return {caller:caller};
541}
542
Ben Murdoch097c5b22016-05-18 11:27:45 +0100543assertEquals(26, _WASMEXP_.instantiateModuleFromAsm(
544 TestConvertF64FromUnsigned.toString()).caller());
545
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000546
547function TestModInt() {
548 "use asm";
549
550 function caller() {
551 var a = -83;
552 var b = 28;
553 return ((a|0)%(b|0))|0;
554 }
555
556 return {caller:caller};
557}
558
Ben Murdoch097c5b22016-05-18 11:27:45 +0100559assertEquals(-27, _WASMEXP_.instantiateModuleFromAsm(
560 TestModInt.toString()).caller());
561
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000562
563function TestModUnsignedInt() {
564 "use asm";
565
566 function caller() {
567 var a = 0x80000000; //2147483648
568 var b = 10;
569 return ((a>>>0)%(b>>>0))|0;
570 }
571
572 return {caller:caller};
573}
574
Ben Murdoch097c5b22016-05-18 11:27:45 +0100575assertEquals(8, _WASMEXP_.instantiateModuleFromAsm(
576 TestModUnsignedInt.toString()).caller());
577
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000578
579function TestModDouble() {
580 "use asm";
581
582 function caller() {
583 var a = 5.25;
584 var b = 2.5;
585 if (a%b == 0.25) {
586 return 28;
587 }
588 return 0;
589 }
590
591 return {caller:caller};
592}
593
Ben Murdoch097c5b22016-05-18 11:27:45 +0100594assertEquals(28, _WASMEXP_.instantiateModuleFromAsm(
595 TestModDouble.toString()).caller());
596
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000597
598/*
599TODO: Fix parsing of negative doubles
600 Fix code to use trunc instead of casts
601function TestModDoubleNegative() {
602 "use asm";
603
604 function caller() {
605 var a = -34359738368.25;
606 var b = 2.5;
607 if (a%b == -0.75) {
608 return 28;
609 }
610 return 0;
611 }
612
613 return {caller:caller};
614}
615
Ben Murdoch097c5b22016-05-18 11:27:45 +0100616assertEquals(28, _WASMEXP_.instantiateModuleFromAsm(
617 TestModDoubleNegative.toString()).caller());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000618*/
619
Ben Murdoch097c5b22016-05-18 11:27:45 +0100620
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000621function TestNamedFunctions() {
622 "use asm";
623
624 var a = 0.0;
625 var b = 0.0;
626
627 function add() {
628 return +(a + b);
629 }
630
631 function init() {
632 a = 43.25;
633 b = 34.25;
634 }
635
636 return {init:init,
637 add:add};
638}
639
640var module = _WASMEXP_.instantiateModuleFromAsm(TestNamedFunctions.toString());
641module.init();
642assertEquals(77.5, module.add());
643
Ben Murdoch097c5b22016-05-18 11:27:45 +0100644
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000645function TestGlobalsWithInit() {
646 "use asm";
647
648 var a = 43.25;
649 var b = 34.25;
650
651 function add() {
652 return +(a + b);
653 }
654
655 return {add:add};
656}
657
658var module = _WASMEXP_.instantiateModuleFromAsm(TestGlobalsWithInit.toString());
659module.__init__();
660assertEquals(77.5, module.add());
661
Ben Murdoch097c5b22016-05-18 11:27:45 +0100662
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000663function TestForLoop() {
664 "use asm"
665
666 function caller() {
667 var ret = 0;
668 var i = 0;
669 for (i = 2; i <= 10; i = (i+1)|0) {
670 ret = (ret + i) | 0;
671 }
672 return ret|0;
673 }
674
675 return {caller:caller};
676}
677
Ben Murdoch097c5b22016-05-18 11:27:45 +0100678assertEquals(54, _WASMEXP_.instantiateModuleFromAsm(
679 TestForLoop.toString()).caller());
680
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000681
682function TestForLoopWithoutInit() {
683 "use asm"
684
685 function caller() {
686 var ret = 0;
687 var i = 0;
688 for (; i < 10; i = (i+1)|0) {
689 ret = (ret + 10) | 0;
690 }
691 return ret|0;
692 }
693
694 return {caller:caller};
695}
696
Ben Murdoch097c5b22016-05-18 11:27:45 +0100697assertEquals(100, _WASMEXP_.instantiateModuleFromAsm(
698 TestForLoopWithoutInit.toString()).caller());
699
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000700
701function TestForLoopWithoutCondition() {
702 "use asm"
703
704 function caller() {
705 var ret = 0;
706 var i = 0;
707 for (i=1;; i = (i+1)|0) {
708 ret = (ret + i) | 0;
709 if (i == 11) {
710 break;
711 }
712 }
713 return ret|0;
714 }
715
716 return {caller:caller};
717}
718
Ben Murdoch097c5b22016-05-18 11:27:45 +0100719assertEquals(66, _WASMEXP_.instantiateModuleFromAsm(
720 TestForLoopWithoutCondition.toString()).caller());
721
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000722
723function TestForLoopWithoutNext() {
724 "use asm"
725
726 function caller() {
727 var i = 0;
728 for (i=1; i < 41;) {
729 i = (i + 1) | 0;
730 }
731 return i|0;
732 }
733
734 return {caller:caller};
735}
736
Ben Murdoch097c5b22016-05-18 11:27:45 +0100737assertEquals(41, _WASMEXP_.instantiateModuleFromAsm(
738 TestForLoopWithoutNext.toString()).caller());
739
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000740
741function TestForLoopWithoutBody() {
742 "use asm"
743
744 function caller() {
745 var i = 0;
746 for (i=1; i < 45 ; i = (i+1)|0) {
747 }
748 return i|0;
749 }
750
751 return {caller:caller};
752}
753
Ben Murdoch097c5b22016-05-18 11:27:45 +0100754assertEquals(45, _WASMEXP_.instantiateModuleFromAsm(
755 TestForLoopWithoutBody.toString()).caller());
756
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000757
758function TestDoWhile() {
759 "use asm"
760
761 function caller() {
762 var i = 0;
763 var ret = 21;
764 do {
765 ret = (ret + ret)|0;
766 i = (i + 1)|0;
767 } while (i < 2);
768 return ret|0;
769 }
770
771 return {caller:caller};
772}
773
Ben Murdoch097c5b22016-05-18 11:27:45 +0100774assertEquals(84, _WASMEXP_.instantiateModuleFromAsm(
775 TestDoWhile.toString()).caller());
776
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000777
778function TestConditional() {
779 "use asm"
780
781 function caller() {
782 var x = 1;
783 return ((x > 0) ? 41 : 71)|0;
784 }
785
786 return {caller:caller};
787}
788
Ben Murdoch097c5b22016-05-18 11:27:45 +0100789assertEquals(41, _WASMEXP_.instantiateModuleFromAsm(
790 TestConditional.toString()).caller());
791
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000792
793function TestSwitch() {
794 "use asm"
795
796 function caller() {
797 var ret = 0;
798 var x = 7;
799 switch (x) {
800 case 1: return 0;
801 case 7: {
802 ret = 12;
803 break;
804 }
805 default: return 0;
806 }
807 switch (x) {
808 case 1: return 0;
809 case 8: return 0;
810 default: ret = (ret + 11)|0;
811 }
812 return ret|0;
813 }
814
815 return {caller:caller};
816}
817
Ben Murdoch097c5b22016-05-18 11:27:45 +0100818assertEquals(23, _WASMEXP_.instantiateModuleFromAsm(
819 TestSwitch.toString()).caller());
820
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000821
822function TestSwitchFallthrough() {
823 "use asm"
824
825 function caller() {
826 var x = 17;
827 var ret = 0;
828 switch (x) {
829 case 17:
830 case 14: ret = 39;
831 case 1: ret = (ret + 3)|0;
832 case 4: break;
833 default: ret = (ret + 1)|0;
834 }
835 return ret|0;
836 }
837
838 return {caller:caller};
839}
840
Ben Murdoch097c5b22016-05-18 11:27:45 +0100841assertEquals(42, _WASMEXP_.instantiateModuleFromAsm(
842 TestSwitchFallthrough.toString()).caller());
843
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000844
845function TestNestedSwitch() {
846 "use asm"
847
848 function caller() {
849 var x = 3;
850 var y = -13;
851 switch (x) {
852 case 1: return 0;
853 case 3: {
854 switch (y) {
855 case 2: return 0;
856 case -13: return 43;
857 default: return 0;
858 }
859 }
860 default: return 0;
861 }
862 return 0;
863 }
864
865 return {caller:caller};
866}
867
Ben Murdoch097c5b22016-05-18 11:27:45 +0100868assertEquals(43, _WASMEXP_.instantiateModuleFromAsm(
869 TestNestedSwitch.toString()).caller());
870
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000871
872function TestInitFunctionWithNoGlobals() {
873 "use asm";
874 function caller() {
875 return 51;
876 }
877 return {caller};
878}
879
880var module = _WASMEXP_.instantiateModuleFromAsm(
881 TestInitFunctionWithNoGlobals.toString());
882module.__init__();
883assertEquals(51, module.caller());
884
Ben Murdoch097c5b22016-05-18 11:27:45 +0100885
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000886function TestExportNameDifferentFromFunctionName() {
887 "use asm";
888 function caller() {
889 return 55;
890 }
891 return {alt_caller:caller};
892}
893
894var module = _WASMEXP_.instantiateModuleFromAsm(
895 TestExportNameDifferentFromFunctionName.toString());
896module.__init__();
897assertEquals(55, module.alt_caller());
Ben Murdoch097c5b22016-05-18 11:27:45 +0100898
899
900function TestFunctionTableSingleFunction() {
901 "use asm";
902
903 function dummy() {
904 return 71;
905 }
906
907 function caller() {
908 return function_table[0&0]() | 0;
909 }
910
911 var function_table = [dummy]
912
913 return {caller:caller};
914}
915
916assertEquals(71, _WASMEXP_.instantiateModuleFromAsm(
917 TestFunctionTableSingleFunction.toString()).caller());
918
919
920function TestFunctionTableMultipleFunctions() {
921 "use asm";
922
923 function inc1(x) {
924 x = x|0;
925 return (x+1)|0;
926 }
927
928 function inc2(x) {
929 x = x|0;
930 return (x+2)|0;
931 }
932
933 function caller() {
934 if (function_table[0&1](50) == 51) {
935 if (function_table[1&1](60) == 62) {
936 return 73;
937 }
938 }
939 return 0;
940 }
941
942 var function_table = [inc1, inc2]
943
944 return {caller:caller};
945}
946
947assertEquals(73, _WASMEXP_.instantiateModuleFromAsm(
948 TestFunctionTableMultipleFunctions.toString()).caller());
949
950
951function TestFunctionTable() {
952 "use asm";
953
954 function add(a, b) {
955 a = a|0;
956 b = b|0;
957 return (a+b)|0;
958 }
959
960 function sub(a, b) {
961 a = a|0;
962 b = b|0;
963 return (a-b)|0;
964 }
965
966 function inc(a) {
967 a = a|0;
968 return (a+1)|0;
969 }
970
971 function caller(table_id, fun_id, arg1, arg2) {
972 table_id = table_id|0;
973 fun_id = fun_id|0;
974 arg1 = arg1|0;
975 arg2 = arg2|0;
976 if (table_id == 0) {
977 return funBin[fun_id&3](arg1, arg2)|0;
978 } else if (table_id == 1) {
979 return fun[fun_id&0](arg1)|0;
980 }
981 return 0;
982 }
983
984 var funBin = [add, sub, sub, add];
985 var fun = [inc];
986
987 return {caller:caller};
988}
989
990var module = _WASMEXP_.instantiateModuleFromAsm(TestFunctionTable.toString());
991module.__init__();
992assertEquals(55, module.caller(0, 0, 33, 22));
993assertEquals(11, module.caller(0, 1, 33, 22));
994assertEquals(9, module.caller(0, 2, 54, 45));
995assertEquals(99, module.caller(0, 3, 54, 45));
996assertEquals(23, module.caller(0, 4, 12, 11));
997assertEquals(31, module.caller(1, 0, 30, 11));
998
999
1000function TestForeignFunctions() {
1001 function AsmModule(stdlib, foreign, buffer) {
1002 "use asm";
1003
1004 var setVal = foreign.setVal;
1005 var getVal = foreign.getVal;
1006
1007 function caller(initial_value, new_value) {
1008 initial_value = initial_value|0;
1009 new_value = new_value|0;
1010 if ((getVal()|0) == (initial_value|0)) {
1011 setVal(new_value|0);
1012 return getVal()|0;
1013 }
1014 return 0;
1015 }
1016
1017 return {caller:caller};
1018 }
1019
1020 function ffi(initial_val) {
1021 var val = initial_val;
1022
1023 function getVal() {
1024 return val;
1025 }
1026
1027 function setVal(new_val) {
1028 val = new_val;
1029 }
1030
1031 return {getVal:getVal, setVal:setVal};
1032 }
1033
1034 var foreign = new ffi(23);
1035
1036 var module = _WASMEXP_.instantiateModuleFromAsm(AsmModule.toString(),
1037 foreign, null);
1038
1039 module.__init__();
1040 assertEquals(103, module.caller(23, 103));
1041}
1042
1043TestForeignFunctions();
1044
1045
1046function TestForeignFunctionMultipleUse() {
1047 function AsmModule(stdlib, foreign, buffer) {
1048 "use asm";
1049
1050 var getVal = foreign.getVal;
1051
1052 function caller(int_val, double_val) {
1053 int_val = int_val|0;
1054 double_val = +double_val;
1055 if ((getVal()|0) == (int_val|0)) {
1056 if ((+getVal()) == (+double_val)) {
1057 return 89;
1058 }
1059 }
1060 return 0;
1061 }
1062
1063 return {caller:caller};
1064 }
1065
1066 function ffi() {
1067 function getVal() {
1068 return 83.25;
1069 }
1070
1071 return {getVal:getVal};
1072 }
1073
1074 var foreign = new ffi();
1075
1076 var module = _WASMEXP_.instantiateModuleFromAsm(AsmModule.toString(),
1077 foreign, null);
1078
1079 module.__init__();
1080 assertEquals(89, module.caller(83, 83.25));
1081}
1082
1083TestForeignFunctionMultipleUse();
1084
1085
1086function TestForeignVariables() {
1087 function AsmModule(stdlib, foreign, buffer) {
1088 "use asm";
1089
1090 var i1 = foreign.foo | 0;
1091 var f1 = +foreign.bar;
1092 var i2 = foreign.baz | 0;
1093 var f2 = +foreign.baz;
1094
1095 function geti1() {
1096 return i1|0;
1097 }
1098
1099 function getf1() {
1100 return +f1;
1101 }
1102
1103 function geti2() {
1104 return i2|0;
1105 }
1106
1107 function getf2() {
1108 return +f2;
1109 }
1110
1111 return {geti1:geti1, getf1:getf1, geti2:geti2, getf2:getf2};
1112 }
1113
1114 function TestCase(env, i1, f1, i2, f2) {
1115 var module = _WASMEXP_.instantiateModuleFromAsm(
1116 AsmModule.toString(), env);
1117 module.__init__();
1118 assertEquals(i1, module.geti1());
1119 assertEquals(f1, module.getf1());
1120 assertEquals(i2, module.geti2());
1121 assertEquals(f2, module.getf2());
1122 }
1123
1124 // Check normal operation.
1125 TestCase({foo: 123, bar: 234.5, baz: 345.7}, 123, 234.5, 345, 345.7);
1126 // Check partial operation.
1127 TestCase({baz: 345.7}, 0, NaN, 345, 345.7);
1128 // Check that undefined values are converted to proper defaults.
1129 TestCase({qux: 999}, 0, NaN, 0, NaN);
1130 // Check that an undefined ffi is ok.
1131 TestCase(undefined, 0, NaN, 0, NaN);
1132 // Check that true values are converted properly.
1133 TestCase({foo: true, bar: true, baz: true}, 1, 1.0, 1, 1.0);
1134 // Check that false values are converted properly.
1135 TestCase({foo: false, bar: false, baz: false}, 0, 0, 0, 0);
1136 // Check that null values are converted properly.
1137 TestCase({foo: null, bar: null, baz: null}, 0, 0, 0, 0);
1138 // Check that string values are converted properly.
1139 TestCase({foo: 'hi', bar: 'there', baz: 'dude'}, 0, NaN, 0, NaN);
1140 TestCase({foo: '0xff', bar: '234', baz: '456.1'}, 255, 234, 456, 456.1, 456);
1141 // Check that Date values are converted properly.
1142 TestCase({foo: new Date(123), bar: new Date(456),
1143 baz: new Date(789)}, 123, 456, 789, 789);
1144 // Check that list values are converted properly.
1145 TestCase({foo: [], bar: [], baz: []}, 0, 0, 0, 0);
1146 // Check that object values are converted properly.
1147 TestCase({foo: {}, bar: {}, baz: {}}, 0, NaN, 0, NaN);
1148 // Check that getter object values are converted properly.
1149 var o = {
1150 get foo() {
1151 return 123.4;
1152 }
1153 };
1154 TestCase({foo: o.foo, bar: o.foo, baz: o.foo}, 123, 123.4, 123, 123.4);
1155 // Check that getter object values are converted properly.
1156 var o = {
1157 get baz() {
1158 return 123.4;
1159 }
1160 };
1161 TestCase(o, 0, NaN, 123, 123.4);
1162 // Check that objects with valueOf are converted properly.
1163 var o = {
1164 valueOf: function() { return 99; }
1165 };
1166 TestCase({foo: o, bar: o, baz: o}, 99, 99, 99, 99);
1167 // Check that function values are converted properly.
1168 TestCase({foo: TestCase, bar: TestCase, qux: TestCase}, 0, NaN, 0, NaN);
1169 // Check that a missing ffi object is safe.
1170 TestCase(undefined, 0, NaN, 0, NaN);
1171}
1172
1173TestForeignVariables();
1174
1175
1176(function() {
1177 function TestByteHeapAccessCompat(stdlib, foreign, buffer) {
1178 "use asm";
1179
1180 var HEAP8 = new stdlib.Uint8Array(buffer);
1181 var HEAP32 = new stdlib.Int32Array(buffer);
1182
1183 function store(i, v) {
1184 i = i | 0;
1185 v = v | 0;
1186 HEAP32[i >> 2] = v;
1187 }
1188
1189 function storeb(i, v) {
1190 i = i | 0;
1191 v = v | 0;
1192 HEAP8[i | 0] = v;
1193 }
1194
1195 function load(i) {
1196 i = i | 0;
1197 return HEAP8[i] | 0;
1198 }
1199
1200 function iload(i) {
1201 i = i | 0;
1202 return HEAP8[HEAP32[i >> 2] | 0] | 0;
1203 }
1204
1205 return {load: load, iload: iload, store: store, storeb: storeb};
1206 }
1207
1208 var m = _WASMEXP_.instantiateModuleFromAsm(
1209 TestByteHeapAccessCompat.toString());
1210 m.store(0, 20);
1211 m.store(4, 21);
1212 m.store(8, 22);
1213 m.storeb(20, 123);
1214 m.storeb(21, 42);
1215 m.storeb(22, 77);
1216 assertEquals(123, m.load(20));
1217 assertEquals(42, m.load(21));
1218 assertEquals(77, m.load(22));
1219 assertEquals(123, m.iload(0));
1220 assertEquals(42, m.iload(4));
1221 assertEquals(77, m.iload(8));
1222})();
1223
1224
1225(function TestGlobalBlock() {
1226 function Module(stdlib, foreign, buffer) {
1227 "use asm";
1228
1229 var x = foreign.x | 0, y = foreign.y | 0;
1230
1231 function test() {
1232 return (x + y) | 0;
1233 }
1234
1235 return {test: test};
1236 }
1237
1238 var m = _WASMEXP_.instantiateModuleFromAsm(
1239 Module.toString(), { x: 4, y: 11 });
1240 m.__init__();
1241 assertEquals(15, m.test());
1242})();
1243
1244
1245(function TestComma() {
1246 function CommaModule() {
1247 "use asm";
1248
1249 function ifunc(a, b) {
1250 a = +a;
1251 b = b | 0;
1252 return (a, b) | 0;
1253 }
1254
1255 function dfunc(a, b) {
1256 a = a | 0;
1257 b = +b;
1258 return +(a, b);
1259 }
1260
1261 return {ifunc: ifunc, dfunc: dfunc};
1262 }
1263
1264 var m = _WASMEXP_.instantiateModuleFromAsm(CommaModule.toString());
1265 assertEquals(123, m.ifunc(456.7, 123));
1266 assertEquals(123.4, m.dfunc(456, 123.4));
1267})();
1268
1269
1270(function TestOr() {
1271 function Module() {
1272 "use asm";
1273 function func() {
1274 var x = 1;
1275 var y = 2;
1276 return (x | y) | 0;
1277 }
1278 return {func: func};
1279 }
1280
1281 var m = _WASMEXP_.instantiateModuleFromAsm(Module.toString());
1282 assertEquals(3, m.func());
1283})();
1284
1285
1286(function TestAnd() {
1287 function Module() {
1288 "use asm";
1289 function func() {
1290 var x = 3;
1291 var y = 2;
1292 return (x & y) | 0;
1293 }
1294 return {func: func};
1295 }
1296
1297 var m = _WASMEXP_.instantiateModuleFromAsm(Module.toString());
1298 assertEquals(2, m.func());
1299})();
1300
1301
1302(function TestXor() {
1303 function Module() {
1304 "use asm";
1305 function func() {
1306 var x = 3;
1307 var y = 2;
1308 return (x ^ y) | 0;
1309 }
1310 return {func: func};
1311 }
1312
1313 var m = _WASMEXP_.instantiateModuleFromAsm(Module.toString());
1314 assertEquals(1, m.func());
1315})();
1316
1317
1318(function TestIntishAssignment() {
1319 function Module(stdlib, foreign, heap) {
1320 "use asm";
1321 var HEAP32 = new stdlib.Int32Array(heap);
1322 function func() {
1323 var a = 1;
1324 var b = 2;
1325 HEAP32[0] = a + b;
1326 return HEAP32[0] | 0;
1327 }
1328 return {func: func};
1329 }
1330
1331 var m = _WASMEXP_.instantiateModuleFromAsm(Module.toString());
1332 assertEquals(3, m.func());
1333})();
1334
1335
1336(function TestFloatishAssignment() {
1337 function Module(stdlib, foreign, heap) {
1338 "use asm";
1339 var HEAPF32 = new stdlib.Float32Array(heap);
1340 var fround = stdlib.Math.fround;
1341 function func() {
1342 var a = fround(1.0);
1343 var b = fround(2.0);
1344 HEAPF32[0] = a + b;
1345 return +HEAPF32[0];
1346 }
1347 return {func: func};
1348 }
1349
1350 var m = _WASMEXP_.instantiateModuleFromAsm(Module.toString());
1351 assertEquals(3, m.func());
1352}) // TODO(bradnelson): Enable when Math.fround implementation lands.