tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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 }