Invalid flags in a RegExp literal should be an early SyntaxError
[WebKit-https.git] / JSTests / stress / SharedArrayBuffer.js
1 //@ skip
2 // This is a basic test of SharedArrayBuffer API as we understand it.
3
4 if (SharedArrayBuffer == ArrayBuffer)
5     throw new Error("SharedArrayBuffer and ArrayBuffer should be distinct");
6
7 if (SharedArrayBuffer.prototype == ArrayBuffer.prototype)
8     throw new Error("SharedArrayBuffer.prototype and ArrayBuffer.prototype should be distinct");
9
10 if (SharedArrayBuffer.prototype.__proto__ != Object.prototype)
11     throw new Error("SharedArrayBuffer.prototype.__proto__ should be Object.prototype");
12
13 if (!(new SharedArrayBuffer(100) instanceof SharedArrayBuffer))
14     throw new Error("SharedArrayBuffer should be an instance of SharedArrayBuffer");
15
16 if (!(new ArrayBuffer(100) instanceof ArrayBuffer))
17     throw new Error("ArrayBuffer should be an instance of ArrayBuffer");
18
19 if (new SharedArrayBuffer(100) instanceof ArrayBuffer)
20     throw new Error("SharedArrayBuffer should not be an instance of ArrayBuffer");
21
22 if (new ArrayBuffer(100) instanceof SharedArrayBuffer)
23     throw new Error("ArrayBuffer should not be an instance of SharedArrayBuffer");
24
25 function checkAtomics(name, count)
26 {
27     if (!Atomics[name])
28         throw new Error("Missing Atomics." + name);
29     if (Atomics[name].length != count)
30         throw new Error("Atomics." + name + " should have length " + count + " but has length " + Atomics[name].length);
31 }
32 checkAtomics("add", 3);
33 checkAtomics("and", 3);
34 checkAtomics("compareExchange", 4);
35 checkAtomics("exchange", 3);
36 checkAtomics("isLockFree", 1);
37 checkAtomics("load", 2);
38 checkAtomics("or", 3);
39 checkAtomics("store", 3);
40 checkAtomics("sub", 3);
41 checkAtomics("wait", 4);
42 checkAtomics("wake", 3);
43 checkAtomics("xor", 3);
44
45 // These should all succeed.
46 var dv = new DataView(new SharedArrayBuffer(128));
47 var i8a = new Int8Array(new SharedArrayBuffer(128));
48 var i16a = new Int16Array(new SharedArrayBuffer(128));
49 var i32a = new Int32Array(new SharedArrayBuffer(128));
50 var u8a = new Uint8Array(new SharedArrayBuffer(128));
51 var u8ca = new Uint8ClampedArray(new SharedArrayBuffer(128));
52 var u16a = new Uint16Array(new SharedArrayBuffer(128));
53 var u32a = new Uint32Array(new SharedArrayBuffer(128));
54 var f32a = new Float32Array(new SharedArrayBuffer(128));
55 var f64a = new Float64Array(new SharedArrayBuffer(128));
56
57 function shouldFail(f, name)
58 {
59     try {
60         f();
61     } catch (e) {
62         if (e.name == name.name)
63             return;
64         throw new Error(f + " threw the wrong error: " + e);
65     }
66     throw new Error(f + " succeeded!");
67 }
68
69 for (bad of [void 0, null, false, true, 1, 0.5, Symbol(), {}, "hello", dv, u8ca, f32a, f64a]) {
70     shouldFail(() => Atomics.add(bad, 0, 0), TypeError);
71     shouldFail(() => Atomics.and(bad, 0, 0), TypeError);
72     shouldFail(() => Atomics.compareExchange(bad, 0, 0, 0), TypeError);
73     shouldFail(() => Atomics.exchange(bad, 0, 0), TypeError);
74     shouldFail(() => Atomics.load(bad, 0), TypeError);
75     shouldFail(() => Atomics.or(bad, 0, 0), TypeError);
76     shouldFail(() => Atomics.store(bad, 0, 0), TypeError);
77     shouldFail(() => Atomics.sub(bad, 0, 0), TypeError);
78     shouldFail(() => Atomics.xor(bad, 0, 0), TypeError);
79 }
80
81 for (bad of [void 0, null, false, true, 1, 0.5, Symbol(), {}, "hello", dv, i8a, i16a, u8a, u8ca, u16a, u32a, f32a, f64a]) {
82     shouldFail(() => Atomics.wait(bad, 0, 0), TypeError);
83     shouldFail(() => Atomics.wake(bad, 0, 0), TypeError);
84 }
85
86 for (idx of [-1, -1000000000000, 10000, 10000000000000, "hello"]) {
87     for (a of [i8a, i16a, i32a, u8a, u16a, u32a]) {
88         shouldFail(() => Atomics.add(a, idx, 0), RangeError);
89         shouldFail(() => Atomics.and(a, idx, 0), RangeError);
90         shouldFail(() => Atomics.compareExchange(a, idx, 0, 0), RangeError);
91         shouldFail(() => Atomics.exchange(a, idx, 0), RangeError);
92         shouldFail(() => Atomics.load(a, idx), RangeError);
93         shouldFail(() => Atomics.or(a, idx, 0), RangeError);
94         shouldFail(() => Atomics.store(a, idx, 0), RangeError);
95         shouldFail(() => Atomics.sub(a, idx, 0), RangeError);
96         shouldFail(() => Atomics.xor(a, idx, 0), RangeError);
97     }
98     shouldFail(() => Atomics.wait(i32a, idx, 0), RangeError);
99     shouldFail(() => Atomics.wake(i32a, idx, 0), RangeError);
100 }
101
102 function runAtomic(array, index, init, name, args, expectedResult, expectedOutcome)
103 {
104     array[index] = init;
105     var result = Atomics[name](array, index, ...args);
106     if (result != expectedResult)
107         throw new Error("Expected Atomics." + name + "(array, " + index + ", " + args.join(", ") + ") to return " + expectedResult + " but returned " + result + " for " + Object.prototype.toString.apply(array));
108     if (array[index] !== expectedOutcome)
109         throw new Error("Expected Atomics." + name + "(array, " + index + ", " + args.join(", ") + ") to result in array[" + index + "] = " + expectedOutcome + " but got " + array[index] + " for " + Object.prototype.toString.apply(array));
110 }
111
112 for (a of [i8a, i16a, i32a, u8a, u16a, u32a]) {
113     runAtomic(a, 0, 13, "add", [42], 13, 55);
114     runAtomic(a, 0, 13, "and", [42], 13, 8);
115     runAtomic(a, 0, 13, "compareExchange", [25, 42], 13, 13);
116     runAtomic(a, 0, 13, "compareExchange", [13, 42], 13, 42);
117     runAtomic(a, 0, 13, "exchange", [42], 13, 42);
118     runAtomic(a, 0, 13, "load", [], 13, 13);
119     runAtomic(a, 0, 13, "or", [42], 13, 47);
120     runAtomic(a, 0, 13, "store", [42], 42, 42);
121     runAtomic(a, 0, 42, "sub", [13], 42, 29);
122     runAtomic(a, 0, 13, "xor", [42], 13, 39);
123 }
124
125 i32a[0] = 0;
126 var result = Atomics.wait(i32a, 0, 1);
127 if (result != "not-equal")
128     throw "Error: bad result from Atomics.wait: " + result;
129 for (timeout of [0, 1, 10]) {
130     var result = Atomics.wait(i32a, 0, 0, timeout);
131     if (result != "timed-out")
132         throw "Error: bad result from Atomics.wait: " + result;
133 }
134