diff options
Diffstat (limited to 'js/src/jit-test/tests/asm.js/arraybuffer-transfer.js')
-rw-r--r-- | js/src/jit-test/tests/asm.js/arraybuffer-transfer.js | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/asm.js/arraybuffer-transfer.js b/js/src/jit-test/tests/asm.js/arraybuffer-transfer.js new file mode 100644 index 0000000000..c96df0536a --- /dev/null +++ b/js/src/jit-test/tests/asm.js/arraybuffer-transfer.js @@ -0,0 +1,65 @@ +load(libdir + "asm.js"); + +function module(stdlib, foreign, buffer) { + "use asm"; + + var i32 = new stdlib.Int32Array(buffer); + + function zero() { + return i32[0] | 0; + } + return zero; +} + +const byteLength = BUF_MIN; +let buffer = new ArrayBuffer(byteLength); +let i32 = new Int32Array(buffer); +let zero = module(globalThis, null, buffer); + +const magic = 0xbadf00d; + +assertEq(zero(), 0); +assertEq(i32[0], 0); + +i32[0] = magic; + +assertEq(zero(), magic); +assertEq(i32[0], magic); + +assertEq(buffer.detached, false); +assertEq(buffer.byteLength, byteLength); + +if (isAsmJSCompilationAvailable()) { + // asm.js compilation is enabled. + + assertEq(isAsmJSModule(module), true); + assertEq(isAsmJSFunction(zero), true); + + // Can't transfer asm.js prepared array buffers. + assertThrowsInstanceOf(() => buffer.transfer(), TypeError); + + // |buffer| is still attached. + assertEq(buffer.detached, false); + assertEq(buffer.byteLength, byteLength); + + // Access still returns the original value. + assertEq(zero(), magic); + assertEq(i32[0], magic); +} else { + // asm.js compilation is disabled. + + assertEq(isAsmJSModule(module), false); + assertEq(isAsmJSFunction(zero), false); + + let copy = buffer.transfer(); + + assertEq(buffer.detached, true); + assertEq(buffer.byteLength, 0); + + assertEq(copy.detached, false); + assertEq(copy.byteLength, byteLength); + + // Access returns undefined when detached. + assertEq(zero(), 0); + assertEq(i32[0], undefined); +} |