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-atomics --harmony-sharedarraybuffer | 5 // Flags: --harmony-atomics --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 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
154 var name = Object.prototype.toString.call(sta); | 154 var name = Object.prototype.toString.call(sta); |
155 for (var i = 0; i < 10; ++i) { | 155 for (var i = 0; i < 10; ++i) { |
156 // sta[i] == 0, CAS will store | 156 // sta[i] == 0, CAS will store |
157 assertEquals(0, Atomics.compareExchange(sta, i, 0, 50), name); | 157 assertEquals(0, Atomics.compareExchange(sta, i, 0, 50), name); |
158 assertEquals(50, sta[i], name); | 158 assertEquals(50, sta[i], name); |
159 | 159 |
160 // sta[i] == 50, CAS will not store | 160 // sta[i] == 50, CAS will not store |
161 assertEquals(50, Atomics.compareExchange(sta, i, 0, 100), name); | 161 assertEquals(50, Atomics.compareExchange(sta, i, 0, 100), name); |
162 assertEquals(50, sta[i], name); | 162 assertEquals(50, sta[i], name); |
163 } | 163 } |
164 | |
165 // Non-numbers should be coerced to numbers. | |
166 [false, true, undefined].forEach(function(v) { | |
Jarin
2015/07/13 05:05:55
Maybe you should also try an object with a toStrin
binji
2015/07/13 19:29:11
Done.
| |
167 sta[0] = 50; | |
168 assertEquals(50, Atomics.compareExchange(sta, 0, v, v), name); | |
169 }); | |
164 }); | 170 }); |
165 | 171 |
166 // * Exact float values should be OK | 172 // * Exact float values should be OK |
167 // * Infinity, -Infinity should be OK (has exact representation) | 173 // * Infinity, -Infinity should be OK (has exact representation) |
168 // * NaN is not OK, it has many representations, cannot ensure successful CAS | 174 // * NaN is not OK, it has many representations, cannot ensure successful CAS |
169 // because it does a bitwise compare | 175 // because it does a bitwise compare |
170 [1.5, 4.25, -1e8, -Infinity, Infinity].forEach(function(v) { | 176 [1.5, 4.25, -1e8, -Infinity, Infinity].forEach(function(v) { |
171 var sab = new SharedArrayBuffer(10 * Float32Array.BYTES_PER_ELEMENT); | 177 var sab = new SharedArrayBuffer(10 * Float32Array.BYTES_PER_ELEMENT); |
172 var sf32a = new Float32Array(sab); | 178 var sf32a = new Float32Array(sab); |
173 sf32a[0] = 0; | 179 sf32a[0] = 0; |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
205 var sab = new SharedArrayBuffer(10 * t.constr.BYTES_PER_ELEMENT); | 211 var sab = new SharedArrayBuffer(10 * t.constr.BYTES_PER_ELEMENT); |
206 var sta = new t.constr(sab); | 212 var sta = new t.constr(sab); |
207 var name = Object.prototype.toString.call(sta); | 213 var name = Object.prototype.toString.call(sta); |
208 for (var i = 0; i < 10; ++i) { | 214 for (var i = 0; i < 10; ++i) { |
209 assertEquals(50, Atomics.store(sta, i, 50), name); | 215 assertEquals(50, Atomics.store(sta, i, 50), name); |
210 assertEquals(50, sta[i], name); | 216 assertEquals(50, sta[i], name); |
211 | 217 |
212 assertEquals(100, Atomics.store(sta, i, 100), name); | 218 assertEquals(100, Atomics.store(sta, i, 100), name); |
213 assertEquals(100, sta[i], name); | 219 assertEquals(100, sta[i], name); |
214 } | 220 } |
221 | |
222 // Non-numbers should be coerced to numbers. | |
223 [false, true, undefined].forEach(function(v) { | |
224 assertEquals(+v, Atomics.store(sta, 0, v), name); | |
225 }); | |
215 }); | 226 }); |
216 | 227 |
217 [1.5, 4.25, -1e8, -Infinity, Infinity, NaN].forEach(function(v) { | 228 [1.5, 4.25, -1e8, -Infinity, Infinity, NaN].forEach(function(v) { |
218 var sab = new SharedArrayBuffer(10 * Float32Array.BYTES_PER_ELEMENT); | 229 var sab = new SharedArrayBuffer(10 * Float32Array.BYTES_PER_ELEMENT); |
219 var sf32a = new Float32Array(sab); | 230 var sf32a = new Float32Array(sab); |
220 sf32a[0] = 0; | 231 sf32a[0] = 0; |
221 assertEquals(v, Atomics.store(sf32a, 0, v)); | 232 assertEquals(v, Atomics.store(sf32a, 0, v)); |
222 assertEquals(v, sf32a[0]); | 233 assertEquals(v, sf32a[0]); |
223 | 234 |
224 var sab2 = new SharedArrayBuffer(10 * Float64Array.BYTES_PER_ELEMENT); | 235 var sab2 = new SharedArrayBuffer(10 * Float64Array.BYTES_PER_ELEMENT); |
225 var sf64a = new Float64Array(sab2); | 236 var sf64a = new Float64Array(sab2); |
226 sf64a[0] = 0; | 237 sf64a[0] = 0; |
227 assertEquals(v, Atomics.store(sf64a, 0, v)); | 238 assertEquals(v, Atomics.store(sf64a, 0, v)); |
228 assertEquals(v, sf64a[0]); | 239 assertEquals(v, sf64a[0]); |
229 }); | 240 }); |
230 })(); | 241 })(); |
231 | 242 |
232 (function TestAdd() { | 243 (function TestAdd() { |
233 IntegerTypedArrayConstructors.forEach(function(t) { | 244 IntegerTypedArrayConstructors.forEach(function(t) { |
234 var sab = new SharedArrayBuffer(10 * t.constr.BYTES_PER_ELEMENT); | 245 var sab = new SharedArrayBuffer(10 * t.constr.BYTES_PER_ELEMENT); |
235 var sta = new t.constr(sab); | 246 var sta = new t.constr(sab); |
236 var name = Object.prototype.toString.call(sta); | 247 var name = Object.prototype.toString.call(sta); |
237 for (var i = 0; i < 10; ++i) { | 248 for (var i = 0; i < 10; ++i) { |
238 assertEquals(0, Atomics.add(sta, i, 50), name); | 249 assertEquals(0, Atomics.add(sta, i, 50), name); |
239 assertEquals(50, sta[i], name); | 250 assertEquals(50, sta[i], name); |
240 | 251 |
241 assertEquals(50, Atomics.add(sta, i, 70), name); | 252 assertEquals(50, Atomics.add(sta, i, 70), name); |
242 assertEquals(120, sta[i], name); | 253 assertEquals(120, sta[i], name); |
243 } | 254 } |
255 | |
256 // Non-numbers should be coerced to numbers. | |
257 [false, true, undefined].forEach(function(v) { | |
258 sta[0] = 120; | |
259 assertEquals(120, Atomics.add(sta, 0, v), name); | |
260 assertEquals(120 + (v|0), sta[0], name); | |
261 }); | |
244 }); | 262 }); |
245 })(); | 263 })(); |
246 | 264 |
247 (function TestSub() { | 265 (function TestSub() { |
248 IntegerTypedArrayConstructors.forEach(function(t) { | 266 IntegerTypedArrayConstructors.forEach(function(t) { |
249 var sab = new SharedArrayBuffer(10 * t.constr.BYTES_PER_ELEMENT); | 267 var sab = new SharedArrayBuffer(10 * t.constr.BYTES_PER_ELEMENT); |
250 var sta = new t.constr(sab); | 268 var sta = new t.constr(sab); |
251 var name = Object.prototype.toString.call(sta); | 269 var name = Object.prototype.toString.call(sta); |
252 for (var i = 0; i < 10; ++i) { | 270 for (var i = 0; i < 10; ++i) { |
253 sta[i] = 120; | 271 sta[i] = 120; |
254 assertEquals(120, Atomics.sub(sta, i, 50), name); | 272 assertEquals(120, Atomics.sub(sta, i, 50), name); |
255 assertEquals(70, sta[i], name); | 273 assertEquals(70, sta[i], name); |
256 | 274 |
257 assertEquals(70, Atomics.sub(sta, i, 70), name); | 275 assertEquals(70, Atomics.sub(sta, i, 70), name); |
258 assertEquals(0, sta[i], name); | 276 assertEquals(0, sta[i], name); |
259 } | 277 } |
278 | |
279 // Non-numbers should be coerced to numbers. | |
280 [false, true, undefined].forEach(function(v) { | |
281 sta[0] = 70; | |
282 assertEquals(70, Atomics.sub(sta, 0, v), name); | |
283 assertEquals(70 - (v|0), sta[0]); | |
284 }); | |
260 }); | 285 }); |
261 })(); | 286 })(); |
262 | 287 |
263 (function TestAnd() { | 288 (function TestAnd() { |
264 IntegerTypedArrayConstructors.forEach(function(t) { | 289 IntegerTypedArrayConstructors.forEach(function(t) { |
265 var sab = new SharedArrayBuffer(10 * t.constr.BYTES_PER_ELEMENT); | 290 var sab = new SharedArrayBuffer(10 * t.constr.BYTES_PER_ELEMENT); |
266 var sta = new t.constr(sab); | 291 var sta = new t.constr(sab); |
267 var name = Object.prototype.toString.call(sta); | 292 var name = Object.prototype.toString.call(sta); |
268 for (var i = 0; i < 10; ++i) { | 293 for (var i = 0; i < 10; ++i) { |
269 sta[i] = 0x3f; | 294 sta[i] = 0x3f; |
270 assertEquals(0x3f, Atomics.and(sta, i, 0x30), name); | 295 assertEquals(0x3f, Atomics.and(sta, i, 0x30), name); |
271 assertEquals(0x30, sta[i], name); | 296 assertEquals(0x30, sta[i], name); |
272 | 297 |
273 assertEquals(0x30, Atomics.and(sta, i, 0x20), name); | 298 assertEquals(0x30, Atomics.and(sta, i, 0x20), name); |
274 assertEquals(0x20, sta[i], name); | 299 assertEquals(0x20, sta[i], name); |
275 } | 300 } |
301 | |
302 // Non-numbers should be coerced to numbers. | |
303 [false, true, undefined].forEach(function(v) { | |
304 sta[0] = 0x20; | |
305 assertEquals(0x20, Atomics.and(sta, 0, v), name); | |
306 assertEquals(0x20 & (v|0), sta[0]); | |
307 }); | |
276 }); | 308 }); |
277 })(); | 309 })(); |
278 | 310 |
279 (function TestOr() { | 311 (function TestOr() { |
280 IntegerTypedArrayConstructors.forEach(function(t) { | 312 IntegerTypedArrayConstructors.forEach(function(t) { |
281 var sab = new SharedArrayBuffer(10 * t.constr.BYTES_PER_ELEMENT); | 313 var sab = new SharedArrayBuffer(10 * t.constr.BYTES_PER_ELEMENT); |
282 var sta = new t.constr(sab); | 314 var sta = new t.constr(sab); |
283 var name = Object.prototype.toString.call(sta); | 315 var name = Object.prototype.toString.call(sta); |
284 for (var i = 0; i < 10; ++i) { | 316 for (var i = 0; i < 10; ++i) { |
285 sta[i] = 0x30; | 317 sta[i] = 0x30; |
286 assertEquals(0x30, Atomics.or(sta, i, 0x1c), name); | 318 assertEquals(0x30, Atomics.or(sta, i, 0x1c), name); |
287 assertEquals(0x3c, sta[i], name); | 319 assertEquals(0x3c, sta[i], name); |
288 | 320 |
289 assertEquals(0x3c, Atomics.or(sta, i, 0x09), name); | 321 assertEquals(0x3c, Atomics.or(sta, i, 0x09), name); |
290 assertEquals(0x3d, sta[i], name); | 322 assertEquals(0x3d, sta[i], name); |
291 } | 323 } |
324 | |
325 // Non-numbers should be coerced to numbers. | |
326 [false, true, undefined].forEach(function(v) { | |
327 sta[0] = 0x3d; | |
328 assertEquals(0x3d, Atomics.or(sta, 0, v), name); | |
329 assertEquals(0x3d | (v|0), sta[0]); | |
330 }); | |
292 }); | 331 }); |
293 })(); | 332 })(); |
294 | 333 |
295 (function TestXor() { | 334 (function TestXor() { |
296 IntegerTypedArrayConstructors.forEach(function(t) { | 335 IntegerTypedArrayConstructors.forEach(function(t) { |
297 var sab = new SharedArrayBuffer(10 * t.constr.BYTES_PER_ELEMENT); | 336 var sab = new SharedArrayBuffer(10 * t.constr.BYTES_PER_ELEMENT); |
298 var sta = new t.constr(sab); | 337 var sta = new t.constr(sab); |
299 var name = Object.prototype.toString.call(sta); | 338 var name = Object.prototype.toString.call(sta); |
300 for (var i = 0; i < 10; ++i) { | 339 for (var i = 0; i < 10; ++i) { |
301 sta[i] = 0x30; | 340 sta[i] = 0x30; |
302 assertEquals(0x30, Atomics.xor(sta, i, 0x1c), name); | 341 assertEquals(0x30, Atomics.xor(sta, i, 0x1c), name); |
303 assertEquals(0x2c, sta[i], name); | 342 assertEquals(0x2c, sta[i], name); |
304 | 343 |
305 assertEquals(0x2c, Atomics.xor(sta, i, 0x09), name); | 344 assertEquals(0x2c, Atomics.xor(sta, i, 0x09), name); |
306 assertEquals(0x25, sta[i], name); | 345 assertEquals(0x25, sta[i], name); |
307 } | 346 } |
347 | |
348 // Non-numbers should be coerced to numbers. | |
349 [false, true, undefined].forEach(function(v) { | |
350 sta[0] = 0x25; | |
351 assertEquals(0x25, Atomics.xor(sta, 0, v), name); | |
352 assertEquals(0x25 ^ (v|0), sta[0]); | |
353 }); | |
308 }); | 354 }); |
309 })(); | 355 })(); |
310 | 356 |
311 (function TestExchange() { | 357 (function TestExchange() { |
312 IntegerTypedArrayConstructors.forEach(function(t) { | 358 IntegerTypedArrayConstructors.forEach(function(t) { |
313 var sab = new SharedArrayBuffer(10 * t.constr.BYTES_PER_ELEMENT); | 359 var sab = new SharedArrayBuffer(10 * t.constr.BYTES_PER_ELEMENT); |
314 var sta = new t.constr(sab); | 360 var sta = new t.constr(sab); |
315 var name = Object.prototype.toString.call(sta); | 361 var name = Object.prototype.toString.call(sta); |
316 for (var i = 0; i < 10; ++i) { | 362 for (var i = 0; i < 10; ++i) { |
317 sta[i] = 0x30; | 363 sta[i] = 0x30; |
318 assertEquals(0x30, Atomics.exchange(sta, i, 0x1c), name); | 364 assertEquals(0x30, Atomics.exchange(sta, i, 0x1c), name); |
319 assertEquals(0x1c, sta[i], name); | 365 assertEquals(0x1c, sta[i], name); |
320 | 366 |
321 assertEquals(0x1c, Atomics.exchange(sta, i, 0x09), name); | 367 assertEquals(0x1c, Atomics.exchange(sta, i, 0x09), name); |
322 assertEquals(0x09, sta[i], name); | 368 assertEquals(0x09, sta[i], name); |
323 } | 369 } |
370 | |
371 // Non-numbers should be coerced to numbers. | |
372 [false, true, undefined].forEach(function(v) { | |
373 sta[0] = 0x09; | |
374 assertEquals(0x09, Atomics.exchange(sta, 0, v), name); | |
375 assertEquals(v|0, sta[0]); | |
376 }); | |
324 }); | 377 }); |
325 })(); | 378 })(); |
326 | 379 |
327 (function TestIsLockFree() { | 380 (function TestIsLockFree() { |
328 // For all platforms we support, 1, 2 and 4 bytes should be lock-free. | 381 // For all platforms we support, 1, 2 and 4 bytes should be lock-free. |
329 assertEquals(true, Atomics.isLockFree(1)); | 382 assertEquals(true, Atomics.isLockFree(1)); |
330 assertEquals(true, Atomics.isLockFree(2)); | 383 assertEquals(true, Atomics.isLockFree(2)); |
331 assertEquals(true, Atomics.isLockFree(4)); | 384 assertEquals(true, Atomics.isLockFree(4)); |
332 | 385 |
333 // Sizes that aren't equal to a typedarray BYTES_PER_ELEMENT always return | 386 // Sizes that aren't equal to a typedarray BYTES_PER_ELEMENT always return |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
435 // Exchange | 488 // Exchange |
436 sta[0] = val = 0x12; | 489 sta[0] = val = 0x12; |
437 operand = 0x22 + offset; | 490 operand = 0x22 + offset; |
438 valWrapped = t.toRange(operand); | 491 valWrapped = t.toRange(operand); |
439 assertEquals(val, Atomics.exchange(sta, 0, operand), name); | 492 assertEquals(val, Atomics.exchange(sta, 0, operand), name); |
440 assertEquals(valWrapped, sta[0], name); | 493 assertEquals(valWrapped, sta[0], name); |
441 } | 494 } |
442 | 495 |
443 }); | 496 }); |
444 })(); | 497 })(); |
OLD | NEW |