Source code
Revision control
Copy as Markdown
Other Tools
load(libdir + "asserts.js");
const otherGlobal = newGlobal({newCompartment: true});
function nukeValue(wrapper, value) {
return {
valueOf() {
nukeCCW(wrapper);
return value;
}
};
};
function assertIsDeadWrapper(value) {
assertTypeErrorMessage(() => value.foo, "can't access dead object");
}
// Atomics.load
{
let sab = new otherGlobal.SharedArrayBuffer(4);
let ta = new otherGlobal.Int32Array(sab);
ta[0] = 1;
let val = Atomics.load(ta, nukeValue(ta, 0));
assertEq(val, 1);
assertIsDeadWrapper(ta);
}
{
let sab = new otherGlobal.SharedArrayBuffer(4);
let ta = new otherGlobal.Int32Array(sab);
ta[0] = 1;
let val = Atomics.load(ta, nukeValue(sab, 0));
assertEq(val, 1);
assertEq(ta[0], 1);
assertIsDeadWrapper(sab);
}
// Atomics.store
{
let sab = new otherGlobal.SharedArrayBuffer(4);
let ta = new otherGlobal.Int32Array(sab);
Atomics.store(ta, 0, nukeValue(ta, 1));
assertIsDeadWrapper(ta);
}
{
let sab = new otherGlobal.SharedArrayBuffer(4);
let ta = new otherGlobal.Int32Array(sab);
Atomics.store(ta, 0, nukeValue(sab, 1));
assertEq(ta[0], 1);
assertIsDeadWrapper(sab);
}
// Atomics.compareExchange
{
let sab = new otherGlobal.SharedArrayBuffer(4);
let ta = new otherGlobal.Int32Array(sab);
ta[0] = 1;
let val = Atomics.compareExchange(ta, 0, 1, nukeValue(ta, 2));
assertEq(val, 1);
assertIsDeadWrapper(ta);
}
{
let sab = new otherGlobal.SharedArrayBuffer(4);
let ta = new otherGlobal.Int32Array(sab);
ta[0] = 1;
let val = Atomics.compareExchange(ta, 0, 1, nukeValue(sab, 2));
assertEq(val, 1);
assertEq(ta[0], 2);
assertIsDeadWrapper(sab);
}
// Atomics.exchange
{
let sab = new otherGlobal.SharedArrayBuffer(4);
let ta = new otherGlobal.Int32Array(sab);
ta[0] = 1;
let val = Atomics.exchange(ta, 0, nukeValue(ta, 2));
assertEq(val, 1);
assertIsDeadWrapper(ta);
}
{
let sab = new otherGlobal.SharedArrayBuffer(4);
let ta = new otherGlobal.Int32Array(sab);
ta[0] = 1;
let val = Atomics.exchange(ta, 0, nukeValue(sab, 2));
assertEq(val, 1);
assertEq(ta[0], 2);
assertIsDeadWrapper(sab);
}
// Atomics.add
{
let sab = new otherGlobal.SharedArrayBuffer(4);
let ta = new otherGlobal.Int32Array(sab);
ta[0] = 1;
let val = Atomics.add(ta, 0, nukeValue(ta, 2));
assertEq(val, 1);
assertIsDeadWrapper(ta);
}
{
let sab = new otherGlobal.SharedArrayBuffer(4);
let ta = new otherGlobal.Int32Array(sab);
ta[0] = 1;
let val = Atomics.add(ta, 0, nukeValue(sab, 2));
assertEq(val, 1);
assertEq(ta[0], 3);
assertIsDeadWrapper(sab);
}
// Atomics.sub
{
let sab = new otherGlobal.SharedArrayBuffer(4);
let ta = new otherGlobal.Int32Array(sab);
ta[0] = 3;
let val = Atomics.sub(ta, 0, nukeValue(ta, 2));
assertEq(val, 3);
assertIsDeadWrapper(ta);
}
{
let sab = new otherGlobal.SharedArrayBuffer(4);
let ta = new otherGlobal.Int32Array(sab);
ta[0] = 3;
let val = Atomics.sub(ta, 0, nukeValue(sab, 2));
assertEq(val, 3);
assertEq(ta[0], 1);
assertIsDeadWrapper(sab);
}
// Atomics.and
{
let sab = new otherGlobal.SharedArrayBuffer(4);
let ta = new otherGlobal.Int32Array(sab);
ta[0] = 3;
let val = Atomics.and(ta, 0, nukeValue(ta, 1));
assertEq(val, 3);
assertIsDeadWrapper(ta);
}
{
let sab = new otherGlobal.SharedArrayBuffer(4);
let ta = new otherGlobal.Int32Array(sab);
ta[0] = 3;
let val = Atomics.and(ta, 0, nukeValue(sab, 1));
assertEq(val, 3);
assertEq(ta[0], 1);
assertIsDeadWrapper(sab);
}
// Atomics.or
{
let sab = new otherGlobal.SharedArrayBuffer(4);
let ta = new otherGlobal.Int32Array(sab);
ta[0] = 2;
let val = Atomics.or(ta, 0, nukeValue(ta, 1));
assertEq(val, 2);
assertIsDeadWrapper(ta);
}
{
let sab = new otherGlobal.SharedArrayBuffer(4);
let ta = new otherGlobal.Int32Array(sab);
ta[0] = 2;
let val = Atomics.or(ta, 0, nukeValue(sab, 1));
assertEq(val, 2);
assertEq(ta[0], 3);
assertIsDeadWrapper(sab);
}
// Atomics.xor
{
let sab = new otherGlobal.SharedArrayBuffer(4);
let ta = new otherGlobal.Int32Array(sab);
ta[0] = 3;
let val = Atomics.xor(ta, 0, nukeValue(ta, 1));
assertEq(val, 3);
assertIsDeadWrapper(ta);
}
{
let sab = new otherGlobal.SharedArrayBuffer(4);
let ta = new otherGlobal.Int32Array(sab);
ta[0] = 3;
let val = Atomics.xor(ta, 0, nukeValue(sab, 1));
assertEq(val, 3);
assertEq(ta[0], 2);
assertIsDeadWrapper(sab);
}