mirror of https://github.com/tc39/test262.git
Atomics: expected return values for all atomic operations
This commit is contained in:
parent
a3b05ee839
commit
7c30ad5c4f
|
@ -0,0 +1,35 @@
|
|||
// Copyright (C) 2018 Rick Waldron. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
|
||||
/*---
|
||||
esid: sec-atomics.add
|
||||
description: >
|
||||
Atomics.add returns the value that existed at the
|
||||
index prior to the operation.
|
||||
info: |
|
||||
Atomics.add( typedArray, index, value )
|
||||
|
||||
1. Return ? AtomicReadModifyWrite(typedArray, index, value, add).
|
||||
|
||||
AtomicReadModifyWrite( typedArray, index, value, op )
|
||||
|
||||
...
|
||||
9. Return GetModifySetValueInBuffer(buffer, indexedPosition,
|
||||
elementType, v, op).
|
||||
|
||||
|
||||
GetModifySetValueInBuffer( arrayBuffer,
|
||||
byteIndex, type, value, op [ , isLittleEndian ] )
|
||||
|
||||
...
|
||||
16. Return RawBytesToNumber(type, rawBytesRead, isLittleEndian).
|
||||
|
||||
features: [Atomics, SharedArrayBuffer, TypedArray]
|
||||
---*/
|
||||
|
||||
var buffer = new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT);
|
||||
var i32a = new Int32Array(buffer);
|
||||
var value = 0b00000001000000001000000010000001;
|
||||
|
||||
assert.sameValue(Atomics.add(i32a, 0, value), 0);
|
||||
assert.sameValue(i32a[0], value);
|
|
@ -0,0 +1,38 @@
|
|||
// Copyright (C) 2018 Rick Waldron. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
|
||||
/*---
|
||||
esid: sec-atomics.and
|
||||
description: >
|
||||
Atomics.and returns the value that existed at the
|
||||
index prior to the operation.
|
||||
info: |
|
||||
Atomics.and( typedArray, index, value )
|
||||
|
||||
1. Return ? AtomicReadModifyWrite(typedArray, index, value, and).
|
||||
|
||||
AtomicReadModifyWrite( typedArray, index, value, op )
|
||||
|
||||
...
|
||||
9. Return GetModifySetValueInBuffer(buffer, indexedPosition,
|
||||
elementType, v, op).
|
||||
|
||||
|
||||
GetModifySetValueInBuffer( arrayBuffer,
|
||||
byteIndex, type, value, op [ , isLittleEndian ] )
|
||||
|
||||
...
|
||||
16. Return RawBytesToNumber(type, rawBytesRead, isLittleEndian).
|
||||
|
||||
features: [Atomics, SharedArrayBuffer, TypedArray]
|
||||
---*/
|
||||
|
||||
var buffer = new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT);
|
||||
var i32a = new Int32Array(buffer);
|
||||
var value = 0b00000001000000001000000010000001;
|
||||
var other = 0b00000001111111111000000011111111;
|
||||
|
||||
i32a[0] = value;
|
||||
|
||||
assert.sameValue(Atomics.and(i32a, 0, value), value);
|
||||
assert.sameValue(i32a[0], value & other);
|
|
@ -0,0 +1,36 @@
|
|||
// Copyright (C) 2018 Rick Waldron. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
|
||||
/*---
|
||||
esid: sec-atomics.compareExchange
|
||||
description: >
|
||||
Atomics.compareExchange returns the value that existed at the
|
||||
index prior to the operation.
|
||||
info: |
|
||||
Atomics.compareExchange( typedArray, index, expectedValue, replacementValue )
|
||||
|
||||
...
|
||||
12. Let compareExchange denote a semantic function of two List of
|
||||
byte values arguments that returns the second argument if the
|
||||
first argument is element-wise equal to expectedBytes.
|
||||
13. Return GetModifySetValueInBuffer(buffer, indexedPosition,
|
||||
elementType, replacement, compareExchange).
|
||||
|
||||
|
||||
GetModifySetValueInBuffer( arrayBuffer,
|
||||
byteIndex, type, value, op [ , isLittleEndian ] )
|
||||
|
||||
...
|
||||
16. Return RawBytesToNumber(type, rawBytesRead, isLittleEndian).
|
||||
|
||||
features: [Atomics, SharedArrayBuffer, TypedArray]
|
||||
---*/
|
||||
|
||||
var buffer = new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT);
|
||||
var i32a = new Int32Array(buffer);
|
||||
var value = 0b00000001000000001000000010000001;
|
||||
|
||||
i32a[0] = value;
|
||||
|
||||
assert.sameValue(Atomics.compareExchange(i32a, 0, value, 0), value);
|
||||
assert.sameValue(i32a[0], 0);
|
|
@ -0,0 +1,35 @@
|
|||
// Copyright (C) 2018 Rick Waldron. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
|
||||
/*---
|
||||
esid: sec-atomics.exchange
|
||||
description: >
|
||||
Atomics.and returns the value that existed at the
|
||||
index prior to the operation.
|
||||
info: |
|
||||
Atomics.exchange( typedArray, index, value )
|
||||
|
||||
1. Return ? AtomicReadModifyWrite(typedArray, index, value, second).
|
||||
|
||||
AtomicReadModifyWrite( typedArray, index, value, op )
|
||||
|
||||
...
|
||||
9. Return GetModifySetValueInBuffer(buffer, indexedPosition,
|
||||
elementType, v, op).
|
||||
|
||||
|
||||
GetModifySetValueInBuffer( arrayBuffer,
|
||||
byteIndex, type, value, op [ , isLittleEndian ] )
|
||||
|
||||
...
|
||||
16. Return RawBytesToNumber(type, rawBytesRead, isLittleEndian).
|
||||
|
||||
features: [Atomics, SharedArrayBuffer, TypedArray]
|
||||
---*/
|
||||
|
||||
var buffer = new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT);
|
||||
var i32a = new Int32Array(buffer);
|
||||
var value = 0b00000001000000001000000010000001;
|
||||
|
||||
assert.sameValue(Atomics.exchange(i32a, 0, value), 0);
|
||||
assert.sameValue(i32a[0], value);
|
|
@ -0,0 +1,29 @@
|
|||
// Copyright (C) 2018 Rick Waldron. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
|
||||
/*---
|
||||
esid: sec-atomics.isLockFree
|
||||
description: >
|
||||
Atomics.isLockFree returns a boolean that indicates whether
|
||||
operations on datum of size will be performed without the agent
|
||||
acquiring a lock outside of size bytes.
|
||||
info: |
|
||||
Atomics.isLockFree( size )
|
||||
|
||||
1. Let n be ? ToInteger(size).
|
||||
2. Let AR be the Agent Record of the surrounding agent.
|
||||
3. If n equals 1, return AR.[[IsLockFree1]].
|
||||
4. If n equals 2, return AR.[[IsLockFree2]].
|
||||
5. If n equals 4, return true.
|
||||
6. If n equals 8, return AR.[[IsLockFree8]].
|
||||
7. Return false.
|
||||
|
||||
features: [Atomics, SharedArrayBuffer, TypedArray]
|
||||
includes: [testBigIntTypedArray.js]
|
||||
---*/
|
||||
|
||||
testWithBigIntTypedArrayConstructors(function(TA) {
|
||||
assert.sameValue(Atomics.isLockFree(TA.BYTES_PER_ELEMENT), true);
|
||||
});
|
||||
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
// Copyright (C) 2018 Rick Waldron. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
|
||||
/*---
|
||||
esid: sec-atomics.isLockFree
|
||||
description: >
|
||||
Atomics.isLockFree returns a boolean that indicates whether
|
||||
operations on datum of size will be performed without the agent
|
||||
acquiring a lock outside of size bytes.
|
||||
info: |
|
||||
Atomics.isLockFree( size )
|
||||
|
||||
1. Let n be ? ToInteger(size).
|
||||
2. Let AR be the Agent Record of the surrounding agent.
|
||||
3. If n equals 1, return AR.[[IsLockFree1]].
|
||||
4. If n equals 2, return AR.[[IsLockFree2]].
|
||||
5. If n equals 4, return true.
|
||||
6. Return false.
|
||||
|
||||
features: [Atomics, SharedArrayBuffer, TypedArray]
|
||||
includes: [testTypedArray.js]
|
||||
---*/
|
||||
|
||||
var views = intArrayConstructors.slice();
|
||||
|
||||
testWithTypedArrayConstructors(function(TA) {
|
||||
assert.sameValue(Atomics.isLockFree(TA.BYTES_PER_ELEMENT), true);
|
||||
}, views);
|
||||
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
// Copyright (C) 2018 Rick Waldron. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
|
||||
/*---
|
||||
esid: sec-atomics.load
|
||||
description: >
|
||||
Atomics.load returns the value that existed at the
|
||||
index prior to the operation.
|
||||
info: |
|
||||
Atomics.load( typedArray, index, value )
|
||||
|
||||
1. Return ? AtomicLoad(typedArray, index).
|
||||
|
||||
AtomicLoad( typedArray, index )
|
||||
|
||||
1. Let buffer be ? ValidateSharedIntegerTypedArray(typedArray).
|
||||
2. Let i be ? ValidateAtomicAccess(typedArray, index).
|
||||
3. Let arrayTypeName be typedArray.[[TypedArrayName]].
|
||||
4. Let elementSize be the Number value of the Element Size value
|
||||
specified in Table 56 for arrayTypeName.
|
||||
5. Let elementType be the String value of the Element Type value
|
||||
in Table 56 for arrayTypeName.
|
||||
6. Let offset be typedArray.[[ByteOffset]].
|
||||
7. Let indexedPosition be (i × elementSize) + offset.
|
||||
8. Return GetValueFromBuffer(buffer, indexedPosition, elementType,
|
||||
true, "SeqCst").
|
||||
|
||||
features: [Atomics, SharedArrayBuffer, TypedArray]
|
||||
---*/
|
||||
|
||||
var buffer = new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT);
|
||||
var i32a = new Int32Array(buffer);
|
||||
var value = 0b00000001000000001000000010000001;
|
||||
|
||||
assert.sameValue(Atomics.load(i32a, 0), 0);
|
||||
|
||||
i32a[0] = value;
|
||||
|
||||
assert.sameValue(Atomics.load(i32a, 0), value);
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
// Copyright (C) 2018 Rick Waldron. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
|
||||
/*---
|
||||
esid: sec-atomics.or
|
||||
description: >
|
||||
Atomics.and returns the value that existed at the
|
||||
index prior to the operation.
|
||||
info: |
|
||||
Atomics.or( typedArray, index, value )
|
||||
|
||||
1. Return ? AtomicReadModifyWrite(typedArray, index, value, or).
|
||||
|
||||
AtomicReadModifyWrite( typedArray, index, value, op )
|
||||
|
||||
...
|
||||
9. Return GetModifySetValueInBuffer(buffer, indexedPosition,
|
||||
elementType, v, op).
|
||||
|
||||
|
||||
GetModifySetValueInBuffer( arrayBuffer,
|
||||
byteIndex, type, value, op [ , isLittleEndian ] )
|
||||
|
||||
...
|
||||
16. Return RawBytesToNumber(type, rawBytesRead, isLittleEndian).
|
||||
|
||||
features: [Atomics, SharedArrayBuffer, TypedArray]
|
||||
---*/
|
||||
|
||||
var buffer = new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT);
|
||||
var i32a = new Int32Array(buffer);
|
||||
var value = 0b00000001000000001000000010000001;
|
||||
|
||||
assert.sameValue(Atomics.or(i32a, 0, value), 0);
|
||||
assert.sameValue(i32a[0], 0 | value);
|
|
@ -0,0 +1,26 @@
|
|||
// Copyright (C) 2018 Rick Waldron. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
|
||||
/*---
|
||||
esid: sec-atomics.store
|
||||
description: >
|
||||
Atomics.store returns the newly stored value
|
||||
info: |
|
||||
Atomics.store( typedArray, index, value )
|
||||
|
||||
...
|
||||
3. Let v be ? ToInteger(value).
|
||||
...
|
||||
9. Perform SetValueInBuffer(buffer, indexedPosition,
|
||||
elementType, v, true, "SeqCst").
|
||||
10. Return v.
|
||||
|
||||
features: [Atomics, SharedArrayBuffer, TypedArray]
|
||||
---*/
|
||||
|
||||
var buffer = new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT);
|
||||
var i32a = new Int32Array(buffer);
|
||||
var expect = 0b00000001000000001000000010000001;
|
||||
|
||||
assert.sameValue(Atomics.store(i32a, 0, expect), expect);
|
||||
assert.sameValue(i32a[0], expect);
|
|
@ -0,0 +1,37 @@
|
|||
// Copyright (C) 2018 Rick Waldron. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
|
||||
/*---
|
||||
esid: sec-atomics.sub
|
||||
description: >
|
||||
Atomics.and returns the value that existed at the
|
||||
index prior to the operation.
|
||||
info: |
|
||||
Atomics.sub( typedArray, index, value )
|
||||
|
||||
1. Return ? AtomicReadModifyWrite(typedArray, index, value, subtract).
|
||||
|
||||
AtomicReadModifyWrite( typedArray, index, value, op )
|
||||
|
||||
...
|
||||
9. Return GetModifySetValueInBuffer(buffer, indexedPosition,
|
||||
elementType, v, op).
|
||||
|
||||
|
||||
GetModifySetValueInBuffer( arrayBuffer,
|
||||
byteIndex, type, value, op [ , isLittleEndian ] )
|
||||
|
||||
...
|
||||
16. Return RawBytesToNumber(type, rawBytesRead, isLittleEndian).
|
||||
|
||||
features: [Atomics, SharedArrayBuffer, TypedArray]
|
||||
---*/
|
||||
|
||||
var buffer = new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT);
|
||||
var i32a = new Int32Array(buffer);
|
||||
var value = 0b00000001000000001000000010000001;
|
||||
|
||||
i32a[0] = value;
|
||||
|
||||
assert.sameValue(Atomics.sub(i32a, 0, value), value);
|
||||
assert.sameValue(i32a[0], 0);
|
|
@ -0,0 +1,39 @@
|
|||
// Copyright (C) 2018 Rick Waldron. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
|
||||
/*---
|
||||
esid: sec-atomics.wait
|
||||
description: >
|
||||
Demonstrates that Atomics.store(...) is causing a waiting
|
||||
features: [Atomics, computed-property-names, SharedArrayBuffer, TypedArray]
|
||||
---*/
|
||||
function getReport() {
|
||||
var r;
|
||||
while ((r = $262.agent.getReport()) == null) {
|
||||
$262.agent.sleep(10);
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
const TWO_SECOND_TIMEOUT = 2000;
|
||||
const i32a = new Int32Array(
|
||||
new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT)
|
||||
);
|
||||
|
||||
$262.agent.start(`
|
||||
$262.agent.receiveBroadcast(function(sab) {
|
||||
var i32a = new Int32Array(sab);
|
||||
var before = Date.now();
|
||||
Atomics.wait(i32a, 0, 0, ${TWO_SECOND_TIMEOUT});
|
||||
$262.agent.report("done");
|
||||
$262.agent.leaving();
|
||||
});
|
||||
`);
|
||||
|
||||
$262.agent.broadcast(i32a.buffer);
|
||||
$262.agent.sleep(10);
|
||||
Atomics.store(i32a, 0, 0x111111);
|
||||
|
||||
assert.sameValue(getReport(), "done");
|
||||
|
||||
|
|
@ -0,0 +1,38 @@
|
|||
// Copyright (C) 2018 Rick Waldron. All rights reserved.
|
||||
// This code is governed by the BSD license found in the LICENSE file.
|
||||
|
||||
/*---
|
||||
esid: sec-atomics.xor
|
||||
description: >
|
||||
Atomics.xor returns the value that existed at the
|
||||
index prior to the operation.
|
||||
info: |
|
||||
Atomics.xor( typedArray, index, value )
|
||||
|
||||
1. Return ? AtomicReadModifyWrite(typedArray, index, value, xor).
|
||||
|
||||
AtomicReadModifyWrite( typedArray, index, value, op )
|
||||
|
||||
...
|
||||
9. Return GetModifySetValueInBuffer(buffer, indexedPosition,
|
||||
elementType, v, op).
|
||||
|
||||
|
||||
GetModifySetValueInBuffer( arrayBuffer,
|
||||
byteIndex, type, value, op [ , isLittleEndian ] )
|
||||
|
||||
...
|
||||
16. Return RawBytesToNumber(type, rawBytesRead, isLittleEndian).
|
||||
|
||||
features: [Atomics, SharedArrayBuffer, TypedArray]
|
||||
---*/
|
||||
|
||||
var buffer = new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT);
|
||||
var i32a = new Int32Array(buffer);
|
||||
var value = 0b00000001000000001000000010000001;
|
||||
var other = 0b00000001111111111000000011111111;
|
||||
|
||||
i32a[0] = value;
|
||||
|
||||
assert.sameValue(Atomics.xor(i32a, 0, other), value);
|
||||
assert.sameValue(i32a[0], value ^ other);
|
Loading…
Reference in New Issue