| Index: test/mjsunit/harmony/atomics.js
|
| diff --git a/test/mjsunit/harmony/atomics.js b/test/mjsunit/harmony/atomics.js
|
| index dbd372fa6d909297a78c469ab37cf97bc88fd592..4b9c9f6c663a3951c4dfaeefab6fb211a4ffc810 100644
|
| --- a/test/mjsunit/harmony/atomics.js
|
| +++ b/test/mjsunit/harmony/atomics.js
|
| @@ -77,12 +77,13 @@ function testAtomicOp(op, ia, index, expectedIndex, name) {
|
| (function TestBadIndex() {
|
| var sab = new SharedArrayBuffer(8);
|
| var si32a = new Int32Array(sab);
|
| + var si32a2 = new Int32Array(sab, 4);
|
|
|
| // Non-integer indexes are converted to an integer first, so they should all
|
| // operate on index 0.
|
| [undefined, null, false, 'hi', {}].forEach(function(i) {
|
| - var name = String(i);
|
|
|
| + var name = String(i);
|
| testAtomicOp(Atomics.compareExchange, si32a, i, 0, name);
|
| testAtomicOp(Atomics.load, si32a, i, 0, name);
|
| testAtomicOp(Atomics.store, si32a, i, 0, name);
|
| @@ -109,6 +110,20 @@ function testAtomicOp(op, ia, index, expectedIndex, name) {
|
| assertEquals(undefined, Atomics.exchange(si32a, i, 0), name);
|
| });
|
|
|
| + // Out-of-bounds indexes for offset-array
|
| + [-1, 1, 100].forEach(function(i) {
|
| + var name = String(i);
|
| + assertEquals(undefined, Atomics.compareExchange(si32a2, i, 0, 0), name);
|
| + assertEquals(undefined, Atomics.load(si32a2, i), name);
|
| + assertEquals(undefined, Atomics.store(si32a2, i, 0), name);
|
| + assertEquals(undefined, Atomics.add(si32a2, i, 0), name);
|
| + assertEquals(undefined, Atomics.sub(si32a2, i, 0), name);
|
| + assertEquals(undefined, Atomics.and(si32a2, i, 0), name);
|
| + assertEquals(undefined, Atomics.or(si32a2, i, 0), name);
|
| + assertEquals(undefined, Atomics.xor(si32a2, i, 0), name);
|
| + assertEquals(undefined, Atomics.exchange(si32a2, i, 0), name);
|
| + });
|
| +
|
| // Monkey-patch length and make sure these functions still return undefined.
|
| Object.defineProperty(si32a, 'length', {get: function() { return 1000; }});
|
| [2, 100].forEach(function(i) {
|
| @@ -128,39 +143,53 @@ function testAtomicOp(op, ia, index, expectedIndex, name) {
|
| (function TestGoodIndex() {
|
| var sab = new SharedArrayBuffer(64);
|
| var si32a = new Int32Array(sab);
|
| + var si32a2 = new Int32Array(sab, 32);
|
|
|
| var valueOf = {valueOf: function(){ return 3;}};
|
| var toString = {toString: function(){ return '3';}};
|
|
|
| [3, 3.5, '3', '3.5', valueOf, toString].forEach(function(i) {
|
| var name = String(i);
|
| -
|
| - testAtomicOp(Atomics.compareExchange, si32a, i, 3, name);
|
| - testAtomicOp(Atomics.load, si32a, i, 3, name);
|
| - testAtomicOp(Atomics.store, si32a, i, 3, name);
|
| - testAtomicOp(Atomics.add, si32a, i, 3, name);
|
| - testAtomicOp(Atomics.sub, si32a, i, 3, name);
|
| - testAtomicOp(Atomics.and, si32a, i, 3, name);
|
| - testAtomicOp(Atomics.or, si32a, i, 3, name);
|
| - testAtomicOp(Atomics.xor, si32a, i, 3, name);
|
| - testAtomicOp(Atomics.exchange, si32a, i, 3, name);
|
| + [si32a, si32a2].forEach(function(array) {
|
| + testAtomicOp(Atomics.compareExchange, array, i, 3, name);
|
| + testAtomicOp(Atomics.load, array, i, 3, name);
|
| + testAtomicOp(Atomics.store, array, i, 3, name);
|
| + testAtomicOp(Atomics.add, array, i, 3, name);
|
| + testAtomicOp(Atomics.sub, array, i, 3, name);
|
| + testAtomicOp(Atomics.and, array, i, 3, name);
|
| + testAtomicOp(Atomics.or, array, i, 3, name);
|
| + testAtomicOp(Atomics.xor, array, i, 3, name);
|
| + testAtomicOp(Atomics.exchange, array, i, 3, name);
|
| + })
|
| });
|
| })();
|
|
|
| +function clearArray(sab) {
|
| + var ui8 = new Uint8Array(sab);
|
| + for (var i = 0; i < sab.byteLength; ++i) {
|
| + ui8[i] = 0;
|
| + }
|
| +}
|
| +
|
| (function TestCompareExchange() {
|
| IntegerTypedArrayConstructors.forEach(function(t) {
|
| var sab = new SharedArrayBuffer(10 * t.constr.BYTES_PER_ELEMENT);
|
| var sta = new t.constr(sab);
|
| - var name = Object.prototype.toString.call(sta);
|
| - for (var i = 0; i < 10; ++i) {
|
| - // sta[i] == 0, CAS will store
|
| - assertEquals(0, Atomics.compareExchange(sta, i, 0, 50), name);
|
| - assertEquals(50, sta[i], name);
|
| -
|
| - // sta[i] == 50, CAS will not store
|
| - assertEquals(50, Atomics.compareExchange(sta, i, 0, 100), name);
|
| - assertEquals(50, sta[i], name);
|
| - }
|
| + var sta2 = new t.constr(sab, 5 * t.constr.BYTES_PER_ELEMENT);
|
| +
|
| + [sta, sta2].forEach(function(array) {
|
| + clearArray(array.buffer);
|
| + var name = Object.prototype.toString.call(array);
|
| + for (var i = 0; i < array.length; ++i) {
|
| + // array[i] == 0, CAS will store
|
| + assertEquals(0, Atomics.compareExchange(array, i, 0, 50), name);
|
| + assertEquals(50, array[i], name);
|
| +
|
| + // array[i] == 50, CAS will not store
|
| + assertEquals(50, Atomics.compareExchange(array, i, 0, 100), name);
|
| + assertEquals(50, array[i], name);
|
| + }
|
| + })
|
| });
|
| })();
|
|
|
| @@ -168,13 +197,18 @@ function testAtomicOp(op, ia, index, expectedIndex, name) {
|
| IntegerTypedArrayConstructors.forEach(function(t) {
|
| var sab = new SharedArrayBuffer(10 * t.constr.BYTES_PER_ELEMENT);
|
| var sta = new t.constr(sab);
|
| - var name = Object.prototype.toString.call(sta);
|
| - for (var i = 0; i < 10; ++i) {
|
| - sta[i] = 0;
|
| - assertEquals(0, Atomics.load(sta, i), name);
|
| - sta[i] = 50;
|
| - assertEquals(50, Atomics.load(sta, i), name);
|
| - }
|
| + var sta2 = new t.constr(sab, 5 * t.constr.BYTES_PER_ELEMENT);
|
| +
|
| + [sta, sta2].forEach(function(array) {
|
| + clearArray(array.buffer);
|
| + var name = Object.prototype.toString.call(array);
|
| + for (var i = 0; i < array.length; ++i) {
|
| + array[i] = 0;
|
| + assertEquals(0, Atomics.load(array, i), name);
|
| + array[i] = 50;
|
| + assertEquals(50, Atomics.load(array, i), name);
|
| + }
|
| + })
|
| });
|
| })();
|
|
|
| @@ -182,14 +216,19 @@ function testAtomicOp(op, ia, index, expectedIndex, name) {
|
| IntegerTypedArrayConstructors.forEach(function(t) {
|
| var sab = new SharedArrayBuffer(10 * t.constr.BYTES_PER_ELEMENT);
|
| var sta = new t.constr(sab);
|
| - var name = Object.prototype.toString.call(sta);
|
| - for (var i = 0; i < 10; ++i) {
|
| - assertEquals(50, Atomics.store(sta, i, 50), name);
|
| - assertEquals(50, sta[i], name);
|
| -
|
| - assertEquals(100, Atomics.store(sta, i, 100), name);
|
| - assertEquals(100, sta[i], name);
|
| - }
|
| + var sta2 = new t.constr(sab, 5 * t.constr.BYTES_PER_ELEMENT);
|
| +
|
| + [sta, sta2].forEach(function(array) {
|
| + clearArray(array.buffer);
|
| + var name = Object.prototype.toString.call(array);
|
| + for (var i = 0; i < array.length; ++i) {
|
| + assertEquals(50, Atomics.store(array, i, 50), name);
|
| + assertEquals(50, array[i], name);
|
| +
|
| + assertEquals(100, Atomics.store(array, i, 100), name);
|
| + assertEquals(100, array[i], name);
|
| + }
|
| + })
|
| });
|
| })();
|
|
|
| @@ -197,14 +236,19 @@ function testAtomicOp(op, ia, index, expectedIndex, name) {
|
| IntegerTypedArrayConstructors.forEach(function(t) {
|
| var sab = new SharedArrayBuffer(10 * t.constr.BYTES_PER_ELEMENT);
|
| var sta = new t.constr(sab);
|
| - var name = Object.prototype.toString.call(sta);
|
| - for (var i = 0; i < 10; ++i) {
|
| - assertEquals(0, Atomics.add(sta, i, 50), name);
|
| - assertEquals(50, sta[i], name);
|
| -
|
| - assertEquals(50, Atomics.add(sta, i, 70), name);
|
| - assertEquals(120, sta[i], name);
|
| - }
|
| + var sta2 = new t.constr(sab, 5 * t.constr.BYTES_PER_ELEMENT);
|
| +
|
| + [sta, sta2].forEach(function(array) {
|
| + clearArray(array.buffer);
|
| + var name = Object.prototype.toString.call(array);
|
| + for (var i = 0; i < array.length; ++i) {
|
| + assertEquals(0, Atomics.add(array, i, 50), name);
|
| + assertEquals(50, array[i], name);
|
| +
|
| + assertEquals(50, Atomics.add(array, i, 70), name);
|
| + assertEquals(120, array[i], name);
|
| + }
|
| + })
|
| });
|
| })();
|
|
|
| @@ -212,15 +256,20 @@ function testAtomicOp(op, ia, index, expectedIndex, name) {
|
| IntegerTypedArrayConstructors.forEach(function(t) {
|
| var sab = new SharedArrayBuffer(10 * t.constr.BYTES_PER_ELEMENT);
|
| var sta = new t.constr(sab);
|
| - var name = Object.prototype.toString.call(sta);
|
| - for (var i = 0; i < 10; ++i) {
|
| - sta[i] = 120;
|
| - assertEquals(120, Atomics.sub(sta, i, 50), name);
|
| - assertEquals(70, sta[i], name);
|
| -
|
| - assertEquals(70, Atomics.sub(sta, i, 70), name);
|
| - assertEquals(0, sta[i], name);
|
| - }
|
| + var sta2 = new t.constr(sab, 5 * t.constr.BYTES_PER_ELEMENT);
|
| +
|
| + [sta, sta2].forEach(function(array) {
|
| + clearArray(array.buffer);
|
| + var name = Object.prototype.toString.call(array);
|
| + for (var i = 0; i < array.length; ++i) {
|
| + array[i] = 120;
|
| + assertEquals(120, Atomics.sub(array, i, 50), name);
|
| + assertEquals(70, array[i], name);
|
| +
|
| + assertEquals(70, Atomics.sub(array, i, 70), name);
|
| + assertEquals(0, array[i], name);
|
| + }
|
| + })
|
| });
|
| })();
|
|
|
| @@ -228,15 +277,20 @@ function testAtomicOp(op, ia, index, expectedIndex, name) {
|
| IntegerTypedArrayConstructors.forEach(function(t) {
|
| var sab = new SharedArrayBuffer(10 * t.constr.BYTES_PER_ELEMENT);
|
| var sta = new t.constr(sab);
|
| - var name = Object.prototype.toString.call(sta);
|
| - for (var i = 0; i < 10; ++i) {
|
| - sta[i] = 0x3f;
|
| - assertEquals(0x3f, Atomics.and(sta, i, 0x30), name);
|
| - assertEquals(0x30, sta[i], name);
|
| -
|
| - assertEquals(0x30, Atomics.and(sta, i, 0x20), name);
|
| - assertEquals(0x20, sta[i], name);
|
| - }
|
| + var sta2 = new t.constr(sab, 5 * t.constr.BYTES_PER_ELEMENT);
|
| +
|
| + [sta, sta2].forEach(function(array) {
|
| + clearArray(array.buffer);
|
| + var name = Object.prototype.toString.call(sta);
|
| + for (var i = 0; i < array.length; ++i) {
|
| + array[i] = 0x3f;
|
| + assertEquals(0x3f, Atomics.and(array, i, 0x30), name);
|
| + assertEquals(0x30, array[i], name);
|
| +
|
| + assertEquals(0x30, Atomics.and(array, i, 0x20), name);
|
| + assertEquals(0x20, array[i], name);
|
| + }
|
| + })
|
| });
|
| })();
|
|
|
| @@ -244,15 +298,20 @@ function testAtomicOp(op, ia, index, expectedIndex, name) {
|
| IntegerTypedArrayConstructors.forEach(function(t) {
|
| var sab = new SharedArrayBuffer(10 * t.constr.BYTES_PER_ELEMENT);
|
| var sta = new t.constr(sab);
|
| - var name = Object.prototype.toString.call(sta);
|
| - for (var i = 0; i < 10; ++i) {
|
| - sta[i] = 0x30;
|
| - assertEquals(0x30, Atomics.or(sta, i, 0x1c), name);
|
| - assertEquals(0x3c, sta[i], name);
|
| -
|
| - assertEquals(0x3c, Atomics.or(sta, i, 0x09), name);
|
| - assertEquals(0x3d, sta[i], name);
|
| - }
|
| + var sta2 = new t.constr(sab, 5 * t.constr.BYTES_PER_ELEMENT);
|
| +
|
| + [sta, sta2].forEach(function(array) {
|
| + clearArray(array.buffer);
|
| + var name = Object.prototype.toString.call(array);
|
| + for (var i = 0; i < array.length; ++i) {
|
| + array[i] = 0x30;
|
| + assertEquals(0x30, Atomics.or(array, i, 0x1c), name);
|
| + assertEquals(0x3c, array[i], name);
|
| +
|
| + assertEquals(0x3c, Atomics.or(array, i, 0x09), name);
|
| + assertEquals(0x3d, array[i], name);
|
| + }
|
| + })
|
| });
|
| })();
|
|
|
| @@ -260,15 +319,20 @@ function testAtomicOp(op, ia, index, expectedIndex, name) {
|
| IntegerTypedArrayConstructors.forEach(function(t) {
|
| var sab = new SharedArrayBuffer(10 * t.constr.BYTES_PER_ELEMENT);
|
| var sta = new t.constr(sab);
|
| - var name = Object.prototype.toString.call(sta);
|
| - for (var i = 0; i < 10; ++i) {
|
| - sta[i] = 0x30;
|
| - assertEquals(0x30, Atomics.xor(sta, i, 0x1c), name);
|
| - assertEquals(0x2c, sta[i], name);
|
| -
|
| - assertEquals(0x2c, Atomics.xor(sta, i, 0x09), name);
|
| - assertEquals(0x25, sta[i], name);
|
| - }
|
| + var sta2 = new t.constr(sab, 5 * t.constr.BYTES_PER_ELEMENT);
|
| +
|
| + [sta, sta2].forEach(function(array) {
|
| + clearArray(array.buffer);
|
| + var name = Object.prototype.toString.call(array);
|
| + for (var i = 0; i < array.length; ++i) {
|
| + array[i] = 0x30;
|
| + assertEquals(0x30, Atomics.xor(array, i, 0x1c), name);
|
| + assertEquals(0x2c, array[i], name);
|
| +
|
| + assertEquals(0x2c, Atomics.xor(array, i, 0x09), name);
|
| + assertEquals(0x25, array[i], name);
|
| + }
|
| + })
|
| });
|
| })();
|
|
|
| @@ -276,15 +340,20 @@ function testAtomicOp(op, ia, index, expectedIndex, name) {
|
| IntegerTypedArrayConstructors.forEach(function(t) {
|
| var sab = new SharedArrayBuffer(10 * t.constr.BYTES_PER_ELEMENT);
|
| var sta = new t.constr(sab);
|
| - var name = Object.prototype.toString.call(sta);
|
| - for (var i = 0; i < 10; ++i) {
|
| - sta[i] = 0x30;
|
| - assertEquals(0x30, Atomics.exchange(sta, i, 0x1c), name);
|
| - assertEquals(0x1c, sta[i], name);
|
| -
|
| - assertEquals(0x1c, Atomics.exchange(sta, i, 0x09), name);
|
| - assertEquals(0x09, sta[i], name);
|
| - }
|
| + var sta2 = new t.constr(sab, 5 * t.constr.BYTES_PER_ELEMENT);
|
| +
|
| + [sta, sta2].forEach(function(array) {
|
| + clearArray(array.buffer);
|
| + var name = Object.prototype.toString.call(array);
|
| + for (var i = 0; i < array.length; ++i) {
|
| + array[i] = 0x30;
|
| + assertEquals(0x30, Atomics.exchange(array, i, 0x1c), name);
|
| + assertEquals(0x1c, array[i], name);
|
| +
|
| + assertEquals(0x1c, Atomics.exchange(array, i, 0x09), name);
|
| + assertEquals(0x09, array[i], name);
|
| + }
|
| + })
|
| });
|
| })();
|
|
|
|
|