tor-browser

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

arraybuffer-transfer.js (1451B)


      1 load(libdir + "asm.js");
      2 
      3 function module(stdlib, foreign, buffer) {
      4  "use asm";
      5 
      6  var i32 = new stdlib.Int32Array(buffer);
      7 
      8  function zero() {
      9    return i32[0] | 0;
     10  }
     11  return zero;
     12 }
     13 
     14 const byteLength = BUF_MIN;
     15 let buffer = new ArrayBuffer(byteLength);
     16 let i32 = new Int32Array(buffer);
     17 let zero = module(globalThis, null, buffer);
     18 
     19 const magic = 0xbadf00d;
     20 
     21 assertEq(zero(), 0);
     22 assertEq(i32[0], 0);
     23 
     24 i32[0] = magic;
     25 
     26 assertEq(zero(), magic);
     27 assertEq(i32[0], magic);
     28 
     29 assertEq(buffer.detached, false);
     30 assertEq(buffer.byteLength, byteLength);
     31 
     32 if (isAsmJSCompilationAvailable()) {
     33  // asm.js compilation is enabled.
     34 
     35  assertEq(isAsmJSModule(module), true);
     36  assertEq(isAsmJSFunction(zero), true);
     37 
     38  // Can't transfer asm.js prepared array buffers.
     39  assertThrowsInstanceOf(() => buffer.transfer(), TypeError);
     40 
     41  // |buffer| is still attached.
     42  assertEq(buffer.detached, false);
     43  assertEq(buffer.byteLength, byteLength);
     44 
     45  // Access still returns the original value.
     46  assertEq(zero(), magic);
     47  assertEq(i32[0], magic);
     48 } else {
     49  // asm.js compilation is disabled.
     50 
     51  assertEq(isAsmJSModule(module), false);
     52  assertEq(isAsmJSFunction(zero), false);
     53 
     54  let copy = buffer.transfer();
     55 
     56  assertEq(buffer.detached, true);
     57  assertEq(buffer.byteLength, 0);
     58 
     59  assertEq(copy.detached, false);
     60  assertEq(copy.byteLength, byteLength);
     61 
     62  // Access returns undefined when detached.
     63  assertEq(zero(), 0);
     64  assertEq(i32[0], undefined);
     65 }