|
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'); |