| 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 |