OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Flags: --harmony-sharedarraybuffer | 5 // Flags: --harmony-sharedarraybuffer |
6 // | 6 // |
7 | 7 |
8 function toRangeWrapped(value) { | 8 function toRangeWrapped(value) { |
9 var range = this.max - this.min + 1; | 9 var range = this.max - this.min + 1; |
10 while (value < this.min) { | 10 while (value < this.min) { |
(...skipping 20 matching lines...) Expand all Loading... |
31 var IntegerTypedArrayConstructors = [ | 31 var IntegerTypedArrayConstructors = [ |
32 makeConstructorObject(Int8Array, -128, 127, toRangeWrapped), | 32 makeConstructorObject(Int8Array, -128, 127, toRangeWrapped), |
33 makeConstructorObject(Int16Array, -32768, 32767, toRangeWrapped), | 33 makeConstructorObject(Int16Array, -32768, 32767, toRangeWrapped), |
34 makeConstructorObject(Int32Array, -0x80000000, 0x7fffffff, toRangeWrapped), | 34 makeConstructorObject(Int32Array, -0x80000000, 0x7fffffff, toRangeWrapped), |
35 makeConstructorObject(Uint8Array, 0, 255, toRangeWrapped), | 35 makeConstructorObject(Uint8Array, 0, 255, toRangeWrapped), |
36 makeConstructorObject(Uint8ClampedArray, 0, 255, toRangeClamped), | 36 makeConstructorObject(Uint8ClampedArray, 0, 255, toRangeClamped), |
37 makeConstructorObject(Uint16Array, 0, 65535, toRangeWrapped), | 37 makeConstructorObject(Uint16Array, 0, 65535, toRangeWrapped), |
38 makeConstructorObject(Uint32Array, 0, 0xffffffff, toRangeWrapped), | 38 makeConstructorObject(Uint32Array, 0, 0xffffffff, toRangeWrapped), |
39 ]; | 39 ]; |
40 | 40 |
41 var TypedArrayConstructors = IntegerTypedArrayConstructors.concat([ | |
42 {constr: Float32Array}, | |
43 {constr: Float64Array}, | |
44 ]); | |
45 | |
46 (function TestBadArray() { | 41 (function TestBadArray() { |
47 var ab = new ArrayBuffer(16); | 42 var ab = new ArrayBuffer(16); |
48 var u32a = new Uint32Array(16); | 43 var u32a = new Uint32Array(16); |
49 var sab = new SharedArrayBuffer(128); | 44 var sab = new SharedArrayBuffer(128); |
50 var sf32a = new Float32Array(sab); | 45 var sf32a = new Float32Array(sab); |
51 var sf64a = new Float64Array(sab); | 46 var sf64a = new Float64Array(sab); |
52 | 47 |
53 // Atomic ops required shared typed arrays | 48 // Atomic ops required integer shared typed arrays |
54 [undefined, 1, 'hi', 3.4, ab, u32a, sab].forEach(function(o) { | 49 [undefined, 1, 'hi', 3.4, ab, u32a, sab, sf32a, sf64a].forEach(function(o) { |
55 assertThrows(function() { Atomics.compareExchange(o, 0, 0, 0); }, | 50 assertThrows(function() { Atomics.compareExchange(o, 0, 0, 0); }, |
56 TypeError); | 51 TypeError); |
57 assertThrows(function() { Atomics.load(o, 0); }, TypeError); | 52 assertThrows(function() { Atomics.load(o, 0); }, TypeError); |
58 assertThrows(function() { Atomics.store(o, 0, 0); }, TypeError); | 53 assertThrows(function() { Atomics.store(o, 0, 0); }, TypeError); |
59 assertThrows(function() { Atomics.add(o, 0, 0); }, TypeError); | 54 assertThrows(function() { Atomics.add(o, 0, 0); }, TypeError); |
60 assertThrows(function() { Atomics.sub(o, 0, 0); }, TypeError); | 55 assertThrows(function() { Atomics.sub(o, 0, 0); }, TypeError); |
61 assertThrows(function() { Atomics.and(o, 0, 0); }, TypeError); | 56 assertThrows(function() { Atomics.and(o, 0, 0); }, TypeError); |
62 assertThrows(function() { Atomics.or(o, 0, 0); }, TypeError); | 57 assertThrows(function() { Atomics.or(o, 0, 0); }, TypeError); |
63 assertThrows(function() { Atomics.xor(o, 0, 0); }, TypeError); | 58 assertThrows(function() { Atomics.xor(o, 0, 0); }, TypeError); |
64 assertThrows(function() { Atomics.exchange(o, 0, 0); }, TypeError); | 59 assertThrows(function() { Atomics.exchange(o, 0, 0); }, TypeError); |
65 }); | 60 }); |
66 | |
67 // Arithmetic atomic ops require integer shared arrays | |
68 [sab, sf32a, sf64a].forEach(function(o) { | |
69 assertThrows(function() { Atomics.add(o, 0, 0); }, TypeError); | |
70 assertThrows(function() { Atomics.sub(o, 0, 0); }, TypeError); | |
71 assertThrows(function() { Atomics.and(o, 0, 0); }, TypeError); | |
72 assertThrows(function() { Atomics.or(o, 0, 0); }, TypeError); | |
73 assertThrows(function() { Atomics.xor(o, 0, 0); }, TypeError); | |
74 assertThrows(function() { Atomics.exchange(o, 0, 0); }, TypeError); | |
75 }); | |
76 })(); | 61 })(); |
77 | 62 |
78 function testAtomicOp(op, ia, index, expectedIndex, name) { | 63 function testAtomicOp(op, ia, index, expectedIndex, name) { |
79 for (var i = 0; i < ia.length; ++i) | 64 for (var i = 0; i < ia.length; ++i) |
80 ia[i] = 22; | 65 ia[i] = 22; |
81 | 66 |
82 ia[expectedIndex] = 0; | 67 ia[expectedIndex] = 0; |
83 assertEquals(0, op(ia, index, 0, 0), name); | 68 assertEquals(0, op(ia, index, 0, 0), name); |
84 assertEquals(0, ia[expectedIndex], name); | 69 assertEquals(0, ia[expectedIndex], name); |
85 | 70 |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
156 testAtomicOp(Atomics.add, si32a, i, 3, name); | 141 testAtomicOp(Atomics.add, si32a, i, 3, name); |
157 testAtomicOp(Atomics.sub, si32a, i, 3, name); | 142 testAtomicOp(Atomics.sub, si32a, i, 3, name); |
158 testAtomicOp(Atomics.and, si32a, i, 3, name); | 143 testAtomicOp(Atomics.and, si32a, i, 3, name); |
159 testAtomicOp(Atomics.or, si32a, i, 3, name); | 144 testAtomicOp(Atomics.or, si32a, i, 3, name); |
160 testAtomicOp(Atomics.xor, si32a, i, 3, name); | 145 testAtomicOp(Atomics.xor, si32a, i, 3, name); |
161 testAtomicOp(Atomics.exchange, si32a, i, 3, name); | 146 testAtomicOp(Atomics.exchange, si32a, i, 3, name); |
162 }); | 147 }); |
163 })(); | 148 })(); |
164 | 149 |
165 (function TestCompareExchange() { | 150 (function TestCompareExchange() { |
166 TypedArrayConstructors.forEach(function(t) { | 151 IntegerTypedArrayConstructors.forEach(function(t) { |
167 var sab = new SharedArrayBuffer(10 * t.constr.BYTES_PER_ELEMENT); | 152 var sab = new SharedArrayBuffer(10 * t.constr.BYTES_PER_ELEMENT); |
168 var sta = new t.constr(sab); | 153 var sta = new t.constr(sab); |
169 var name = Object.prototype.toString.call(sta); | 154 var name = Object.prototype.toString.call(sta); |
170 for (var i = 0; i < 10; ++i) { | 155 for (var i = 0; i < 10; ++i) { |
171 // sta[i] == 0, CAS will store | 156 // sta[i] == 0, CAS will store |
172 assertEquals(0, Atomics.compareExchange(sta, i, 0, 50), name); | 157 assertEquals(0, Atomics.compareExchange(sta, i, 0, 50), name); |
173 assertEquals(50, sta[i], name); | 158 assertEquals(50, sta[i], name); |
174 | 159 |
175 // sta[i] == 50, CAS will not store | 160 // sta[i] == 50, CAS will not store |
176 assertEquals(50, Atomics.compareExchange(sta, i, 0, 100), name); | 161 assertEquals(50, Atomics.compareExchange(sta, i, 0, 100), name); |
177 assertEquals(50, sta[i], name); | 162 assertEquals(50, sta[i], name); |
178 } | 163 } |
179 }); | 164 }); |
180 | |
181 // * Exact float values should be OK | |
182 // * Infinity, -Infinity should be OK (has exact representation) | |
183 // * NaN is not OK, it has many representations, cannot ensure successful CAS | |
184 // because it does a bitwise compare | |
185 [1.5, 4.25, -1e8, -Infinity, Infinity].forEach(function(v) { | |
186 var sab = new SharedArrayBuffer(10 * Float32Array.BYTES_PER_ELEMENT); | |
187 var sf32a = new Float32Array(sab); | |
188 sf32a[0] = 0; | |
189 assertEquals(0, Atomics.compareExchange(sf32a, 0, 0, v)); | |
190 assertEquals(v, sf32a[0]); | |
191 assertEquals(v, Atomics.compareExchange(sf32a, 0, v, 0)); | |
192 assertEquals(0, sf32a[0]); | |
193 | |
194 var sab2 = new SharedArrayBuffer(10 * Float64Array.BYTES_PER_ELEMENT); | |
195 var sf64a = new Float64Array(sab2); | |
196 sf64a[0] = 0; | |
197 assertEquals(0, Atomics.compareExchange(sf64a, 0, 0, v)); | |
198 assertEquals(v, sf64a[0]); | |
199 assertEquals(v, Atomics.compareExchange(sf64a, 0, v, 0)); | |
200 assertEquals(0, sf64a[0]); | |
201 }); | |
202 })(); | 165 })(); |
203 | 166 |
204 (function TestLoad() { | 167 (function TestLoad() { |
205 TypedArrayConstructors.forEach(function(t) { | 168 IntegerTypedArrayConstructors.forEach(function(t) { |
206 var sab = new SharedArrayBuffer(10 * t.constr.BYTES_PER_ELEMENT); | 169 var sab = new SharedArrayBuffer(10 * t.constr.BYTES_PER_ELEMENT); |
207 var sta = new t.constr(sab); | 170 var sta = new t.constr(sab); |
208 var name = Object.prototype.toString.call(sta); | 171 var name = Object.prototype.toString.call(sta); |
209 for (var i = 0; i < 10; ++i) { | 172 for (var i = 0; i < 10; ++i) { |
210 sta[i] = 0; | 173 sta[i] = 0; |
211 assertEquals(0, Atomics.load(sta, i), name); | 174 assertEquals(0, Atomics.load(sta, i), name); |
212 sta[i] = 50; | 175 sta[i] = 50; |
213 assertEquals(50, Atomics.load(sta, i), name); | 176 assertEquals(50, Atomics.load(sta, i), name); |
214 } | 177 } |
215 }); | 178 }); |
216 })(); | 179 })(); |
217 | 180 |
218 (function TestStore() { | 181 (function TestStore() { |
219 TypedArrayConstructors.forEach(function(t) { | 182 IntegerTypedArrayConstructors.forEach(function(t) { |
220 var sab = new SharedArrayBuffer(10 * t.constr.BYTES_PER_ELEMENT); | 183 var sab = new SharedArrayBuffer(10 * t.constr.BYTES_PER_ELEMENT); |
221 var sta = new t.constr(sab); | 184 var sta = new t.constr(sab); |
222 var name = Object.prototype.toString.call(sta); | 185 var name = Object.prototype.toString.call(sta); |
223 for (var i = 0; i < 10; ++i) { | 186 for (var i = 0; i < 10; ++i) { |
224 assertEquals(50, Atomics.store(sta, i, 50), name); | 187 assertEquals(50, Atomics.store(sta, i, 50), name); |
225 assertEquals(50, sta[i], name); | 188 assertEquals(50, sta[i], name); |
226 | 189 |
227 assertEquals(100, Atomics.store(sta, i, 100), name); | 190 assertEquals(100, Atomics.store(sta, i, 100), name); |
228 assertEquals(100, sta[i], name); | 191 assertEquals(100, sta[i], name); |
229 } | 192 } |
230 }); | 193 }); |
231 | |
232 [1.5, 4.25, -1e8, -Infinity, Infinity, NaN].forEach(function(v) { | |
233 var sab = new SharedArrayBuffer(10 * Float32Array.BYTES_PER_ELEMENT); | |
234 var sf32a = new Float32Array(sab); | |
235 sf32a[0] = 0; | |
236 assertEquals(v, Atomics.store(sf32a, 0, v)); | |
237 assertEquals(v, sf32a[0]); | |
238 | |
239 var sab2 = new SharedArrayBuffer(10 * Float64Array.BYTES_PER_ELEMENT); | |
240 var sf64a = new Float64Array(sab2); | |
241 sf64a[0] = 0; | |
242 assertEquals(v, Atomics.store(sf64a, 0, v)); | |
243 assertEquals(v, sf64a[0]); | |
244 }); | |
245 })(); | 194 })(); |
246 | 195 |
247 (function TestAdd() { | 196 (function TestAdd() { |
248 IntegerTypedArrayConstructors.forEach(function(t) { | 197 IntegerTypedArrayConstructors.forEach(function(t) { |
249 var sab = new SharedArrayBuffer(10 * t.constr.BYTES_PER_ELEMENT); | 198 var sab = new SharedArrayBuffer(10 * t.constr.BYTES_PER_ELEMENT); |
250 var sta = new t.constr(sab); | 199 var sta = new t.constr(sab); |
251 var name = Object.prototype.toString.call(sta); | 200 var name = Object.prototype.toString.call(sta); |
252 for (var i = 0; i < 10; ++i) { | 201 for (var i = 0; i < 10; ++i) { |
253 assertEquals(0, Atomics.add(sta, i, 50), name); | 202 assertEquals(0, Atomics.add(sta, i, 50), name); |
254 assertEquals(50, sta[i], name); | 203 assertEquals(50, sta[i], name); |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
341 | 290 |
342 (function TestIsLockFree() { | 291 (function TestIsLockFree() { |
343 // For all platforms we support, 1, 2 and 4 bytes should be lock-free. | 292 // For all platforms we support, 1, 2 and 4 bytes should be lock-free. |
344 assertEquals(true, Atomics.isLockFree(1)); | 293 assertEquals(true, Atomics.isLockFree(1)); |
345 assertEquals(true, Atomics.isLockFree(2)); | 294 assertEquals(true, Atomics.isLockFree(2)); |
346 assertEquals(true, Atomics.isLockFree(4)); | 295 assertEquals(true, Atomics.isLockFree(4)); |
347 | 296 |
348 // Sizes that aren't equal to a typedarray BYTES_PER_ELEMENT always return | 297 // Sizes that aren't equal to a typedarray BYTES_PER_ELEMENT always return |
349 // false. | 298 // false. |
350 var validSizes = {}; | 299 var validSizes = {}; |
351 TypedArrayConstructors.forEach(function(t) { | 300 IntegerTypedArrayConstructors.forEach(function(t) { |
352 validSizes[t.constr.BYTES_PER_ELEMENT] = true; | 301 validSizes[t.constr.BYTES_PER_ELEMENT] = true; |
353 }); | 302 }); |
354 | 303 |
355 for (var i = 0; i < 1000; ++i) { | 304 for (var i = 0; i < 1000; ++i) { |
356 if (!validSizes[i]) { | 305 if (!validSizes[i]) { |
357 assertEquals(false, Atomics.isLockFree(i)); | 306 assertEquals(false, Atomics.isLockFree(i)); |
358 } | 307 } |
359 } | 308 } |
360 })(); | 309 })(); |
361 | 310 |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
502 // Exchange | 451 // Exchange |
503 sta[0] = val = 0x12; | 452 sta[0] = val = 0x12; |
504 operand = 0x22 + offset; | 453 operand = 0x22 + offset; |
505 valWrapped = t.toRange(operand); | 454 valWrapped = t.toRange(operand); |
506 assertEquals(val, Atomics.exchange(sta, 0, operand), name); | 455 assertEquals(val, Atomics.exchange(sta, 0, operand), name); |
507 assertEquals(valWrapped, sta[0], name); | 456 assertEquals(valWrapped, sta[0], name); |
508 } | 457 } |
509 | 458 |
510 }); | 459 }); |
511 })(); | 460 })(); |
OLD | NEW |