| // |reftest| skip-if(!xulRuntime.shell) |
| // Any copyright is dedicated to the Public Domain. |
| // http://creativecommons.org/licenses/publicdomain/ |
| |
| function test() { |
| // Note: -8 and -200 will trigger asm.js link failures because 8 and 200 |
| // bytes are below the minimum allowed size, and the buffer will not |
| // actually be converted to an asm.js buffer. |
| for (var size of [0, 8, 16, 200, 1000, 4096, -8, -200, -8192, -65536]) { |
| var buffer_ctor = (size < 0) ? AsmJSArrayBuffer : ArrayBuffer; |
| size = Math.abs(size); |
| |
| var old = new buffer_ctor(size); |
| var copy = deserialize(serialize(old, [old])); |
| assertEq(old.byteLength, 0); |
| assertEq(copy.byteLength, size); |
| |
| var constructors = [ Int8Array, |
| Uint8Array, |
| Int16Array, |
| Uint16Array, |
| Int32Array, |
| Uint32Array, |
| Float32Array, |
| Float64Array, |
| Uint8ClampedArray, |
| DataView ]; |
| |
| for (var ctor of constructors) { |
| var dataview = (ctor === DataView); |
| |
| var buf = new buffer_ctor(size); |
| var old_arr = new ctor(buf); |
| assertEq(buf.byteLength, size); |
| assertEq(buf, old_arr.buffer); |
| if (!dataview) |
| assertEq(old_arr.length, size / old_arr.BYTES_PER_ELEMENT); |
| |
| var copy_arr = deserialize(serialize(old_arr, [ buf ])); |
| assertEq(buf.byteLength, 0, "donor array buffer should be neutered"); |
| if (!dataview) |
| assertEq(old_arr.length, 0, "donor typed array should be neutered"); |
| assertEq(copy_arr.buffer.byteLength == size, true); |
| if (!dataview) |
| assertEq(copy_arr.length, size / old_arr.BYTES_PER_ELEMENT); |
| |
| buf = null; |
| old_arr = null; |
| gc(); // Tickle the ArrayBuffer -> view management |
| } |
| |
| for (var ctor of constructors) { |
| var dataview = (ctor === DataView); |
| |
| var buf = new buffer_ctor(size); |
| var old_arr = new ctor(buf); |
| var dv = new DataView(buf); // Second view |
| var copy_arr = deserialize(serialize(old_arr, [ buf ])); |
| assertEq(buf.byteLength, 0, "donor array buffer should be neutered"); |
| assertEq(old_arr.byteLength, 0, "donor typed array should be neutered"); |
| if (!dataview) |
| assertEq(old_arr.length, 0, "donor typed array should be neutered"); |
| assertEq(dv.byteLength, 0, "all views of donor array buffer should be neutered"); |
| |
| buf = null; |
| old_arr = null; |
| gc(); // Tickle the ArrayBuffer -> view management |
| } |
| |
| // Mutate the buffer during the clone operation. The modifications should be visible. |
| if (size >= 4) { |
| old = new buffer_ctor(size); |
| var view = new Int32Array(old); |
| view[0] = 1; |
| var mutator = { get foo() { view[0] = 2; } }; |
| var copy = deserialize(serialize([ old, mutator ], [old])); |
| var viewCopy = new Int32Array(copy[0]); |
| assertEq(view.length, 0); // Neutered |
| assertEq(viewCopy[0], 2); |
| } |
| |
| // Neuter the buffer during the clone operation. Should throw an exception. |
| if (size >= 4) { |
| old = new buffer_ctor(size); |
| var mutator = { |
| get foo() { |
| deserialize(serialize(old, [old])); |
| } |
| }; |
| // The throw is not yet implemented, bug 919259. |
| //var copy = deserialize(serialize([ old, mutator ], [old])); |
| } |
| } |
| } |
| |
| test(); |
| reportCompare(0, 0, 'ok'); |