tor-browser

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

parsing.js (3819B)


      1 // Make sure we are correctly parsing this custom section.
      2 var code =`
      3 (module
      4    (func $$dummy)
      5    (func $main (param i32) (result i32)
      6        i32.const 0
      7        local.get 0
      8        i32.eq
      9        ;; Only allowed on br_if and if
     10        (@metadata.code.branch_hint "\\00") if
     11            call $$dummy
     12            i32.const 1
     13            return
     14        else
     15            call $$dummy
     16            i32.const 0
     17            return
     18        end
     19        i32.const 3
     20        return
     21    )
     22 
     23    (export "_main" (func $main))
     24 )`;
     25 
     26 let branchHintsModule = new WebAssembly.Module(wasmTextToBinary(code));
     27 assertEq(WebAssembly.Module.customSections(branchHintsModule, "metadata.code.branch_hint").length, 1);
     28 assertEq(wasmParsedBranchHints(branchHintsModule), true);
     29 
     30 let instance = new WebAssembly.Instance(branchHintsModule);
     31 assertEq(instance.exports._main(0), 1);
     32 
     33 // Testing branch hints parsing on `if` and `br_if`
     34 branchHintsModule = new WebAssembly.Module(wasmTextToBinary(`
     35 (module
     36    (func $main
     37      i32.const 0
     38      (@metadata.code.branch_hint "\\00")
     39      if
     40        i32.const 0
     41        (@metadata.code.branch_hint "\\01")
     42        br_if 0
     43      end
     44    )
     45    (export "_main" (func $main))
     46 )`));
     47 assertEq(wasmParsedBranchHints(branchHintsModule), true);
     48 instance = new WebAssembly.Instance(branchHintsModule);
     49 instance.exports._main();
     50 
     51 let m = new WebAssembly.Module(wasmTextToBinary(`
     52 (module
     53  (type (;0;) (func))
     54  (type (;1;) (func (param i32) (result i32)))
     55  (type (;2;) (func (result i32)))
     56  (func $__wasm_nullptr (type 0)
     57    unreachable)
     58  (func $main (type 2) (result i32)
     59    (local i32 i32 i32 i32)
     60    i32.const 0
     61    local.tee 2
     62    local.set 3
     63    loop
     64      local.get 2
     65      i32.const 50000
     66      i32.eq
     67      (@metadata.code.branch_hint "\\00") if
     68        i32.const 1
     69        local.set 3
     70      end
     71      local.get 2
     72      i32.const 1
     73      i32.add
     74      local.tee 2
     75      i32.const 100000
     76      i32.ne
     77      (@metadata.code.branch_hint "\\01") br_if 0 (;@1;)
     78    end
     79    local.get 3)
     80  (table (;0;) 1 1 funcref)
     81  (memory (;0;) 17 128)
     82  (global (;0;) (mut i32) (i32.const 42))
     83  (export "memory" (memory 0))
     84  (export "_main" (func $main))
     85  (elem (;0;) (i32.const 0) func $__wasm_nullptr)
     86  (type (;0;) (func (param i32)))
     87 )`));
     88 
     89 assertEq(wasmParsedBranchHints(m), true);
     90 instance = new WebAssembly.Instance(m);
     91 assertEq(instance.exports._main(0), 1);
     92 
     93 // Testing invalid values for branch hints
     94 assertErrorMessage(() => new WebAssembly.Module(wasmTextToBinary(`
     95 (module
     96    (func $main (param i32) (result i32)
     97      i32.const 0
     98      (@metadata.code.branch_hint "\\0000000") if
     99        i32.const 1
    100        return
    101      end
    102      i32.const 42
    103      return
    104    )
    105  )
    106 `)), SyntaxError, /invalid value for branch hint/);
    107 
    108 assertErrorMessage(() => new WebAssembly.Module(wasmTextToBinary(`
    109 (module
    110    (func $main (param i32) (result i32)
    111      i32.const 0
    112      (@metadata.code.branch_hint "\\02") if
    113        i32.const 1
    114        return
    115      end
    116      i32.const 42
    117      return
    118    )
    119  )
    120 `)), SyntaxError, /invalid value for branch hint/);
    121 
    122 assertErrorMessage(() => new WebAssembly.Module(wasmTextToBinary(`
    123 (module
    124    (func $main (param i32) (result i32)
    125      i32.const 0
    126      (@metadata.code.branch_hint "\\aaaa") if
    127        i32.const 1
    128        return
    129      end
    130      i32.const 42
    131      return
    132    )
    133  )
    134 `)), SyntaxError, /wasm text error/);
    135 
    136 assertErrorMessage(() => new WebAssembly.Module(wasmTextToBinary(`
    137 (module
    138    (func $main (param i32) (result i32)
    139      i32.const 0
    140      (@metadata.code.branch_hint) if
    141        i32.const 1
    142        return
    143      end
    144      i32.const 42
    145      return
    146    )
    147  )
    148 `)), SyntaxError, /wasm text error/);
    149 
    150 assertErrorMessage(() => new WebAssembly.Module(wasmTextToBinary(`
    151 (module
    152    (@metadata.code.branch_hint)
    153 )
    154 `)), SyntaxError, /wasm text error/);