// Flags: --js-immutable-arraybuffer 'use strict'; const common = require('../common'); const assert = require('assert'); // transferToImmutable is gated behind --js-immutable-arraybuffer (set above). // Skip if this V8 build does not expose the API even with the flag set. if (typeof ArrayBuffer.prototype.transferToImmutable !== 'function') common.skip('ArrayBuffer.prototype.transferToImmutable is not available'); // Copying *into* a buffer backed by an immutable ArrayBuffer must not write to // the read-only backing store. The copy is a no-op and reports 0 bytes copied. { const ab = new ArrayBuffer(8); new Uint8Array(ab).set([1, 2, 3, 4, 5, 6, 7, 8]); const target = Buffer.from(ab.transferToImmutable()); const source = Buffer.from([9, 9, 9, 9, 9, 9, 9, 9]); assert.strictEqual(source.copy(target), 0); assert.deepStrictEqual([...target], [1, 2, 3, 4, 5, 6, 7, 8]); // A partial / offset copy is also a no-op. assert.strictEqual(source.copy(target, 2, 0, 4), 0); assert.deepStrictEqual([...target], [1, 2, 3, 4, 5, 6, 7, 8]); } // Copying *from* a buffer backed by an immutable ArrayBuffer is allowed (reads // do not require a writable backing store) and reports the bytes copied. { const ab = new ArrayBuffer(8); new Uint8Array(ab).set([10, 20, 30, 40, 50, 60, 70, 80]); const source = Buffer.from(ab.transferToImmutable()); const target = Buffer.alloc(8); assert.strictEqual(source.copy(target), 8); assert.deepStrictEqual([...target], [10, 20, 30, 40, 50, 60, 70, 80]); } // A mutable Uint8Array view onto an immutable ArrayBuffer is still a read-only // target through Buffer.prototype.copy. { const ab = new ArrayBuffer(4); new Uint8Array(ab).set([100, 101, 102, 103]); const target = new Uint8Array(ab.transferToImmutable()); assert.strictEqual(Buffer.from([1, 2, 3, 4]).copy(target), 0); assert.deepStrictEqual([...target], [100, 101, 102, 103]); }