Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(302)

Side by Side Diff: test/mjsunit/harmony/atomics.js

Issue 1232243002: In Atomics API, convert operands to numbers before calling runtime. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/harmony-atomics.js ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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 })();
OLDNEW
« no previous file with comments | « src/harmony-atomics.js ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698