call-ref.js (2582B)
1 let counter; 2 function resetCounter() { counter = 0; } 3 4 function boxNextInt() { return {val: counter++}; } 5 function unboxInt(box) { return box.val; } 6 function boxNextThreeInts() { 7 return [boxNextInt(), boxNextInt(), boxNextInt()]; 8 } 9 function unboxThreeInts(x, y, z) { 10 return [unboxInt(x), unboxInt(y), unboxInt(z)]; 11 } 12 13 function testAddNextThreeIntsInner(addNextThreeInts) { 14 resetCounter(); 15 for (let n = 0; n < 100000; n += 3) { 16 assertEq(addNextThreeInts(), n * 3 + 3); 17 } 18 } 19 20 function testAddNextThreeInts(text, imports) { 21 let i = new WebAssembly.Instance( 22 new WebAssembly.Module(wasmTextToBinary(text)), { imports }); 23 24 testAddNextThreeIntsInner(() => i.exports.addNextThreeInts()); 25 } 26 27 testAddNextThreeInts(` 28 (module 29 (func $boxNextInt (import "imports" "boxNextInt") 30 (result externref)) 31 (func $unboxInt (import "imports" "unboxInt") 32 (param externref) (result i32)) 33 34 (func $boxNextThreeInts (result externref externref externref) 35 call $boxNextInt 36 call $boxNextInt 37 call $boxNextInt) 38 39 (func $unboxThreeInts (param externref externref externref) (result i32 i32 i32) 40 local.get 0 41 call $unboxInt 42 local.get 1 43 call $unboxInt 44 local.get 2 45 call $unboxInt) 46 47 (func $addNextThreeInts (export "addNextThreeInts") (result i32) 48 call $boxNextThreeInts 49 call $unboxThreeInts 50 i32.add 51 i32.add))`, 52 {boxNextInt, unboxInt}); 53 54 testAddNextThreeInts(` 55 (module 56 (func $boxNextThreeInts (import "imports" "boxNextThreeInts") 57 (result externref externref externref)) 58 (func $unboxThreeInts (import "imports" "unboxThreeInts") 59 (param externref externref externref) (result i32 i32 i32)) 60 61 (func $addNextThreeInts (export "addNextThreeInts") (result i32) 62 call $boxNextThreeInts 63 call $unboxThreeInts 64 i32.add 65 i32.add))`, 66 {boxNextThreeInts, unboxThreeInts}); 67 68 { 69 let i = wasmEvalText(` 70 (module 71 (func $boxNextThreeInts (import "imports" "boxNextThreeInts") 72 (result externref externref externref)) 73 74 (func (export "boxNextThreeInts") (result externref externref externref) 75 call $boxNextThreeInts))`, 76 {imports: {boxNextThreeInts}}); 77 testAddNextThreeIntsInner(() => { 78 let [a, b, c] = i.exports.boxNextThreeInts(); 79 return unboxInt(a) + unboxInt(b) + unboxInt(c); 80 }); 81 }