| // Copyright (C) 2017 Mozilla Corporation. All rights reserved. |
| // This code is governed by the BSD license found in the LICENSE file. |
| /*--- |
| description: | |
| Collection of functions used to assert the correctness of SharedArrayBuffer objects. |
| ---*/ |
| |
| |
| /** |
| * Calls the provided function for a each bad index that should throw a |
| * RangeError when passed to an Atomics method on a SAB-backed view where |
| * index 125 is out of range. |
| * |
| * @param f - the function to call for each bad index. |
| */ |
| function testWithAtomicsOutOfBoundsIndices(f) { |
| var bad_indices = [ |
| (view) => -1, |
| (view) => view.length, |
| (view) => view.length*2, |
| (view) => Number.POSITIVE_INFINITY, |
| (view) => Number.NEGATIVE_INFINITY, |
| (view) => ({ valueOf: () => 125 }), |
| (view) => ({ toString: () => '125', valueOf: false }) // non-callable valueOf triggers invocation of toString |
| ]; |
| |
| for (let IdxGen of bad_indices) { |
| try { |
| f(IdxGen); |
| } catch (e) { |
| e.message += " (Testing with index gen " + IdxGen + ".)"; |
| throw e; |
| } |
| } |
| } |
| |
| /** |
| * Calls the provided function for each good index that should not throw when |
| * passed to an Atomics method on a SAB-backed view. |
| * |
| * The view must have length greater than zero. |
| * |
| * @param f - the function to call for each good index. |
| */ |
| function testWithAtomicsInBoundsIndices(f) { |
| // Most of these are eventually coerced to +0 by ToIndex. |
| var good_indices = [ |
| (view) => 0/-1, |
| (view) => '-0', |
| (view) => undefined, |
| (view) => NaN, |
| (view) => 0.5, |
| (view) => '0.5', |
| (view) => -0.9, |
| (view) => ({ password: "qumquat" }), |
| (view) => view.length - 1, |
| (view) => ({ valueOf: () => 0 }), |
| (view) => ({ toString: () => '0', valueOf: false }) // non-callable valueOf triggers invocation of toString |
| ]; |
| |
| for (let IdxGen of good_indices) { |
| try { |
| f(IdxGen); |
| } catch (e) { |
| e.message += " (Testing with index gen " + IdxGen + ".)"; |
| throw e; |
| } |
| } |
| } |
| |
| /** |
| * Calls the provided function for each value that should throw a TypeError |
| * when passed to an Atomics method as a view. |
| * |
| * @param f - the function to call for each non-view value. |
| */ |
| |
| function testWithAtomicsNonViewValues(f) { |
| var values = [ |
| null, |
| undefined, |
| true, |
| false, |
| new Boolean(true), |
| 10, |
| 3.14, |
| new Number(4), |
| "Hi there", |
| new Date, |
| /a*utomaton/g, |
| { password: "qumquat" }, |
| new DataView(new ArrayBuffer(10)), |
| new ArrayBuffer(128), |
| new SharedArrayBuffer(128), |
| new Error("Ouch"), |
| [1,1,2,3,5,8], |
| ((x) => -x), |
| new Map(), |
| new Set(), |
| new WeakMap(), |
| new WeakSet(), |
| Symbol("halleluja"), |
| // TODO: Proxy? |
| Object, |
| Int32Array, |
| Date, |
| Math, |
| Atomics |
| ]; |
| |
| for (let nonView of values) { |
| try { |
| f(nonView); |
| } catch (e) { |
| e.message += " (Testing with non-view value " + nonView + ".)"; |
| throw e; |
| } |
| } |
| } |