Source code
Revision control
Copy as Markdown
Other Tools
// |reftest| skip-if(!xulRuntime.shell)
// Any copyright is dedicated to the Public Domain.
// This file is a copy of clone-typed-array.js from before v2 structured clone
// was implemented. If you run this test under a v1-writing engine with the
// environment variable JS_RECORD_RESULTS set, then it will output a log of
// structured clone buffers resulting from running this test. You can then use
// that log as input to another run of this same test on a newer engine, to
// verify that older-format structured clone data can be deserialized properly.
var old_serialize = serialize;
var captured = [];
if (os.getenv("JS_RECORD_RESULTS") !== undefined) {
serialize = function(o) {
var data;
try {
data = old_serialize(o);
captured.push(data);
return data;
} catch(e) {
captured.push(e);
throw(e);
}
};
} else {
loadRelativeToScript("clone-v1-typed-array-data.dat");
serialize = function(d) {
var data = captured.shift();
if (data instanceof Error)
throw(data);
else
return data;
};
}
function assertArraysEqual(a, b) {
assertEq(a.constructor, b.constructor);
assertEq(a.length, b.length);
for (var i = 0; i < a.length; i++)
assertEq(a[i], b[i]);
}
function check(b) {
var a = deserialize(serialize(b));
assertArraysEqual(a, b);
}
function checkPrototype(ctor) {
var threw = false;
try {
serialize(ctor.prototype);
throw new Error("serializing " + ctor.name + ".prototype should throw a TypeError");
} catch (exc) {
if (!(exc instanceof TypeError))
throw exc;
}
}
function test() {
// Test cloning ArrayBuffer objects.
check(new ArrayBuffer(0));
check(new ArrayBuffer(7));
checkPrototype(ArrayBuffer);
// Test cloning typed array objects.
var ctors = [
Int8Array,
Uint8Array,
Int16Array,
Uint16Array,
Int32Array,
Uint32Array,
Float32Array,
Float64Array,
Uint8ClampedArray];
var b;
for (var i = 0; i < ctors.length; i++) {
var ctor = ctors[i];
// check empty array
b = new ctor(0);
check(b);
// check array with some elements
b = new ctor(100);
var v = 1;
for (var j = 0; j < 100; j++) {
b[j] = v;
v *= 7;
}
b[99] = NaN; // check serializing NaNs too
check(b);
// try the prototype
checkPrototype(ctor);
}
// Cloning should separately copy two TypedArrays backed by the same
// ArrayBuffer. This also tests cloning TypedArrays where the arr->data
// pointer is not 8-byte-aligned.
var base = new Int8Array([0, 1, 2, 3]);
b = [new Int8Array(base.buffer, 0, 3), new Int8Array(base.buffer, 1, 3)];
var a = deserialize(serialize(b));
base[1] = -1;
a[0][2] = -2;
assertArraysEqual(b[0], new Int8Array([0, -1, 2])); // shared with base
assertArraysEqual(b[1], new Int8Array([-1, 2, 3])); // shared with base
assertArraysEqual(a[0], new Int8Array([0, 1, -2])); // not shared with base
assertArraysEqual(a[1], new Int8Array([1, 2, 3])); // not shared with base or a[0]
}
test();
reportCompare(0, 0, 'ok');
if (os.getenv("JS_RECORD_RESULTS") !== undefined) {
print("var captured = [];");
for (var i in captured) {
var s = "captured[" + i + "] = ";
if (captured[i] instanceof Error) {
print(s + captured[i].toString() + ";");
} else {
data = captured[i].clonebuffer.split('').map(c => c.charCodeAt(0));
print(s + "serialize(0); captured[" + i + "].clonebuffer = String.fromCharCode(" + data.join(", ") + ");");
}
}
}