js/src/tests/js1_8_5/extensions/clone-transferables.js

branch
TOR_BUG_3246
changeset 7
129ffea94266
equal deleted inserted replaced
-1:000000000000 0:9d1da6c6b7a4
1 // |reftest| skip-if(!xulRuntime.shell)
2 // Any copyright is dedicated to the Public Domain.
3 // http://creativecommons.org/licenses/publicdomain/
4
5 function test() {
6 // Note: -8 and -200 will trigger asm.js link failures because 8 and 200
7 // bytes are below the minimum allowed size, and the buffer will not
8 // actually be converted to an asm.js buffer.
9 for (var size of [0, 8, 16, 200, 1000, 4096, -8, -200, -8192, -65536]) {
10 var buffer_ctor = (size < 0) ? AsmJSArrayBuffer : ArrayBuffer;
11 size = Math.abs(size);
12
13 var old = new buffer_ctor(size);
14 var copy = deserialize(serialize(old, [old]));
15 assertEq(old.byteLength, 0);
16 assertEq(copy.byteLength, size);
17
18 var constructors = [ Int8Array,
19 Uint8Array,
20 Int16Array,
21 Uint16Array,
22 Int32Array,
23 Uint32Array,
24 Float32Array,
25 Float64Array,
26 Uint8ClampedArray ];
27
28 for (var ctor of constructors) {
29 var buf = new buffer_ctor(size);
30 var old_arr = new ctor(buf);
31 assertEq(buf.byteLength, size);
32 assertEq(buf, old_arr.buffer);
33 assertEq(old_arr.length, size / old_arr.BYTES_PER_ELEMENT);
34
35 var copy_arr = deserialize(serialize(old_arr, [ buf ]));
36 assertEq(buf.byteLength, 0, "donor array buffer should be neutered");
37 assertEq(old_arr.length, 0, "donor typed array should be neutered");
38 assertEq(copy_arr.buffer.byteLength == size, true);
39 assertEq(copy_arr.length, size / old_arr.BYTES_PER_ELEMENT);
40
41 buf = null;
42 old_arr = null;
43 gc(); // Tickle the ArrayBuffer -> view management
44 }
45
46 for (var ctor of constructors) {
47 var buf = new buffer_ctor(size);
48 var old_arr = new ctor(buf);
49 var dv = new DataView(buf); // Second view
50 var copy_arr = deserialize(serialize(old_arr, [ buf ]));
51 assertEq(buf.byteLength, 0, "donor array buffer should be neutered");
52 assertEq(old_arr.length, 0, "donor typed array should be neutered");
53 assertEq(dv.byteLength, 0, "all views of donor array buffer should be neutered");
54
55 buf = null;
56 old_arr = null;
57 gc(); // Tickle the ArrayBuffer -> view management
58 }
59
60 // Mutate the buffer during the clone operation. The modifications should be visible.
61 if (size >= 4) {
62 old = new buffer_ctor(size);
63 var view = new Int32Array(old);
64 view[0] = 1;
65 var mutator = { get foo() { view[0] = 2; } };
66 var copy = deserialize(serialize([ old, mutator ], [old]));
67 var viewCopy = new Int32Array(copy[0]);
68 assertEq(view.length, 0); // Neutered
69 assertEq(viewCopy[0], 2);
70 }
71
72 // Neuter the buffer during the clone operation. Should throw an exception.
73 if (size >= 4) {
74 old = new buffer_ctor(size);
75 var mutator = {
76 get foo() {
77 deserialize(serialize(old, [old]));
78 }
79 };
80 // The throw is not yet implemented, bug 919259.
81 //var copy = deserialize(serialize([ old, mutator ], [old]));
82 }
83 }
84 }
85
86 test();
87 reportCompare(0, 0, 'ok');

mercurial