Chromium Code Reviews| 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 |