tor-browser

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

memory-init.js (1259B)


      1 // |jit-test| heavy; allow-oom; skip-if: !canRunHugeMemoryTests()
      2 
      3 var S = (function () {
      4    let s = "";
      5    for ( let i=0; i < 16; i++ )
      6        s += "0123456789abcdef"
      7    return s;
      8 })();
      9 
     10 for (let shared of ['', 'shared']) {
     11    try {
     12        var ins = new WebAssembly.Instance(new WebAssembly.Module(wasmTextToBinary(`
     13 (module
     14  (memory (export "mem") i64 65537 65537 ${shared})
     15  (data $d "${S}")
     16  (func (export "f") (param $p i64) (param $o i32) (param $n i32)
     17    (memory.init $d (local.get $p) (local.get $o) (local.get $n))))`)));
     18    } catch (e) {
     19        if (e instanceof WebAssembly.RuntimeError && String(e).match(/too many memory pages/)) {
     20            quit(0);
     21        }
     22        throw e;
     23    }
     24 
     25    var mem = new Uint8Array(ins.exports.mem.buffer);
     26 
     27    // Init above 4GB
     28    doit(mem, 0x1_0000_1000, 1, S.length-1);
     29 
     30    // Init above 4GB with OOM
     31    assertErrorMessage(() => ins.exports.f(0x1_0000_ff80n, 0, 256),
     32                       WebAssembly.RuntimeError,
     33                       /out of bounds/);
     34 
     35    // Init across 4GB
     36    doit(mem, 0xffff_ff80, 3, 200);
     37 }
     38 
     39 function doit(mem, addr, offs, n) {
     40    ins.exports.f(BigInt(addr), offs, n);
     41    for (let i=0; i < n; i++) {
     42        assertEq(mem[addr+i], S.charCodeAt(offs+i));
     43    }
     44 }