OLD | NEW |
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 // Flags: --expose-wasm | 5 // Flags: --expose-wasm |
6 | 6 |
7 function assertWasm(expected, func, ffi) { | 7 function assertWasm(expected, func, ffi) { |
8 print("Testing " + func.name + "..."); | 8 print("Testing " + func.name + "..."); |
9 assertEquals(expected, Wasm.instantiateModuleFromAsm( | 9 assertEquals(expected, Wasm.instantiateModuleFromAsm( |
10 func.toString(), ffi).caller()); | 10 func.toString(), ffi).caller()); |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
138 } | 138 } |
139 | 139 |
140 assertWasm(1, TestAddSimple); | 140 assertWasm(1, TestAddSimple); |
141 | 141 |
142 | 142 |
143 function TestWhileSimple() { | 143 function TestWhileSimple() { |
144 "use asm"; | 144 "use asm"; |
145 | 145 |
146 function caller() { | 146 function caller() { |
147 var x = 0; | 147 var x = 0; |
148 while(x < 5) { | 148 while((x|0) < 5) { |
149 x = (x + 1)|0; | 149 x = (x + 1)|0; |
150 } | 150 } |
151 return x|0; | 151 return x|0; |
152 } | 152 } |
153 | 153 |
154 return {caller: caller}; | 154 return {caller: caller}; |
155 } | 155 } |
156 | 156 |
157 assertWasm(5, TestWhileSimple); | 157 assertWasm(5, TestWhileSimple); |
158 | 158 |
159 | 159 |
160 function TestWhileWithoutBraces() { | 160 function TestWhileWithoutBraces() { |
161 "use asm"; | 161 "use asm"; |
162 | 162 |
163 function caller() { | 163 function caller() { |
164 var x = 0; | 164 var x = 0; |
165 while(x <= 3) | 165 while((x|0) <= 3) |
166 x = (x + 1)|0; | 166 x = (x + 1)|0; |
167 return x|0; | 167 return x|0; |
168 } | 168 } |
169 | 169 |
170 return {caller: caller}; | 170 return {caller: caller}; |
171 } | 171 } |
172 | 172 |
173 assertWasm(4, TestWhileWithoutBraces); | 173 assertWasm(4, TestWhileWithoutBraces); |
174 | 174 |
175 | 175 |
176 function TestReturnInWhile() { | 176 function TestReturnInWhile() { |
177 "use asm"; | 177 "use asm"; |
178 | 178 |
179 function caller() { | 179 function caller() { |
180 var x = 0; | 180 var x = 0; |
181 while(x < 10) { | 181 while((x|0) < 10) { |
182 x = (x + 6)|0; | 182 x = (x + 6)|0; |
183 return x|0; | 183 return x|0; |
184 } | 184 } |
185 return x|0; | 185 return x|0; |
186 } | 186 } |
187 | 187 |
188 return {caller: caller}; | 188 return {caller: caller}; |
189 } | 189 } |
190 | 190 |
191 assertWasm(6, TestReturnInWhile); | 191 assertWasm(6, TestReturnInWhile); |
192 | 192 |
193 | 193 |
194 function TestReturnInWhileWithoutBraces() { | 194 function TestReturnInWhileWithoutBraces() { |
195 "use asm"; | 195 "use asm"; |
196 | 196 |
197 function caller() { | 197 function caller() { |
198 var x = 0; | 198 var x = 0; |
199 while(x < 5) | 199 while((x|0) < 5) |
200 return 7; | 200 return 7; |
201 return x|0; | 201 return x|0; |
202 } | 202 } |
203 | 203 |
204 return {caller: caller}; | 204 return {caller: caller}; |
205 } | 205 } |
206 | 206 |
207 assertWasm(7, TestReturnInWhileWithoutBraces); | 207 assertWasm(7, TestReturnInWhileWithoutBraces); |
208 | 208 |
209 | 209 |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
311 assertWasm(9, TestBreakInNestedWhile); | 311 assertWasm(9, TestBreakInNestedWhile); |
312 | 312 |
313 | 313 |
314 function TestBreakInBlock() { | 314 function TestBreakInBlock() { |
315 "use asm"; | 315 "use asm"; |
316 | 316 |
317 function caller() { | 317 function caller() { |
318 var x = 0; | 318 var x = 0; |
319 abc: { | 319 abc: { |
320 x = 10; | 320 x = 10; |
321 if (x == 10) { | 321 if ((x|0) == 10) { |
322 break abc; | 322 break abc; |
323 } | 323 } |
324 x = 20; | 324 x = 20; |
325 } | 325 } |
326 return x|0; | 326 return x|0; |
327 } | 327 } |
328 | 328 |
329 return {caller: caller}; | 329 return {caller: caller}; |
330 } | 330 } |
331 | 331 |
332 assertWasm(10, TestBreakInBlock); | 332 assertWasm(10, TestBreakInBlock); |
333 | 333 |
334 | 334 |
335 function TestBreakInNamedWhile() { | 335 function TestBreakInNamedWhile() { |
336 "use asm"; | 336 "use asm"; |
337 | 337 |
338 function caller() { | 338 function caller() { |
339 var x = 0; | 339 var x = 0; |
340 outer: while (1) { | 340 outer: while (1) { |
341 x = (x + 1)|0; | 341 x = (x + 1)|0; |
342 while (x == 11) { | 342 while ((x|0) == 11) { |
343 break outer; | 343 break outer; |
344 } | 344 } |
345 } | 345 } |
346 return x|0; | 346 return x|0; |
347 } | 347 } |
348 | 348 |
349 return {caller: caller}; | 349 return {caller: caller}; |
350 } | 350 } |
351 | 351 |
352 assertWasm(11, TestBreakInNamedWhile); | 352 assertWasm(11, TestBreakInNamedWhile); |
353 | 353 |
354 | 354 |
355 function TestContinue() { | 355 function TestContinue() { |
356 "use asm"; | 356 "use asm"; |
357 | 357 |
358 function caller() { | 358 function caller() { |
359 var x = 5; | 359 var x = 5; |
360 var ret = 0; | 360 var ret = 0; |
361 while (x >= 0) { | 361 while ((x|0) >= 0) { |
362 x = (x - 1)|0; | 362 x = (x - 1)|0; |
363 if (x == 2) { | 363 if ((x|0) == 2) { |
364 continue; | 364 continue; |
365 } | 365 } |
366 ret = (ret - 1)|0; | 366 ret = (ret - 1)|0; |
367 } | 367 } |
368 return ret|0; | 368 return ret|0; |
369 } | 369 } |
370 | 370 |
371 return {caller: caller}; | 371 return {caller: caller}; |
372 } | 372 } |
373 | 373 |
374 assertWasm(-5, TestContinue); | 374 assertWasm(-5, TestContinue); |
375 | 375 |
376 | 376 |
377 function TestContinueInNamedWhile() { | 377 function TestContinueInNamedWhile() { |
378 "use asm"; | 378 "use asm"; |
379 | 379 |
380 function caller() { | 380 function caller() { |
381 var x = 5; | 381 var x = 5; |
382 var y = 0; | 382 var y = 0; |
383 var ret = 0; | 383 var ret = 0; |
384 outer: while (x > 0) { | 384 outer: while ((x|0) > 0) { |
385 x = (x - 1)|0; | 385 x = (x - 1)|0; |
386 y = 0; | 386 y = 0; |
387 while (y < 5) { | 387 while ((y|0) < 5) { |
388 if (x == 3) { | 388 if ((x|0) == 3) { |
389 continue outer; | 389 continue outer; |
390 } | 390 } |
391 ret = (ret + 1)|0; | 391 ret = (ret + 1)|0; |
392 y = (y + 1)|0; | 392 y = (y + 1)|0; |
393 } | 393 } |
394 } | 394 } |
395 return ret|0; | 395 return ret|0; |
396 } | 396 } |
397 | 397 |
398 return {caller: caller}; | 398 return {caller: caller}; |
(...skipping 14 matching lines...) Expand all Loading... |
413 } | 413 } |
414 | 414 |
415 assertWasm(1, TestNot); | 415 assertWasm(1, TestNot); |
416 | 416 |
417 | 417 |
418 function TestNotEquals() { | 418 function TestNotEquals() { |
419 "use asm"; | 419 "use asm"; |
420 | 420 |
421 function caller() { | 421 function caller() { |
422 var a = 3; | 422 var a = 3; |
423 if (a != 2) { | 423 if ((a|0) != 2) { |
424 return 21; | 424 return 21; |
425 } | 425 } |
426 return 0; | 426 return 0; |
427 } | 427 } |
428 | 428 |
429 return {caller:caller}; | 429 return {caller:caller}; |
430 } | 430 } |
431 | 431 |
432 assertWasm(21, TestNotEquals); | 432 assertWasm(21, TestNotEquals); |
433 | 433 |
(...skipping 17 matching lines...) Expand all Loading... |
451 | 451 |
452 function TestMixedAdd() { | 452 function TestMixedAdd() { |
453 "use asm"; | 453 "use asm"; |
454 | 454 |
455 function caller() { | 455 function caller() { |
456 var a = 0x80000000; | 456 var a = 0x80000000; |
457 var b = 0x7fffffff; | 457 var b = 0x7fffffff; |
458 var c = 0; | 458 var c = 0; |
459 c = ((a>>>0) + b)|0; | 459 c = ((a>>>0) + b)|0; |
460 if ((c >>> 0) > (0>>>0)) { | 460 if ((c >>> 0) > (0>>>0)) { |
461 if (c < 0) { | 461 if ((c|0) < 0) { |
462 return 23; | 462 return 23; |
463 } | 463 } |
464 } | 464 } |
465 return 0; | 465 return 0; |
466 } | 466 } |
467 | 467 |
468 return {caller:caller}; | 468 return {caller:caller}; |
469 } | 469 } |
470 | 470 |
471 assertWasm(23, TestMixedAdd); | 471 assertWasm(23, TestMixedAdd); |
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
726 var module = Wasm.instantiateModuleFromAsm(TestGlobalsWithInit.toString()); | 726 var module = Wasm.instantiateModuleFromAsm(TestGlobalsWithInit.toString()); |
727 assertEquals(77.5, module.add()); | 727 assertEquals(77.5, module.add()); |
728 })(); | 728 })(); |
729 | 729 |
730 function TestForLoop() { | 730 function TestForLoop() { |
731 "use asm" | 731 "use asm" |
732 | 732 |
733 function caller() { | 733 function caller() { |
734 var ret = 0; | 734 var ret = 0; |
735 var i = 0; | 735 var i = 0; |
736 for (i = 2; i <= 10; i = (i+1)|0) { | 736 for (i = 2; (i|0) <= 10; i = (i+1)|0) { |
737 ret = (ret + i) | 0; | 737 ret = (ret + i) | 0; |
738 } | 738 } |
739 return ret|0; | 739 return ret|0; |
740 } | 740 } |
741 | 741 |
742 return {caller:caller}; | 742 return {caller:caller}; |
743 } | 743 } |
744 | 744 |
745 assertWasm(54, TestForLoop); | 745 assertWasm(54, TestForLoop); |
746 | 746 |
747 | 747 |
748 function TestForLoopWithoutInit() { | 748 function TestForLoopWithoutInit() { |
749 "use asm" | 749 "use asm" |
750 | 750 |
751 function caller() { | 751 function caller() { |
752 var ret = 0; | 752 var ret = 0; |
753 var i = 0; | 753 var i = 0; |
754 for (; i < 10; i = (i+1)|0) { | 754 for (; (i|0) < 10; i = (i+1)|0) { |
755 ret = (ret + 10) | 0; | 755 ret = (ret + 10) | 0; |
756 } | 756 } |
757 return ret|0; | 757 return ret|0; |
758 } | 758 } |
759 | 759 |
760 return {caller:caller}; | 760 return {caller:caller}; |
761 } | 761 } |
762 | 762 |
763 assertWasm(100,TestForLoopWithoutInit); | 763 assertWasm(100,TestForLoopWithoutInit); |
764 | 764 |
765 | 765 |
766 function TestForLoopWithoutCondition() { | 766 function TestForLoopWithoutCondition() { |
767 "use asm" | 767 "use asm" |
768 | 768 |
769 function caller() { | 769 function caller() { |
770 var ret = 0; | 770 var ret = 0; |
771 var i = 0; | 771 var i = 0; |
772 for (i=1;; i = (i+1)|0) { | 772 for (i=1;; i = (i+1)|0) { |
773 ret = (ret + i) | 0; | 773 ret = (ret + i) | 0; |
774 if (i == 11) { | 774 if ((i|0) == 11) { |
775 break; | 775 break; |
776 } | 776 } |
777 } | 777 } |
778 return ret|0; | 778 return ret|0; |
779 } | 779 } |
780 | 780 |
781 return {caller:caller}; | 781 return {caller:caller}; |
782 } | 782 } |
783 | 783 |
784 assertWasm(66, TestForLoopWithoutCondition); | 784 assertWasm(66, TestForLoopWithoutCondition); |
785 | 785 |
786 | 786 |
787 function TestForLoopWithoutNext() { | 787 function TestForLoopWithoutNext() { |
788 "use asm" | 788 "use asm" |
789 | 789 |
790 function caller() { | 790 function caller() { |
791 var i = 0; | 791 var i = 0; |
792 for (i=1; i < 41;) { | 792 for (i=1; (i|0) < 41;) { |
793 i = (i + 1) | 0; | 793 i = (i + 1) | 0; |
794 } | 794 } |
795 return i|0; | 795 return i|0; |
796 } | 796 } |
797 | 797 |
798 return {caller:caller}; | 798 return {caller:caller}; |
799 } | 799 } |
800 | 800 |
801 assertWasm(41, TestForLoopWithoutNext); | 801 assertWasm(41, TestForLoopWithoutNext); |
802 | 802 |
803 | 803 |
804 function TestForLoopWithoutBody() { | 804 function TestForLoopWithoutBody() { |
805 "use asm" | 805 "use asm" |
806 | 806 |
807 function caller() { | 807 function caller() { |
808 var i = 0; | 808 var i = 0; |
809 for (i=1; i < 45 ; i = (i+1)|0) { | 809 for (i=1; (i|0) < 45 ; i = (i+1)|0) { |
810 } | 810 } |
811 return i|0; | 811 return i|0; |
812 } | 812 } |
813 | 813 |
814 return {caller:caller}; | 814 return {caller:caller}; |
815 } | 815 } |
816 | 816 |
817 assertWasm(45, TestForLoopWithoutBody); | 817 assertWasm(45, TestForLoopWithoutBody); |
818 | 818 |
819 | 819 |
820 function TestDoWhile() { | 820 function TestDoWhile() { |
821 "use asm" | 821 "use asm" |
822 | 822 |
823 function caller() { | 823 function caller() { |
824 var i = 0; | 824 var i = 0; |
825 var ret = 21; | 825 var ret = 21; |
826 do { | 826 do { |
827 ret = (ret + ret)|0; | 827 ret = (ret + ret)|0; |
828 i = (i + 1)|0; | 828 i = (i + 1)|0; |
829 } while (i < 2); | 829 } while ((i|0) < 2); |
830 return ret|0; | 830 return ret|0; |
831 } | 831 } |
832 | 832 |
833 return {caller:caller}; | 833 return {caller:caller}; |
834 } | 834 } |
835 | 835 |
836 assertWasm(84, TestDoWhile); | 836 assertWasm(84, TestDoWhile); |
837 | 837 |
838 | 838 |
839 function TestConditional() { | 839 function TestConditional() { |
840 "use asm" | 840 "use asm" |
841 | 841 |
842 function caller() { | 842 function caller() { |
843 var x = 1; | 843 var x = 1; |
844 return ((x > 0) ? 41 : 71)|0; | 844 return (((x|0) > 0) ? 41 : 71)|0; |
845 } | 845 } |
846 | 846 |
847 return {caller:caller}; | 847 return {caller:caller}; |
848 } | 848 } |
849 | 849 |
850 assertWasm(41, TestConditional); | 850 assertWasm(41, TestConditional); |
851 | 851 |
852 | 852 |
853 (function () { | 853 (function () { |
854 function TestInitFunctionWithNoGlobals() { | 854 function TestInitFunctionWithNoGlobals() { |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
904 x = x|0; | 904 x = x|0; |
905 return (x+1)|0; | 905 return (x+1)|0; |
906 } | 906 } |
907 | 907 |
908 function inc2(x) { | 908 function inc2(x) { |
909 x = x|0; | 909 x = x|0; |
910 return (x+2)|0; | 910 return (x+2)|0; |
911 } | 911 } |
912 | 912 |
913 function caller() { | 913 function caller() { |
914 if (function_table[0&1](50) == 51) { | 914 if ((function_table[0&1](50)|0) == 51) { |
915 if (function_table[1&1](60) == 62) { | 915 if ((function_table[1&1](60)|0) == 62) { |
916 return 73; | 916 return 73; |
917 } | 917 } |
918 } | 918 } |
919 return 0; | 919 return 0; |
920 } | 920 } |
921 | 921 |
922 var function_table = [inc1, inc2] | 922 var function_table = [inc1, inc2] |
923 | 923 |
924 return {caller:caller}; | 924 return {caller:caller}; |
925 } | 925 } |
(...skipping 20 matching lines...) Expand all Loading... |
946 function inc(a) { | 946 function inc(a) { |
947 a = a|0; | 947 a = a|0; |
948 return (a+1)|0; | 948 return (a+1)|0; |
949 } | 949 } |
950 | 950 |
951 function caller(table_id, fun_id, arg1, arg2) { | 951 function caller(table_id, fun_id, arg1, arg2) { |
952 table_id = table_id|0; | 952 table_id = table_id|0; |
953 fun_id = fun_id|0; | 953 fun_id = fun_id|0; |
954 arg1 = arg1|0; | 954 arg1 = arg1|0; |
955 arg2 = arg2|0; | 955 arg2 = arg2|0; |
956 if (table_id == 0) { | 956 if ((table_id|0) == 0) { |
957 return funBin[fun_id&3](arg1, arg2)|0; | 957 return funBin[fun_id&3](arg1, arg2)|0; |
958 } else if (table_id == 1) { | 958 } else if ((table_id|0) == 1) { |
959 return fun[fun_id&0](arg1)|0; | 959 return fun[fun_id&0](arg1)|0; |
960 } | 960 } |
961 return 0; | 961 return 0; |
962 } | 962 } |
963 | 963 |
964 var funBin = [add, sub, sub, add]; | 964 var funBin = [add, sub, sub, add]; |
965 var fun = [inc]; | 965 var fun = [inc]; |
966 | 966 |
967 return {caller:caller}; | 967 return {caller:caller}; |
968 } | 968 } |
(...skipping 566 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1535 assertThrows(function() { | 1535 assertThrows(function() { |
1536 Wasm.instantiateModuleFromAsm('33;'); | 1536 Wasm.instantiateModuleFromAsm('33;'); |
1537 }); | 1537 }); |
1538 })(); | 1538 })(); |
1539 | 1539 |
1540 (function TestBadVarDeclaration() { | 1540 (function TestBadVarDeclaration() { |
1541 assertThrows(function() { | 1541 assertThrows(function() { |
1542 Wasm.instantiateModuleFromAsm('var x = 3;'); | 1542 Wasm.instantiateModuleFromAsm('var x = 3;'); |
1543 }); | 1543 }); |
1544 })(); | 1544 })(); |
OLD | NEW |