1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/js/src/tests/js1_8_5/extensions/clone-transferables.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,87 @@ 1.4 +// |reftest| skip-if(!xulRuntime.shell) 1.5 +// Any copyright is dedicated to the Public Domain. 1.6 +// http://creativecommons.org/licenses/publicdomain/ 1.7 + 1.8 +function test() { 1.9 + // Note: -8 and -200 will trigger asm.js link failures because 8 and 200 1.10 + // bytes are below the minimum allowed size, and the buffer will not 1.11 + // actually be converted to an asm.js buffer. 1.12 + for (var size of [0, 8, 16, 200, 1000, 4096, -8, -200, -8192, -65536]) { 1.13 + var buffer_ctor = (size < 0) ? AsmJSArrayBuffer : ArrayBuffer; 1.14 + size = Math.abs(size); 1.15 + 1.16 + var old = new buffer_ctor(size); 1.17 + var copy = deserialize(serialize(old, [old])); 1.18 + assertEq(old.byteLength, 0); 1.19 + assertEq(copy.byteLength, size); 1.20 + 1.21 + var constructors = [ Int8Array, 1.22 + Uint8Array, 1.23 + Int16Array, 1.24 + Uint16Array, 1.25 + Int32Array, 1.26 + Uint32Array, 1.27 + Float32Array, 1.28 + Float64Array, 1.29 + Uint8ClampedArray ]; 1.30 + 1.31 + for (var ctor of constructors) { 1.32 + var buf = new buffer_ctor(size); 1.33 + var old_arr = new ctor(buf); 1.34 + assertEq(buf.byteLength, size); 1.35 + assertEq(buf, old_arr.buffer); 1.36 + assertEq(old_arr.length, size / old_arr.BYTES_PER_ELEMENT); 1.37 + 1.38 + var copy_arr = deserialize(serialize(old_arr, [ buf ])); 1.39 + assertEq(buf.byteLength, 0, "donor array buffer should be neutered"); 1.40 + assertEq(old_arr.length, 0, "donor typed array should be neutered"); 1.41 + assertEq(copy_arr.buffer.byteLength == size, true); 1.42 + assertEq(copy_arr.length, size / old_arr.BYTES_PER_ELEMENT); 1.43 + 1.44 + buf = null; 1.45 + old_arr = null; 1.46 + gc(); // Tickle the ArrayBuffer -> view management 1.47 + } 1.48 + 1.49 + for (var ctor of constructors) { 1.50 + var buf = new buffer_ctor(size); 1.51 + var old_arr = new ctor(buf); 1.52 + var dv = new DataView(buf); // Second view 1.53 + var copy_arr = deserialize(serialize(old_arr, [ buf ])); 1.54 + assertEq(buf.byteLength, 0, "donor array buffer should be neutered"); 1.55 + assertEq(old_arr.length, 0, "donor typed array should be neutered"); 1.56 + assertEq(dv.byteLength, 0, "all views of donor array buffer should be neutered"); 1.57 + 1.58 + buf = null; 1.59 + old_arr = null; 1.60 + gc(); // Tickle the ArrayBuffer -> view management 1.61 + } 1.62 + 1.63 + // Mutate the buffer during the clone operation. The modifications should be visible. 1.64 + if (size >= 4) { 1.65 + old = new buffer_ctor(size); 1.66 + var view = new Int32Array(old); 1.67 + view[0] = 1; 1.68 + var mutator = { get foo() { view[0] = 2; } }; 1.69 + var copy = deserialize(serialize([ old, mutator ], [old])); 1.70 + var viewCopy = new Int32Array(copy[0]); 1.71 + assertEq(view.length, 0); // Neutered 1.72 + assertEq(viewCopy[0], 2); 1.73 + } 1.74 + 1.75 + // Neuter the buffer during the clone operation. Should throw an exception. 1.76 + if (size >= 4) { 1.77 + old = new buffer_ctor(size); 1.78 + var mutator = { 1.79 + get foo() { 1.80 + deserialize(serialize(old, [old])); 1.81 + } 1.82 + }; 1.83 + // The throw is not yet implemented, bug 919259. 1.84 + //var copy = deserialize(serialize([ old, mutator ], [old])); 1.85 + } 1.86 + } 1.87 +} 1.88 + 1.89 +test(); 1.90 +reportCompare(0, 0, 'ok');