diff options
Diffstat (limited to 'deps/v8/test/mjsunit/harmony/atomics.js')
-rw-r--r-- | deps/v8/test/mjsunit/harmony/atomics.js | 251 |
1 files changed, 142 insertions, 109 deletions
diff --git a/deps/v8/test/mjsunit/harmony/atomics.js b/deps/v8/test/mjsunit/harmony/atomics.js index ef90076103..5caeb7e8e5 100644 --- a/deps/v8/test/mjsunit/harmony/atomics.js +++ b/deps/v8/test/mjsunit/harmony/atomics.js @@ -5,27 +5,47 @@ // Flags: --harmony-sharedarraybuffer // -function toRangeWrapped(value) { - var range = this.max - this.min + 1; - while (value < this.min) { - value += range; - } - while (value > this.max) { - value -= range; +function toRangeWrapper(is_big) { + return function _toRangeWrapped(raw_value) { + var raw_range = this.max - this.min + (is_big ? 1n : 1); + let range = is_big ? BigInt(raw_range) : raw_range; + let value = is_big ? BigInt(raw_value) : raw_value; + while (value < this.min) { + value += range; + } + while (value > this.max) { + value -= range; + } + return value; } - return value; } function makeConstructorObject(constr, min, max, toRange) { var o = {constr: constr, min: min, max: max}; - o.toRange = toRangeWrapped.bind(o); + let is_big = constr.name.startsWith('Big') + o.toRange = toRangeWrapper(is_big).bind(o); return o; } +function IsBig(t) { + return t.constructor.name.startsWith('Big'); +} + +function MaybeIntToBigInt(arr, i) { + if (IsBig(arr)) { + return BigInt(i); + } else { + return i; + } +} + var IntegerTypedArrayConstructors = [ makeConstructorObject(Int8Array, -128, 127), makeConstructorObject(Int16Array, -32768, 32767), makeConstructorObject(Int32Array, -0x80000000, 0x7fffffff), + makeConstructorObject(BigInt64Array, -0x8000_0000_0000_0000n, + 0x7fff_ffff_ffff_ffffn), + makeConstructorObject(BigUint64Array, 0n, 0xffff_ffff_ffff_ffffn), makeConstructorObject(Uint8Array, 0, 255), makeConstructorObject(Uint16Array, 0, 65535), makeConstructorObject(Uint32Array, 0, 0xffffffff), @@ -189,16 +209,19 @@ function clearArray(sab) { var sta2 = new t.constr(sab, 5 * t.constr.BYTES_PER_ELEMENT); [sta, sta2].forEach(function(array) { + let _i = (i) => { return MaybeIntToBigInt(array, i); } 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); + assertEquals(_i(0), Atomics.compareExchange(array, i, _i(0), _i(50)), + name); + assertEquals(_i(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); + assertEquals(_i(50), Atomics.compareExchange(array, i, _i(0), _i(100)), + name); + assertEquals(_i(50), array[i], name); } }) }); @@ -211,13 +234,14 @@ function clearArray(sab) { var sta2 = new t.constr(sab, 5 * t.constr.BYTES_PER_ELEMENT); [sta, sta2].forEach(function(array) { + let _i = (i) => { return MaybeIntToBigInt(array, i); } 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); + array[i] = _i(0); + assertEquals(_i(0), Atomics.load(array, i), name); + array[i] = _i(50); + assertEquals(_i(50), Atomics.load(array, i), name); } }) }); @@ -248,14 +272,15 @@ function clearArray(sab) { var sta2 = new t.constr(sab, 5 * t.constr.BYTES_PER_ELEMENT); [sta, sta2].forEach(function(array) { + let _i = (i) => { return MaybeIntToBigInt(array, i); } 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(_i(50), Atomics.store(array, i, _i(50)), name); + assertEquals(_i(50), array[i], name); - assertEquals(100, Atomics.store(array, i, 100), name); - assertEquals(100, array[i], name); + assertEquals(_i(100), Atomics.store(array, i, _i(100)), name); + assertEquals(_i(100), array[i], name); } }) }); @@ -268,14 +293,15 @@ function clearArray(sab) { var sta2 = new t.constr(sab, 5 * t.constr.BYTES_PER_ELEMENT); [sta, sta2].forEach(function(array) { + let _i = (i) => { return MaybeIntToBigInt(array, i); } 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(_i(0), Atomics.add(array, i, _i(50)), name); + assertEquals(_i(50), array[i], name); - assertEquals(50, Atomics.add(array, i, 70), name); - assertEquals(120, array[i], name); + assertEquals(_i(50), Atomics.add(array, i, _i(70)), name); + assertEquals(_i(120), array[i], name); } }) }); @@ -288,15 +314,16 @@ function clearArray(sab) { var sta2 = new t.constr(sab, 5 * t.constr.BYTES_PER_ELEMENT); [sta, sta2].forEach(function(array) { + let _i = (i) => { return MaybeIntToBigInt(array, i); } 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); + array[i] = _i(120); + assertEquals(_i(120), Atomics.sub(array, i, _i(50)), name); + assertEquals(_i(70), array[i], name); - assertEquals(70, Atomics.sub(array, i, 70), name); - assertEquals(0, array[i], name); + assertEquals(_i(70), Atomics.sub(array, i, _i(70)), name); + assertEquals(_i(0), array[i], name); } }) }); @@ -309,15 +336,16 @@ function clearArray(sab) { var sta2 = new t.constr(sab, 5 * t.constr.BYTES_PER_ELEMENT); [sta, sta2].forEach(function(array) { + let _i = (i) => { return MaybeIntToBigInt(array, i); } 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); + array[i] = _i(0x3f); + assertEquals(_i(0x3f), Atomics.and(array, i, _i(0x30)), name); + assertEquals(_i(0x30), array[i], name); - assertEquals(0x30, Atomics.and(array, i, 0x20), name); - assertEquals(0x20, array[i], name); + assertEquals(_i(0x30), Atomics.and(array, i, _i(0x20)), name); + assertEquals(_i(0x20), array[i], name); } }) }); @@ -330,15 +358,16 @@ function clearArray(sab) { var sta2 = new t.constr(sab, 5 * t.constr.BYTES_PER_ELEMENT); [sta, sta2].forEach(function(array) { + let _i = (i) => { return MaybeIntToBigInt(array, i); } 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); + array[i] = _i(0x30); + assertEquals(_i(0x30), Atomics.or(array, i, _i(0x1c)), name); + assertEquals(_i(0x3c), array[i], name); - assertEquals(0x3c, Atomics.or(array, i, 0x09), name); - assertEquals(0x3d, array[i], name); + assertEquals(_i(0x3c), Atomics.or(array, i, _i(0x09)), name); + assertEquals(_i(0x3d), array[i], name); } }) }); @@ -351,15 +380,16 @@ function clearArray(sab) { var sta2 = new t.constr(sab, 5 * t.constr.BYTES_PER_ELEMENT); [sta, sta2].forEach(function(array) { + let _i = (i) => { return MaybeIntToBigInt(array, i); } 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); + array[i] = _i(0x30); + assertEquals(_i(0x30), Atomics.xor(array, i, _i(0x1c)), name); + assertEquals(_i(0x2c), array[i], name); - assertEquals(0x2c, Atomics.xor(array, i, 0x09), name); - assertEquals(0x25, array[i], name); + assertEquals(_i(0x2c), Atomics.xor(array, i, _i(0x09)), name); + assertEquals(_i(0x25), array[i], name); } }) }); @@ -372,15 +402,16 @@ function clearArray(sab) { var sta2 = new t.constr(sab, 5 * t.constr.BYTES_PER_ELEMENT); [sta, sta2].forEach(function(array) { + let _i = (i) => { return MaybeIntToBigInt(array, i); } 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); + array[i] = _i(0x30); + assertEquals(_i(0x30), Atomics.exchange(array, i, _i(0x1c)), name); + assertEquals(_i(0x1c), array[i], name); - assertEquals(0x1c, Atomics.exchange(array, i, 0x09), name); - assertEquals(0x09, array[i], name); + assertEquals(_i(0x1c), Atomics.exchange(array, i, _i(0x09)), name); + assertEquals(_i(0x09), array[i], name); } }) }); @@ -397,72 +428,73 @@ function clearArray(sab) { }); // For all platforms we support, 1, 2 and 4 bytes should be lock-free. - assertEquals(true, Atomics.isLockFree(1)); - assertEquals(true, Atomics.isLockFree(2)); - assertEquals(true, Atomics.isLockFree(4)); - - // Sizes that aren't equal to a typedarray BYTES_PER_ELEMENT always return - // false. - var validSizes = {}; - IntegerTypedArrayConstructors.forEach(function(t) { - validSizes[t.constr.BYTES_PER_ELEMENT] = true; - }); - - for (var i = 0; i < 1000; ++i) { - if (!validSizes[i]) { - assertEquals(false, Atomics.isLockFree(i)); - } - } + assertTrue(Atomics.isLockFree(1)); + assertTrue(Atomics.isLockFree(2)); + assertTrue(Atomics.isLockFree(4)); + + assertFalse(Atomics.isLockFree(0)); + assertFalse(Atomics.isLockFree(3)); + assertFalse(Atomics.isLockFree(5)); + assertFalse(Atomics.isLockFree(6)); + assertFalse(Atomics.isLockFree(7)); + // isLockFree(8) is platform dependent. + for (var i = 9; i < 100; ++i) assertFalse(Atomics.isLockFree(i)); })(); (function TestToNumber() { IntegerTypedArrayConstructors.forEach(function(t) { var sab = new SharedArrayBuffer(1 * t.constr.BYTES_PER_ELEMENT); var sta = new t.constr(sab); + let _i = (i) => { return MaybeIntToBigInt(sta, i); } - var valueOf = {valueOf: function(){ return 3;}}; + var valueOf = {valueOf: function(){ return _i(3);}}; var toString = {toString: function(){ return '3';}}; [false, true, undefined, valueOf, toString].forEach(function(v) { + if (v === undefined && IsBig(sta)) { + // undefined does not convert to a BigInt. + return; + } + let _v = () => { return IsBig(sta) ? _i(v) : (v|0); } var name = Object.prototype.toString.call(sta) + ' - ' + v; // CompareExchange - sta[0] = 50; - assertEquals(50, Atomics.compareExchange(sta, 0, v, v), name); + sta[0] = _i(50); + assertEquals(_i(50), Atomics.compareExchange(sta, 0, v, v), name); // Store - assertEquals(v|0, Atomics.store(sta, 0, v), name); - assertEquals(v|0, sta[0], name); + assertEquals(_v(), Atomics.store(sta, 0, v), name); + assertEquals(_v(), sta[0], name); // Add - sta[0] = 120; - assertEquals(120, Atomics.add(sta, 0, v), name); - assertEquals(120 + (v|0), sta[0], name); + sta[0] = _i(120); + assertEquals(_i(120), Atomics.add(sta, 0, v), name); + assertEquals(_i(120) + _v(), sta[0], name); // Sub - sta[0] = 70; - assertEquals(70, Atomics.sub(sta, 0, v), name); - assertEquals(70 - (v|0), sta[0]); + sta[0] = _i(70); + assertEquals(_i(70), Atomics.sub(sta, 0, v), name); + assertEquals(_i(70) - _v(), sta[0]); // And - sta[0] = 0x20; - assertEquals(0x20, Atomics.and(sta, 0, v), name); - assertEquals(0x20 & (v|0), sta[0]); + sta[0] = _i(0x20); + assertEquals(_i(0x20), Atomics.and(sta, 0, v), name); + assertEquals(_i(0x20) & _v(), sta[0]); // Or - sta[0] = 0x3d; - assertEquals(0x3d, Atomics.or(sta, 0, v), name); - assertEquals(0x3d | (v|0), sta[0]); + sta[0] = _i(0x3d); + assertEquals(_i(0x3d), Atomics.or(sta, 0, v), name); + assertEquals(_i(0x3d) | _v(), sta[0]); // Xor - sta[0] = 0x25; - assertEquals(0x25, Atomics.xor(sta, 0, v), name); - assertEquals(0x25 ^ (v|0), sta[0]); + sta[0] = _i(0x25); + assertEquals(_i(0x25), Atomics.xor(sta, 0, v), name); + assertEquals(_i(0x25) ^ _v(), sta[0]); // Exchange - sta[0] = 0x09; - assertEquals(0x09, Atomics.exchange(sta, 0, v), name); - assertEquals(v|0, sta[0]); + sta[0] = _i(0x09); + assertEquals(_i(0x09), Atomics.exchange(sta, 0, v), name); + assertEquals(_v(), sta[0]); }); }); })(); @@ -472,7 +504,8 @@ function clearArray(sab) { var sab = new SharedArrayBuffer(10 * t.constr.BYTES_PER_ELEMENT); var sta = new t.constr(sab); var name = Object.prototype.toString.call(sta); - var range = t.max - t.min + 1; + let _i = (i) => { return MaybeIntToBigInt(sta, i); } + var range = t.max - t.min + _i(1); var offset; var operand; var val, newVal; @@ -480,52 +513,52 @@ function clearArray(sab) { for (offset = -range; offset <= range; offset += range) { // CompareExchange - sta[0] = val = 0; - newVal = val + offset + 1; + sta[0] = val = _i(0); + newVal = val + offset + _i(1); newValWrapped = t.toRange(newVal); assertEquals(val, Atomics.compareExchange(sta, 0, val, newVal), name); assertEquals(newValWrapped, sta[0], name); sta[0] = val = t.min; - newVal = val + offset - 1; + newVal = val + offset - _i(1); newValWrapped = t.toRange(newVal); assertEquals(val, Atomics.compareExchange(sta, 0, val, newVal), name); assertEquals(newValWrapped, sta[0], name); // Store - sta[0] = 0; - val = t.max + offset + 1; + sta[0] = _i(0); + val = t.max + offset + _i(1); valWrapped = t.toRange(val); assertEquals(val, Atomics.store(sta, 0, val), name); assertEquals(valWrapped, sta[0], name); - sta[0] = val = t.min + offset - 1; + sta[0] = val = t.min + offset - _i(1); valWrapped = t.toRange(val); assertEquals(val, Atomics.store(sta, 0, val), name); assertEquals(valWrapped, sta[0], name); // Add sta[0] = val = t.max; - operand = offset + 1; + operand = offset + _i(1); valWrapped = t.toRange(val + operand); assertEquals(val, Atomics.add(sta, 0, operand), name); assertEquals(valWrapped, sta[0], name); sta[0] = val = t.min; - operand = offset - 1; + operand = offset - _i(1); valWrapped = t.toRange(val + operand); assertEquals(val, Atomics.add(sta, 0, operand), name); assertEquals(valWrapped, sta[0], name); // Sub sta[0] = val = t.max; - operand = offset - 1; + operand = offset - _i(1); valWrapped = t.toRange(val - operand); assertEquals(val, Atomics.sub(sta, 0, operand), name); assertEquals(valWrapped, sta[0], name); sta[0] = val = t.min; - operand = offset + 1; + operand = offset + _i(1); valWrapped = t.toRange(val - operand); assertEquals(val, Atomics.sub(sta, 0, operand), name); assertEquals(valWrapped, sta[0], name); @@ -535,29 +568,29 @@ function clearArray(sab) { // to memory. // And - sta[0] = val = 0xf; - operand = 0x3 + offset; + sta[0] = val = _i(0xf); + operand = _i(0x3) + offset; valWrapped = t.toRange(val & operand); assertEquals(val, Atomics.and(sta, 0, operand), name); assertEquals(valWrapped, sta[0], name); // Or - sta[0] = val = 0x12; - operand = 0x22 + offset; + sta[0] = val = _i(0x12); + operand = _i(0x22) + offset; valWrapped = t.toRange(val | operand); assertEquals(val, Atomics.or(sta, 0, operand), name); assertEquals(valWrapped, sta[0], name); // Xor - sta[0] = val = 0x12; - operand = 0x22 + offset; + sta[0] = val = _i(0x12); + operand = _i(0x22) + offset; valWrapped = t.toRange(val ^ operand); assertEquals(val, Atomics.xor(sta, 0, operand), name); assertEquals(valWrapped, sta[0], name); // Exchange - sta[0] = val = 0x12; - operand = 0x22 + offset; + sta[0] = val = _i(0x12); + operand = _i(0x22) + offset; valWrapped = t.toRange(operand); assertEquals(val, Atomics.exchange(sta, 0, operand), name); assertEquals(valWrapped, sta[0], name); @@ -574,7 +607,7 @@ function clearArray(sab) { // The index should be checked before calling ToInteger on the value, so // valueof_has_been_called should not be modified. - sta[0] = 0; + sta[0] = MaybeIntToBigInt(sta, 0); assertThrows(function() { op(sta, index, value, value); }, RangeError); assertEquals(0, valueof_has_been_called); }; |