tor-browser

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

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 }