| // Copyright 2020 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // Flags: --harmony-sharedarraybuffer --allow-natives-syntax |
| |
| // Test for the buffer becoming detached in surprising places. Test262 covers |
| // the case where the buffer starts off detached. |
| |
| function makePoison(arr, val) { |
| return { valueOf() { %ArrayBufferDetach(arr.buffer); return val; } }; |
| } |
| |
| function forEachIntegerTypedArray(cb) { |
| for (let C of [Int8Array, Uint8Array, Uint8ClampedArray, |
| Int16Array, Uint16Array, |
| Int32Array, Uint32Array, |
| BigInt64Array, BigUint64Array]) { |
| let arr = new C(32); |
| let zero, valuePoison; |
| if (C === BigInt64Array || C === BigUint64Array) { |
| zero = 0n; |
| valuePoison = makePoison(arr, 0n); |
| } else { |
| zero = 0; |
| valuePoison = makePoison(arr, 0); |
| } |
| cb(arr, makePoison(arr, 0), valuePoison, zero); |
| } |
| } |
| |
| forEachIntegerTypedArray((arr, indexPoison, valuePoison, zero) => { |
| assertThrows(() => Atomics.add(arr, indexPoison, zero), TypeError); |
| }); |
| forEachIntegerTypedArray((arr, indexPoison, valuePoison, zero) => { |
| assertThrows(() => Atomics.add(arr, 0, valuePoison), TypeError); |
| }); |
| |
| forEachIntegerTypedArray((arr, indexPoison, valuePoison, zero) => { |
| assertThrows(() => Atomics.and(arr, indexPoison, zero), TypeError); |
| }); |
| forEachIntegerTypedArray((arr, indexPoison, valuePoison, zero) => { |
| assertThrows(() => Atomics.and(arr, 0, valuePoison), TypeError); |
| }); |
| |
| forEachIntegerTypedArray((arr, indexPoison, valuePoison, zero) => { |
| assertThrows(() => Atomics.compareExchange(arr, indexPoison, zero, zero), |
| TypeError); |
| }); |
| forEachIntegerTypedArray((arr, indexPoison, valuePoison, zero) => { |
| assertThrows(() => Atomics.compareExchange(arr, 0, valuePoison, zero), |
| TypeError); |
| }); |
| forEachIntegerTypedArray((arr, indexPoison, valuePoison, zero) => { |
| assertThrows(() => Atomics.compareExchange(arr, 0, zero, valuePoison), |
| TypeError); |
| }); |
| |
| forEachIntegerTypedArray((arr, indexPoison, valuePoison, zero) => { |
| assertThrows(() => Atomics.exchange(arr, indexPoison, zero), TypeError); |
| }); |
| forEachIntegerTypedArray((arr, indexPoison, valuePoison, zero) => { |
| assertThrows(() => Atomics.exchange(arr, 0, valuePoison), TypeError); |
| }); |
| |
| forEachIntegerTypedArray((arr, indexPoison, valuePoison, zero) => { |
| assertThrows(() => Atomics.load(arr, indexPoison), TypeError); |
| }); |
| |
| forEachIntegerTypedArray((arr, indexPoison, valuePoison, zero) => { |
| assertThrows(() => Atomics.or(arr, indexPoison, zero), TypeError); |
| }); |
| forEachIntegerTypedArray((arr, indexPoison, valuePoison, zero) => { |
| assertThrows(() => Atomics.or(arr, 0, valuePoison), TypeError); |
| }); |
| |
| forEachIntegerTypedArray((arr, indexPoison, valuePoison, zero) => { |
| assertThrows(() => Atomics.store(arr, indexPoison, 0n), TypeError); |
| }); |
| forEachIntegerTypedArray((arr, indexPoison, valuePoison, zero) => { |
| assertThrows(() => Atomics.store(arr, 0, valuePoison), TypeError); |
| }); |
| |
| forEachIntegerTypedArray((arr, indexPoison, valuePoison, zero) => { |
| assertThrows(() => Atomics.sub(arr, indexPoison, zero), TypeError); |
| }); |
| forEachIntegerTypedArray((arr, indexPoison, valuePoison, zero) => { |
| assertThrows(() => Atomics.sub(arr, 0, valuePoison), TypeError); |
| }); |
| |
| forEachIntegerTypedArray((arr, indexPoison, valuePoison, zero) => { |
| assertThrows(() => Atomics.xor(arr, indexPoison, zero), TypeError); |
| }); |
| forEachIntegerTypedArray((arr, indexPoison, valuePoison, zero) => { |
| assertThrows(() => Atomics.xor(arr, 0, valuePoison), TypeError); |
| }); |
| |
| // Atomics.wait always throws on non-SABs. |
| // Atomics.notify always returns 0 on non-SABs. |