basic2.js (2681B)
1 // New API experiments. 2 // Example from the proposal. 3 4 var compute_delta = async (i) => Promise.resolve(i / 100 || 1); 5 6 var suspending_compute_delta = new WebAssembly.Suspending( 7 compute_delta 8 ); 9 var ins = wasmEvalText(`(module 10 (import "js" "init_state" (func $init_state (result f64))) 11 (import "js" "compute_delta" 12 (func $compute_delta (param i32) (result f64))) 13 14 (global $suspender (mut externref) (ref.null extern)) 15 (global $state (mut f64) (f64.const nan)) 16 (func $init (global.set $state (call $init_state))) 17 (start $init) 18 19 (func $get_state (export "get_state") (result f64) (global.get $state)) 20 (func (export "update_state_export") (param i32) (result f64) 21 (global.set $state (f64.add 22 (global.get $state) (call $compute_delta (local.get 0)))) 23 (global.get $state) 24 ) 25 )`, { 26 js: { 27 init_state() { return 0; }, 28 compute_delta: suspending_compute_delta, 29 }, 30 }); 31 32 var update_state = WebAssembly.promising( 33 ins.exports.update_state_export 34 ); 35 36 var res = update_state(4); 37 var tasks = res.then((r) => { 38 print(r); 39 assertEq(ins.exports.get_state(), .04); 40 }); 41 42 assertEq(ins.exports.get_state(), 0); 43 44 // Also test with exceptions/traps. 45 46 async function test(c) { 47 var compute_delta = (i) => Promise.resolve(i/100 || 1); 48 if (c == 1) compute_delta = async (i) => {throw "ff"}; 49 if (c == 2) compute_delta = () => {throw "ff";} 50 51 var suspending_compute_delta = new WebAssembly.Suspending( 52 compute_delta 53 ); 54 var ins = wasmEvalText(`(module 55 (import "js" "init_state" (func $init_state (result f64))) 56 (import "js" "compute_delta" 57 (func $compute_delta (param i32) (result f64))) 58 59 (global $suspender (mut externref) (ref.null extern)) 60 (global $state (mut f64) (f64.const nan)) 61 (func $init (global.set $state (call $init_state))) 62 (start $init) 63 64 (func $get_state (export "get_state") (result f64) (global.get $state)) 65 (func (export "update_state_export") (param i32) (result f64) 66 ${c == 3 ? "(unreachable)" : ""} 67 (global.set $state (f64.add 68 (global.get $state) (call $compute_delta (local.get 0)))) 69 ${c == 4 ? "(unreachable)" : ""} 70 (global.get $state) 71 ) 72 )`, { 73 js: { 74 init_state() { return 0; }, 75 compute_delta: suspending_compute_delta, 76 }, 77 }); 78 79 var update_state = WebAssembly.promising( 80 ins.exports.update_state_export 81 ); 82 83 var res = update_state(4); 84 var p = res.then((r) => { 85 assertEq(c, 0); 86 assertEq(ins.exports.get_state(), .04); 87 }).catch(_ => { 88 assertEq(c > 0, true); 89 }); 90 91 assertEq(ins.exports.get_state(), 0); 92 await p; 93 } 94 95 for (let c = 0; c < 5; c++) { 96 tasks = tasks.then(() => test(c)); 97 }