tor-browser

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

notraps.any.js (2684B)


      1 // META: global=window,dedicatedworker,jsshell
      2 // META: script=/wasm/jsapi/wasm-module-builder.js
      3 // META: script=/wasm/jsapi/jspi/testharness-additions.js
      4 
      5 test(() => {
      6    let builder = new WasmModuleBuilder();
      7    let js_tag = builder.addImportedTag("", "tag", kSig_v_r);
      8    let try_sig_index = builder.addType(kSig_i_v);
      9 
     10    let promise42 = new WebAssembly.Suspending(() => Promise.resolve(42));
     11    let kPromise42Ref = builder.addImport("", "promise42", kSig_i_v);
     12 
     13    builder.addFunction("test", kSig_i_v)
     14        .addBody([
     15        kExprTry, try_sig_index,
     16            kExprCallFunction, kPromise42Ref,
     17            kExprReturn,  // If there was no trap or exception, return
     18        kExprCatch, js_tag,
     19            kExprI32Const, 43,
     20            kExprReturn,
     21        kExprEnd,
     22        ])
     23        .exportFunc();
     24 
     25    let instance = builder.instantiate({"": {
     26        promise42: promise42,
     27        tag: WebAssembly.JSTag,
     28    }});
     29 
     30    assert_equals(43, instance.exports.test());
     31  },"catch SuspendError");
     32 
     33 promise_test(async t=>{
     34    let builder = new WasmModuleBuilder();
     35    let js_tag = builder.addImportedTag("", "tag", kSig_v_r);
     36    let try_sig_index = builder.addType(kSig_i_v);
     37 
     38    let promise42 = new WebAssembly.Suspending(() => Promise.resolve(42));
     39    let kPromise42Ref = builder.addImport("", "promise42", kSig_i_v);
     40    let backChnnlRef = builder.addImport("","backChnnl",kSig_i_v);
     41 
     42    builder.addFunction("main", kSig_i_v)
     43      .addBody([
     44        kExprTry, try_sig_index,
     45          kExprCallFunction, backChnnlRef,
     46          kExprReturn,  // If there was no trap or exception, return
     47        kExprCatch, js_tag,
     48          kExprI32Const, 43,
     49          kExprReturn,
     50        kExprEnd,
     51      ])
     52      .exportFunc();
     53 
     54      builder.addFunction("inner", kSig_i_v)
     55      .addBody([
     56        kExprCallFunction, kPromise42Ref,
     57      ])
     58      .exportFunc();
     59 
     60    let backChnnl = ()=>instance.exports.inner();
     61    let instance = builder.instantiate({"": {
     62        promise42: promise42,
     63        backChnnl: backChnnl,
     64        tag: WebAssembly.JSTag,
     65    }});
     66 
     67    wrapped_export = WebAssembly.promising(instance.exports.main);
     68 
     69    assert_equals(await wrapped_export(), 43);
     70  },"throw on reentrance");
     71 
     72 test(() => {
     73  let builder = new WasmModuleBuilder();
     74  import_index = builder.addImport('m', 'import', kSig_v_v);
     75  builder.addFunction("test", kSig_v_v)
     76      .addBody([
     77          kExprCallFunction, import_index,
     78      ]).exportFunc();
     79  let js_import = new WebAssembly.Suspending(() => Promise.resolve());
     80  let instance = builder.instantiate({m: {import: js_import}});
     81  assert_throws_js(WebAssembly.SuspendError, instance.exports.test);
     82 },"unwrapped export");