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 }