blob: e0564d5d0027e858a9cad2fc028777e668d6a0b3 [file] [log] [blame]
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001/*
2 * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24/*
25 * @test
26 * @run testng/othervm -Diters=10 -Xint VarHandleTestAccessDouble
27 * @run testng/othervm -Diters=20000 -XX:TieredStopAtLevel=1 VarHandleTestAccessDouble
28 * @run testng/othervm -Diters=20000 VarHandleTestAccessDouble
29 * @run testng/othervm -Diters=20000 -XX:-TieredCompilation VarHandleTestAccessDouble
30 */
31
32import org.testng.annotations.BeforeClass;
33import org.testng.annotations.DataProvider;
34import org.testng.annotations.Test;
35
36import java.lang.invoke.MethodHandles;
37import java.lang.invoke.VarHandle;
38import java.util.ArrayList;
39import java.util.Arrays;
40import java.util.List;
41
42import static org.testng.Assert.*;
43
44public class VarHandleTestAccessDouble extends VarHandleBaseTest {
45 static final double static_final_v = 1.0d;
46
47 static double static_v;
48
49 final double final_v = 1.0d;
50
51 double v;
52
53 VarHandle vhFinalField;
54
55 VarHandle vhField;
56
57 VarHandle vhStaticField;
58
59 VarHandle vhStaticFinalField;
60
61 VarHandle vhArray;
62
63 @BeforeClass
64 public void setup() throws Exception {
65 vhFinalField = MethodHandles.lookup().findVarHandle(
66 VarHandleTestAccessDouble.class, "final_v", double.class);
67
68 vhField = MethodHandles.lookup().findVarHandle(
69 VarHandleTestAccessDouble.class, "v", double.class);
70
71 vhStaticFinalField = MethodHandles.lookup().findStaticVarHandle(
72 VarHandleTestAccessDouble.class, "static_final_v", double.class);
73
74 vhStaticField = MethodHandles.lookup().findStaticVarHandle(
75 VarHandleTestAccessDouble.class, "static_v", double.class);
76
77 vhArray = MethodHandles.arrayElementVarHandle(double[].class);
78 }
79
80
81 @DataProvider
82 public Object[][] varHandlesProvider() throws Exception {
83 List<VarHandle> vhs = new ArrayList<>();
84 vhs.add(vhField);
85 vhs.add(vhStaticField);
86 vhs.add(vhArray);
87
88 return vhs.stream().map(tc -> new Object[]{tc}).toArray(Object[][]::new);
89 }
90
91 @Test(dataProvider = "varHandlesProvider")
92 public void testIsAccessModeSupported(VarHandle vh) {
Paul Sandoza7aff442016-04-13 15:05:48 +020093 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET));
94 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET));
95 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_VOLATILE));
96 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET_VOLATILE));
97 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_ACQUIRE));
98 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET_RELEASE));
99 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_OPAQUE));
100 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET_OPAQUE));
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100101
Paul Sandoz734dbe42016-06-20 17:57:19 +0200102 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_SET));
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200103 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE));
Paul Sandoz734dbe42016-06-20 17:57:19 +0200104 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_ACQUIRE));
105 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_RELEASE));
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700106 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_PLAIN));
Paul Sandoz734dbe42016-06-20 17:57:19 +0200107 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET));
Paul Sandoz734dbe42016-06-20 17:57:19 +0200108 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE));
109 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE));
110 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET));
Paul Sandoz82d48912016-09-01 10:16:57 -0700111 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET_ACQUIRE));
112 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET_RELEASE));
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100113
Paul Sandoz734dbe42016-06-20 17:57:19 +0200114 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD));
Paul Sandoz82d48912016-09-01 10:16:57 -0700115 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD_ACQUIRE));
116 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD_RELEASE));
Paul Sandoz82d48912016-09-01 10:16:57 -0700117
118 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_OR));
119 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_OR_ACQUIRE));
120 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_OR_RELEASE));
121 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_AND));
122 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_AND_ACQUIRE));
123 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_AND_RELEASE));
124 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_XOR));
125 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_XOR_ACQUIRE));
126 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_XOR_RELEASE));
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100127 }
128
129
130 @DataProvider
131 public Object[][] typesProvider() throws Exception {
132 List<Object[]> types = new ArrayList<>();
133 types.add(new Object[] {vhField, Arrays.asList(VarHandleTestAccessDouble.class)});
134 types.add(new Object[] {vhStaticField, Arrays.asList()});
135 types.add(new Object[] {vhArray, Arrays.asList(double[].class, int.class)});
136
137 return types.stream().toArray(Object[][]::new);
138 }
139
140 @Test(dataProvider = "typesProvider")
141 public void testTypes(VarHandle vh, List<Class<?>> pts) {
142 assertEquals(vh.varType(), double.class);
143
144 assertEquals(vh.coordinateTypes(), pts);
145
146 testTypes(vh);
147 }
148
149
150 @Test
151 public void testLookupInstanceToStatic() {
152 checkIAE("Lookup of static final field to instance final field", () -> {
153 MethodHandles.lookup().findStaticVarHandle(
154 VarHandleTestAccessDouble.class, "final_v", double.class);
155 });
156
157 checkIAE("Lookup of static field to instance field", () -> {
158 MethodHandles.lookup().findStaticVarHandle(
159 VarHandleTestAccessDouble.class, "v", double.class);
160 });
161 }
162
163 @Test
164 public void testLookupStaticToInstance() {
165 checkIAE("Lookup of instance final field to static final field", () -> {
166 MethodHandles.lookup().findVarHandle(
167 VarHandleTestAccessDouble.class, "static_final_v", double.class);
168 });
169
170 checkIAE("Lookup of instance field to static field", () -> {
171 vhStaticField = MethodHandles.lookup().findVarHandle(
172 VarHandleTestAccessDouble.class, "static_v", double.class);
173 });
174 }
175
176
177 @DataProvider
178 public Object[][] accessTestCaseProvider() throws Exception {
179 List<AccessTestCase<?>> cases = new ArrayList<>();
180
181 cases.add(new VarHandleAccessTestCase("Instance final field",
182 vhFinalField, vh -> testInstanceFinalField(this, vh)));
183 cases.add(new VarHandleAccessTestCase("Instance final field unsupported",
184 vhFinalField, vh -> testInstanceFinalFieldUnsupported(this, vh),
185 false));
186
187 cases.add(new VarHandleAccessTestCase("Static final field",
188 vhStaticFinalField, VarHandleTestAccessDouble::testStaticFinalField));
189 cases.add(new VarHandleAccessTestCase("Static final field unsupported",
190 vhStaticFinalField, VarHandleTestAccessDouble::testStaticFinalFieldUnsupported,
191 false));
192
193 cases.add(new VarHandleAccessTestCase("Instance field",
194 vhField, vh -> testInstanceField(this, vh)));
195 cases.add(new VarHandleAccessTestCase("Instance field unsupported",
196 vhField, vh -> testInstanceFieldUnsupported(this, vh),
197 false));
198
199 cases.add(new VarHandleAccessTestCase("Static field",
200 vhStaticField, VarHandleTestAccessDouble::testStaticField));
201 cases.add(new VarHandleAccessTestCase("Static field unsupported",
202 vhStaticField, VarHandleTestAccessDouble::testStaticFieldUnsupported,
203 false));
204
205 cases.add(new VarHandleAccessTestCase("Array",
206 vhArray, VarHandleTestAccessDouble::testArray));
207 cases.add(new VarHandleAccessTestCase("Array unsupported",
208 vhArray, VarHandleTestAccessDouble::testArrayUnsupported,
209 false));
210 cases.add(new VarHandleAccessTestCase("Array index out of bounds",
211 vhArray, VarHandleTestAccessDouble::testArrayIndexOutOfBounds,
212 false));
213
214 // Work around issue with jtreg summary reporting which truncates
215 // the String result of Object.toString to 30 characters, hence
216 // the first dummy argument
217 return cases.stream().map(tc -> new Object[]{tc.toString(), tc}).toArray(Object[][]::new);
218 }
219
220 @Test(dataProvider = "accessTestCaseProvider")
221 public <T> void testAccess(String desc, AccessTestCase<T> atc) throws Throwable {
222 T t = atc.get();
223 int iters = atc.requiresLoop() ? ITERS : 1;
224 for (int c = 0; c < iters; c++) {
225 atc.testAccess(t);
226 }
227 }
228
229
230
231
232 static void testInstanceFinalField(VarHandleTestAccessDouble recv, VarHandle vh) {
233 // Plain
234 {
235 double x = (double) vh.get(recv);
236 assertEquals(x, 1.0d, "get double value");
237 }
238
239
240 // Volatile
241 {
242 double x = (double) vh.getVolatile(recv);
243 assertEquals(x, 1.0d, "getVolatile double value");
244 }
245
246 // Lazy
247 {
248 double x = (double) vh.getAcquire(recv);
249 assertEquals(x, 1.0d, "getRelease double value");
250 }
251
252 // Opaque
253 {
254 double x = (double) vh.getOpaque(recv);
255 assertEquals(x, 1.0d, "getOpaque double value");
256 }
257 }
258
259 static void testInstanceFinalFieldUnsupported(VarHandleTestAccessDouble recv, VarHandle vh) {
260 checkUOE(() -> {
261 vh.set(recv, 2.0d);
262 });
263
264 checkUOE(() -> {
265 vh.setVolatile(recv, 2.0d);
266 });
267
268 checkUOE(() -> {
269 vh.setRelease(recv, 2.0d);
270 });
271
272 checkUOE(() -> {
273 vh.setOpaque(recv, 2.0d);
274 });
275
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100276
Paul Sandoz82d48912016-09-01 10:16:57 -0700277
278 checkUOE(() -> {
279 double o = (double) vh.getAndBitwiseOr(recv, 1.0d);
280 });
281
282 checkUOE(() -> {
283 double o = (double) vh.getAndBitwiseOrAcquire(recv, 1.0d);
284 });
285
286 checkUOE(() -> {
287 double o = (double) vh.getAndBitwiseOrRelease(recv, 1.0d);
288 });
289
290 checkUOE(() -> {
291 double o = (double) vh.getAndBitwiseAnd(recv, 1.0d);
292 });
293
294 checkUOE(() -> {
295 double o = (double) vh.getAndBitwiseAndAcquire(recv, 1.0d);
296 });
297
298 checkUOE(() -> {
299 double o = (double) vh.getAndBitwiseAndRelease(recv, 1.0d);
300 });
301
302 checkUOE(() -> {
303 double o = (double) vh.getAndBitwiseXor(recv, 1.0d);
304 });
305
306 checkUOE(() -> {
307 double o = (double) vh.getAndBitwiseXorAcquire(recv, 1.0d);
308 });
309
310 checkUOE(() -> {
311 double o = (double) vh.getAndBitwiseXorRelease(recv, 1.0d);
312 });
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100313 }
314
315
316 static void testStaticFinalField(VarHandle vh) {
317 // Plain
318 {
319 double x = (double) vh.get();
320 assertEquals(x, 1.0d, "get double value");
321 }
322
323
324 // Volatile
325 {
326 double x = (double) vh.getVolatile();
327 assertEquals(x, 1.0d, "getVolatile double value");
328 }
329
330 // Lazy
331 {
332 double x = (double) vh.getAcquire();
333 assertEquals(x, 1.0d, "getRelease double value");
334 }
335
336 // Opaque
337 {
338 double x = (double) vh.getOpaque();
339 assertEquals(x, 1.0d, "getOpaque double value");
340 }
341 }
342
343 static void testStaticFinalFieldUnsupported(VarHandle vh) {
344 checkUOE(() -> {
345 vh.set(2.0d);
346 });
347
348 checkUOE(() -> {
349 vh.setVolatile(2.0d);
350 });
351
352 checkUOE(() -> {
353 vh.setRelease(2.0d);
354 });
355
356 checkUOE(() -> {
357 vh.setOpaque(2.0d);
358 });
359
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100360
Paul Sandoz82d48912016-09-01 10:16:57 -0700361
362 checkUOE(() -> {
363 double o = (double) vh.getAndBitwiseOr(1.0d);
364 });
365
366 checkUOE(() -> {
367 double o = (double) vh.getAndBitwiseOrAcquire(1.0d);
368 });
369
370 checkUOE(() -> {
371 double o = (double) vh.getAndBitwiseOrRelease(1.0d);
372 });
373
374 checkUOE(() -> {
375 double o = (double) vh.getAndBitwiseAnd(1.0d);
376 });
377
378 checkUOE(() -> {
379 double o = (double) vh.getAndBitwiseAndAcquire(1.0d);
380 });
381
382 checkUOE(() -> {
383 double o = (double) vh.getAndBitwiseAndRelease(1.0d);
384 });
385
386 checkUOE(() -> {
387 double o = (double) vh.getAndBitwiseXor(1.0d);
388 });
389
390 checkUOE(() -> {
391 double o = (double) vh.getAndBitwiseXorAcquire(1.0d);
392 });
393
394 checkUOE(() -> {
395 double o = (double) vh.getAndBitwiseXorRelease(1.0d);
396 });
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100397 }
398
399
400 static void testInstanceField(VarHandleTestAccessDouble recv, VarHandle vh) {
401 // Plain
402 {
403 vh.set(recv, 1.0d);
404 double x = (double) vh.get(recv);
405 assertEquals(x, 1.0d, "set double value");
406 }
407
408
409 // Volatile
410 {
411 vh.setVolatile(recv, 2.0d);
412 double x = (double) vh.getVolatile(recv);
413 assertEquals(x, 2.0d, "setVolatile double value");
414 }
415
416 // Lazy
417 {
418 vh.setRelease(recv, 1.0d);
419 double x = (double) vh.getAcquire(recv);
420 assertEquals(x, 1.0d, "setRelease double value");
421 }
422
423 // Opaque
424 {
425 vh.setOpaque(recv, 2.0d);
426 double x = (double) vh.getOpaque(recv);
427 assertEquals(x, 2.0d, "setOpaque double value");
428 }
429
Paul Sandoz734dbe42016-06-20 17:57:19 +0200430 vh.set(recv, 1.0d);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100431
Paul Sandoz734dbe42016-06-20 17:57:19 +0200432 // Compare
433 {
434 boolean r = vh.compareAndSet(recv, 1.0d, 2.0d);
435 assertEquals(r, true, "success compareAndSet double");
436 double x = (double) vh.get(recv);
437 assertEquals(x, 2.0d, "success compareAndSet double value");
438 }
439
440 {
441 boolean r = vh.compareAndSet(recv, 1.0d, 3.0d);
442 assertEquals(r, false, "failing compareAndSet double");
443 double x = (double) vh.get(recv);
444 assertEquals(x, 2.0d, "failing compareAndSet double value");
445 }
446
447 {
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200448 double r = (double) vh.compareAndExchange(recv, 2.0d, 1.0d);
449 assertEquals(r, 2.0d, "success compareAndExchange double");
Paul Sandoz734dbe42016-06-20 17:57:19 +0200450 double x = (double) vh.get(recv);
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200451 assertEquals(x, 1.0d, "success compareAndExchange double value");
Paul Sandoz734dbe42016-06-20 17:57:19 +0200452 }
453
454 {
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200455 double r = (double) vh.compareAndExchange(recv, 2.0d, 3.0d);
456 assertEquals(r, 1.0d, "failing compareAndExchange double");
Paul Sandoz734dbe42016-06-20 17:57:19 +0200457 double x = (double) vh.get(recv);
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200458 assertEquals(x, 1.0d, "failing compareAndExchange double value");
Paul Sandoz734dbe42016-06-20 17:57:19 +0200459 }
460
461 {
462 double r = (double) vh.compareAndExchangeAcquire(recv, 1.0d, 2.0d);
463 assertEquals(r, 1.0d, "success compareAndExchangeAcquire double");
464 double x = (double) vh.get(recv);
465 assertEquals(x, 2.0d, "success compareAndExchangeAcquire double value");
466 }
467
468 {
469 double r = (double) vh.compareAndExchangeAcquire(recv, 1.0d, 3.0d);
470 assertEquals(r, 2.0d, "failing compareAndExchangeAcquire double");
471 double x = (double) vh.get(recv);
472 assertEquals(x, 2.0d, "failing compareAndExchangeAcquire double value");
473 }
474
475 {
476 double r = (double) vh.compareAndExchangeRelease(recv, 2.0d, 1.0d);
477 assertEquals(r, 2.0d, "success compareAndExchangeRelease double");
478 double x = (double) vh.get(recv);
479 assertEquals(x, 1.0d, "success compareAndExchangeRelease double value");
480 }
481
482 {
483 double r = (double) vh.compareAndExchangeRelease(recv, 2.0d, 3.0d);
484 assertEquals(r, 1.0d, "failing compareAndExchangeRelease double");
485 double x = (double) vh.get(recv);
486 assertEquals(x, 1.0d, "failing compareAndExchangeRelease double value");
487 }
488
489 {
490 boolean success = false;
491 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700492 success = vh.weakCompareAndSetPlain(recv, 1.0d, 2.0d);
Paul Sandoz734dbe42016-06-20 17:57:19 +0200493 }
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700494 assertEquals(success, true, "weakCompareAndSetPlain double");
Paul Sandoz734dbe42016-06-20 17:57:19 +0200495 double x = (double) vh.get(recv);
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700496 assertEquals(x, 2.0d, "weakCompareAndSetPlain double value");
Paul Sandoz734dbe42016-06-20 17:57:19 +0200497 }
498
499 {
500 boolean success = false;
501 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
502 success = vh.weakCompareAndSetAcquire(recv, 2.0d, 1.0d);
503 }
504 assertEquals(success, true, "weakCompareAndSetAcquire double");
505 double x = (double) vh.get(recv);
506 assertEquals(x, 1.0d, "weakCompareAndSetAcquire double");
507 }
508
509 {
510 boolean success = false;
511 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
512 success = vh.weakCompareAndSetRelease(recv, 1.0d, 2.0d);
513 }
514 assertEquals(success, true, "weakCompareAndSetRelease double");
515 double x = (double) vh.get(recv);
516 assertEquals(x, 2.0d, "weakCompareAndSetRelease double");
517 }
518
519 {
520 boolean success = false;
521 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700522 success = vh.weakCompareAndSet(recv, 2.0d, 1.0d);
Paul Sandoz734dbe42016-06-20 17:57:19 +0200523 }
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700524 assertEquals(success, true, "weakCompareAndSet double");
Paul Sandoz734dbe42016-06-20 17:57:19 +0200525 double x = (double) vh.get(recv);
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700526 assertEquals(x, 1.0d, "weakCompareAndSet double value");
Paul Sandoz734dbe42016-06-20 17:57:19 +0200527 }
528
529 // Compare set and get
530 {
Paul Sandoz82d48912016-09-01 10:16:57 -0700531 vh.set(recv, 1.0d);
532
Paul Sandoz734dbe42016-06-20 17:57:19 +0200533 double o = (double) vh.getAndSet(recv, 2.0d);
534 assertEquals(o, 1.0d, "getAndSet double");
535 double x = (double) vh.get(recv);
536 assertEquals(x, 2.0d, "getAndSet double value");
537 }
538
Paul Sandoz82d48912016-09-01 10:16:57 -0700539 {
540 vh.set(recv, 1.0d);
541
542 double o = (double) vh.getAndSetAcquire(recv, 2.0d);
543 assertEquals(o, 1.0d, "getAndSetAcquire double");
544 double x = (double) vh.get(recv);
545 assertEquals(x, 2.0d, "getAndSetAcquire double value");
546 }
547
548 {
549 vh.set(recv, 1.0d);
550
551 double o = (double) vh.getAndSetRelease(recv, 2.0d);
552 assertEquals(o, 1.0d, "getAndSetRelease double");
553 double x = (double) vh.get(recv);
554 assertEquals(x, 2.0d, "getAndSetRelease double value");
555 }
Paul Sandoz734dbe42016-06-20 17:57:19 +0200556
557 // get and add, add and get
558 {
Paul Sandoz82d48912016-09-01 10:16:57 -0700559 vh.set(recv, 1.0d);
560
Paul Sandozc073edc2016-09-01 10:17:01 -0700561 double o = (double) vh.getAndAdd(recv, 2.0d);
Paul Sandoz734dbe42016-06-20 17:57:19 +0200562 assertEquals(o, 1.0d, "getAndAdd double");
Paul Sandozc073edc2016-09-01 10:17:01 -0700563 double x = (double) vh.get(recv);
564 assertEquals(x, (double)(1.0d + 2.0d), "getAndAdd double value");
Paul Sandoz734dbe42016-06-20 17:57:19 +0200565 }
Paul Sandoz82d48912016-09-01 10:16:57 -0700566
567 {
568 vh.set(recv, 1.0d);
569
570 double o = (double) vh.getAndAddAcquire(recv, 2.0d);
571 assertEquals(o, 1.0d, "getAndAddAcquire double");
572 double x = (double) vh.get(recv);
573 assertEquals(x, (double)(1.0d + 2.0d), "getAndAddAcquire double value");
574 }
575
576 {
577 vh.set(recv, 1.0d);
578
579 double o = (double) vh.getAndAddRelease(recv, 2.0d);
580 assertEquals(o, 1.0d, "getAndAddReleasedouble");
581 double x = (double) vh.get(recv);
582 assertEquals(x, (double)(1.0d + 2.0d), "getAndAddRelease double value");
583 }
584
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100585 }
586
587 static void testInstanceFieldUnsupported(VarHandleTestAccessDouble recv, VarHandle vh) {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100588
Paul Sandoz82d48912016-09-01 10:16:57 -0700589
590 checkUOE(() -> {
591 double o = (double) vh.getAndBitwiseOr(recv, 1.0d);
592 });
593
594 checkUOE(() -> {
595 double o = (double) vh.getAndBitwiseOrAcquire(recv, 1.0d);
596 });
597
598 checkUOE(() -> {
599 double o = (double) vh.getAndBitwiseOrRelease(recv, 1.0d);
600 });
601
602 checkUOE(() -> {
603 double o = (double) vh.getAndBitwiseAnd(recv, 1.0d);
604 });
605
606 checkUOE(() -> {
607 double o = (double) vh.getAndBitwiseAndAcquire(recv, 1.0d);
608 });
609
610 checkUOE(() -> {
611 double o = (double) vh.getAndBitwiseAndRelease(recv, 1.0d);
612 });
613
614 checkUOE(() -> {
615 double o = (double) vh.getAndBitwiseXor(recv, 1.0d);
616 });
617
618 checkUOE(() -> {
619 double o = (double) vh.getAndBitwiseXorAcquire(recv, 1.0d);
620 });
621
622 checkUOE(() -> {
623 double o = (double) vh.getAndBitwiseXorRelease(recv, 1.0d);
624 });
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100625 }
626
627
628 static void testStaticField(VarHandle vh) {
629 // Plain
630 {
631 vh.set(1.0d);
632 double x = (double) vh.get();
633 assertEquals(x, 1.0d, "set double value");
634 }
635
636
637 // Volatile
638 {
639 vh.setVolatile(2.0d);
640 double x = (double) vh.getVolatile();
641 assertEquals(x, 2.0d, "setVolatile double value");
642 }
643
644 // Lazy
645 {
646 vh.setRelease(1.0d);
647 double x = (double) vh.getAcquire();
648 assertEquals(x, 1.0d, "setRelease double value");
649 }
650
651 // Opaque
652 {
653 vh.setOpaque(2.0d);
654 double x = (double) vh.getOpaque();
655 assertEquals(x, 2.0d, "setOpaque double value");
656 }
657
Paul Sandoz734dbe42016-06-20 17:57:19 +0200658 vh.set(1.0d);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100659
Paul Sandoz734dbe42016-06-20 17:57:19 +0200660 // Compare
661 {
662 boolean r = vh.compareAndSet(1.0d, 2.0d);
663 assertEquals(r, true, "success compareAndSet double");
664 double x = (double) vh.get();
665 assertEquals(x, 2.0d, "success compareAndSet double value");
666 }
667
668 {
669 boolean r = vh.compareAndSet(1.0d, 3.0d);
670 assertEquals(r, false, "failing compareAndSet double");
671 double x = (double) vh.get();
672 assertEquals(x, 2.0d, "failing compareAndSet double value");
673 }
674
675 {
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200676 double r = (double) vh.compareAndExchange(2.0d, 1.0d);
677 assertEquals(r, 2.0d, "success compareAndExchange double");
Paul Sandoz734dbe42016-06-20 17:57:19 +0200678 double x = (double) vh.get();
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200679 assertEquals(x, 1.0d, "success compareAndExchange double value");
Paul Sandoz734dbe42016-06-20 17:57:19 +0200680 }
681
682 {
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200683 double r = (double) vh.compareAndExchange(2.0d, 3.0d);
684 assertEquals(r, 1.0d, "failing compareAndExchange double");
Paul Sandoz734dbe42016-06-20 17:57:19 +0200685 double x = (double) vh.get();
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200686 assertEquals(x, 1.0d, "failing compareAndExchange double value");
Paul Sandoz734dbe42016-06-20 17:57:19 +0200687 }
688
689 {
690 double r = (double) vh.compareAndExchangeAcquire(1.0d, 2.0d);
691 assertEquals(r, 1.0d, "success compareAndExchangeAcquire double");
692 double x = (double) vh.get();
693 assertEquals(x, 2.0d, "success compareAndExchangeAcquire double value");
694 }
695
696 {
697 double r = (double) vh.compareAndExchangeAcquire(1.0d, 3.0d);
698 assertEquals(r, 2.0d, "failing compareAndExchangeAcquire double");
699 double x = (double) vh.get();
700 assertEquals(x, 2.0d, "failing compareAndExchangeAcquire double value");
701 }
702
703 {
704 double r = (double) vh.compareAndExchangeRelease(2.0d, 1.0d);
705 assertEquals(r, 2.0d, "success compareAndExchangeRelease double");
706 double x = (double) vh.get();
707 assertEquals(x, 1.0d, "success compareAndExchangeRelease double value");
708 }
709
710 {
711 double r = (double) vh.compareAndExchangeRelease(2.0d, 3.0d);
712 assertEquals(r, 1.0d, "failing compareAndExchangeRelease double");
713 double x = (double) vh.get();
714 assertEquals(x, 1.0d, "failing compareAndExchangeRelease double value");
715 }
716
717 {
718 boolean success = false;
719 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700720 success = vh.weakCompareAndSetPlain(1.0d, 2.0d);
Paul Sandoz734dbe42016-06-20 17:57:19 +0200721 }
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700722 assertEquals(success, true, "weakCompareAndSetPlain double");
Paul Sandoz734dbe42016-06-20 17:57:19 +0200723 double x = (double) vh.get();
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700724 assertEquals(x, 2.0d, "weakCompareAndSetPlain double value");
Paul Sandoz734dbe42016-06-20 17:57:19 +0200725 }
726
727 {
728 boolean success = false;
729 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
730 success = vh.weakCompareAndSetAcquire(2.0d, 1.0d);
731 }
732 assertEquals(success, true, "weakCompareAndSetAcquire double");
733 double x = (double) vh.get();
734 assertEquals(x, 1.0d, "weakCompareAndSetAcquire double");
735 }
736
737 {
738 boolean success = false;
739 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
740 success = vh.weakCompareAndSetRelease(1.0d, 2.0d);
741 }
742 assertEquals(success, true, "weakCompareAndSetRelease double");
743 double x = (double) vh.get();
744 assertEquals(x, 2.0d, "weakCompareAndSetRelease double");
745 }
746
747 {
748 boolean success = false;
749 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700750 success = vh.weakCompareAndSet(2.0d, 1.0d);
Paul Sandoz734dbe42016-06-20 17:57:19 +0200751 }
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700752 assertEquals(success, true, "weakCompareAndSet double");
Paul Sandoz734dbe42016-06-20 17:57:19 +0200753 double x = (double) vh.get();
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700754 assertEquals(x, 1.0d, "weakCompareAndSet double");
Paul Sandoz734dbe42016-06-20 17:57:19 +0200755 }
756
757 // Compare set and get
758 {
Paul Sandoz82d48912016-09-01 10:16:57 -0700759 vh.set(1.0d);
760
Paul Sandoz734dbe42016-06-20 17:57:19 +0200761 double o = (double) vh.getAndSet(2.0d);
762 assertEquals(o, 1.0d, "getAndSet double");
763 double x = (double) vh.get();
764 assertEquals(x, 2.0d, "getAndSet double value");
765 }
766
Paul Sandoz82d48912016-09-01 10:16:57 -0700767 {
768 vh.set(1.0d);
769
770 double o = (double) vh.getAndSetAcquire(2.0d);
771 assertEquals(o, 1.0d, "getAndSetAcquire double");
772 double x = (double) vh.get();
773 assertEquals(x, 2.0d, "getAndSetAcquire double value");
774 }
775
776 {
777 vh.set(1.0d);
778
779 double o = (double) vh.getAndSetRelease(2.0d);
780 assertEquals(o, 1.0d, "getAndSetRelease double");
781 double x = (double) vh.get();
782 assertEquals(x, 2.0d, "getAndSetRelease double value");
783 }
Paul Sandoz734dbe42016-06-20 17:57:19 +0200784
785 // get and add, add and get
786 {
Paul Sandoz82d48912016-09-01 10:16:57 -0700787 vh.set(1.0d);
788
Paul Sandozc073edc2016-09-01 10:17:01 -0700789 double o = (double) vh.getAndAdd(2.0d);
Paul Sandoz734dbe42016-06-20 17:57:19 +0200790 assertEquals(o, 1.0d, "getAndAdd double");
Paul Sandozc073edc2016-09-01 10:17:01 -0700791 double x = (double) vh.get();
792 assertEquals(x, (double)(1.0d + 2.0d), "getAndAdd double value");
Paul Sandoz734dbe42016-06-20 17:57:19 +0200793 }
Paul Sandoz82d48912016-09-01 10:16:57 -0700794
795 {
796 vh.set(1.0d);
797
798 double o = (double) vh.getAndAddAcquire(2.0d);
799 assertEquals(o, 1.0d, "getAndAddAcquire double");
800 double x = (double) vh.get();
801 assertEquals(x, (double)(1.0d + 2.0d), "getAndAddAcquire double value");
802 }
803
804 {
805 vh.set(1.0d);
806
807 double o = (double) vh.getAndAddRelease(2.0d);
808 assertEquals(o, 1.0d, "getAndAddReleasedouble");
809 double x = (double) vh.get();
810 assertEquals(x, (double)(1.0d + 2.0d), "getAndAddRelease double value");
811 }
812
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100813 }
814
815 static void testStaticFieldUnsupported(VarHandle vh) {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100816
Paul Sandoz82d48912016-09-01 10:16:57 -0700817
818 checkUOE(() -> {
819 double o = (double) vh.getAndBitwiseOr(1.0d);
820 });
821
822 checkUOE(() -> {
823 double o = (double) vh.getAndBitwiseOrAcquire(1.0d);
824 });
825
826 checkUOE(() -> {
827 double o = (double) vh.getAndBitwiseOrRelease(1.0d);
828 });
829
830 checkUOE(() -> {
831 double o = (double) vh.getAndBitwiseAnd(1.0d);
832 });
833
834 checkUOE(() -> {
835 double o = (double) vh.getAndBitwiseAndAcquire(1.0d);
836 });
837
838 checkUOE(() -> {
839 double o = (double) vh.getAndBitwiseAndRelease(1.0d);
840 });
841
842 checkUOE(() -> {
843 double o = (double) vh.getAndBitwiseXor(1.0d);
844 });
845
846 checkUOE(() -> {
847 double o = (double) vh.getAndBitwiseXorAcquire(1.0d);
848 });
849
850 checkUOE(() -> {
851 double o = (double) vh.getAndBitwiseXorRelease(1.0d);
852 });
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100853 }
854
855
856 static void testArray(VarHandle vh) {
857 double[] array = new double[10];
858
859 for (int i = 0; i < array.length; i++) {
860 // Plain
861 {
862 vh.set(array, i, 1.0d);
863 double x = (double) vh.get(array, i);
864 assertEquals(x, 1.0d, "get double value");
865 }
866
867
868 // Volatile
869 {
870 vh.setVolatile(array, i, 2.0d);
871 double x = (double) vh.getVolatile(array, i);
872 assertEquals(x, 2.0d, "setVolatile double value");
873 }
874
875 // Lazy
876 {
877 vh.setRelease(array, i, 1.0d);
878 double x = (double) vh.getAcquire(array, i);
879 assertEquals(x, 1.0d, "setRelease double value");
880 }
881
882 // Opaque
883 {
884 vh.setOpaque(array, i, 2.0d);
885 double x = (double) vh.getOpaque(array, i);
886 assertEquals(x, 2.0d, "setOpaque double value");
887 }
888
Paul Sandoz734dbe42016-06-20 17:57:19 +0200889 vh.set(array, i, 1.0d);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100890
Paul Sandoz734dbe42016-06-20 17:57:19 +0200891 // Compare
892 {
893 boolean r = vh.compareAndSet(array, i, 1.0d, 2.0d);
894 assertEquals(r, true, "success compareAndSet double");
895 double x = (double) vh.get(array, i);
896 assertEquals(x, 2.0d, "success compareAndSet double value");
897 }
898
899 {
900 boolean r = vh.compareAndSet(array, i, 1.0d, 3.0d);
901 assertEquals(r, false, "failing compareAndSet double");
902 double x = (double) vh.get(array, i);
903 assertEquals(x, 2.0d, "failing compareAndSet double value");
904 }
905
906 {
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200907 double r = (double) vh.compareAndExchange(array, i, 2.0d, 1.0d);
908 assertEquals(r, 2.0d, "success compareAndExchange double");
Paul Sandoz734dbe42016-06-20 17:57:19 +0200909 double x = (double) vh.get(array, i);
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200910 assertEquals(x, 1.0d, "success compareAndExchange double value");
Paul Sandoz734dbe42016-06-20 17:57:19 +0200911 }
912
913 {
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200914 double r = (double) vh.compareAndExchange(array, i, 2.0d, 3.0d);
915 assertEquals(r, 1.0d, "failing compareAndExchange double");
Paul Sandoz734dbe42016-06-20 17:57:19 +0200916 double x = (double) vh.get(array, i);
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200917 assertEquals(x, 1.0d, "failing compareAndExchange double value");
Paul Sandoz734dbe42016-06-20 17:57:19 +0200918 }
919
920 {
921 double r = (double) vh.compareAndExchangeAcquire(array, i, 1.0d, 2.0d);
922 assertEquals(r, 1.0d, "success compareAndExchangeAcquire double");
923 double x = (double) vh.get(array, i);
924 assertEquals(x, 2.0d, "success compareAndExchangeAcquire double value");
925 }
926
927 {
928 double r = (double) vh.compareAndExchangeAcquire(array, i, 1.0d, 3.0d);
929 assertEquals(r, 2.0d, "failing compareAndExchangeAcquire double");
930 double x = (double) vh.get(array, i);
931 assertEquals(x, 2.0d, "failing compareAndExchangeAcquire double value");
932 }
933
934 {
935 double r = (double) vh.compareAndExchangeRelease(array, i, 2.0d, 1.0d);
936 assertEquals(r, 2.0d, "success compareAndExchangeRelease double");
937 double x = (double) vh.get(array, i);
938 assertEquals(x, 1.0d, "success compareAndExchangeRelease double value");
939 }
940
941 {
942 double r = (double) vh.compareAndExchangeRelease(array, i, 2.0d, 3.0d);
943 assertEquals(r, 1.0d, "failing compareAndExchangeRelease double");
944 double x = (double) vh.get(array, i);
945 assertEquals(x, 1.0d, "failing compareAndExchangeRelease double value");
946 }
947
948 {
949 boolean success = false;
950 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700951 success = vh.weakCompareAndSetPlain(array, i, 1.0d, 2.0d);
Paul Sandoz734dbe42016-06-20 17:57:19 +0200952 }
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700953 assertEquals(success, true, "weakCompareAndSetPlain double");
Paul Sandoz734dbe42016-06-20 17:57:19 +0200954 double x = (double) vh.get(array, i);
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700955 assertEquals(x, 2.0d, "weakCompareAndSetPlain double value");
Paul Sandoz734dbe42016-06-20 17:57:19 +0200956 }
957
958 {
959 boolean success = false;
960 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
961 success = vh.weakCompareAndSetAcquire(array, i, 2.0d, 1.0d);
962 }
963 assertEquals(success, true, "weakCompareAndSetAcquire double");
964 double x = (double) vh.get(array, i);
965 assertEquals(x, 1.0d, "weakCompareAndSetAcquire double");
966 }
967
968 {
969 boolean success = false;
970 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
971 success = vh.weakCompareAndSetRelease(array, i, 1.0d, 2.0d);
972 }
973 assertEquals(success, true, "weakCompareAndSetRelease double");
974 double x = (double) vh.get(array, i);
975 assertEquals(x, 2.0d, "weakCompareAndSetRelease double");
976 }
977
978 {
979 boolean success = false;
980 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700981 success = vh.weakCompareAndSet(array, i, 2.0d, 1.0d);
Paul Sandoz734dbe42016-06-20 17:57:19 +0200982 }
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700983 assertEquals(success, true, "weakCompareAndSet double");
Paul Sandoz734dbe42016-06-20 17:57:19 +0200984 double x = (double) vh.get(array, i);
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700985 assertEquals(x, 1.0d, "weakCompareAndSet double");
Paul Sandoz734dbe42016-06-20 17:57:19 +0200986 }
987
988 // Compare set and get
989 {
Paul Sandoz82d48912016-09-01 10:16:57 -0700990 vh.set(array, i, 1.0d);
991
Paul Sandoz734dbe42016-06-20 17:57:19 +0200992 double o = (double) vh.getAndSet(array, i, 2.0d);
993 assertEquals(o, 1.0d, "getAndSet double");
994 double x = (double) vh.get(array, i);
995 assertEquals(x, 2.0d, "getAndSet double value");
996 }
997
Paul Sandoz82d48912016-09-01 10:16:57 -0700998 {
999 vh.set(array, i, 1.0d);
1000
1001 double o = (double) vh.getAndSetAcquire(array, i, 2.0d);
1002 assertEquals(o, 1.0d, "getAndSetAcquire double");
1003 double x = (double) vh.get(array, i);
1004 assertEquals(x, 2.0d, "getAndSetAcquire double value");
1005 }
1006
1007 {
1008 vh.set(array, i, 1.0d);
1009
1010 double o = (double) vh.getAndSetRelease(array, i, 2.0d);
1011 assertEquals(o, 1.0d, "getAndSetRelease double");
1012 double x = (double) vh.get(array, i);
1013 assertEquals(x, 2.0d, "getAndSetRelease double value");
1014 }
Paul Sandoz734dbe42016-06-20 17:57:19 +02001015
1016 // get and add, add and get
1017 {
Paul Sandoz82d48912016-09-01 10:16:57 -07001018 vh.set(array, i, 1.0d);
1019
Paul Sandozc073edc2016-09-01 10:17:01 -07001020 double o = (double) vh.getAndAdd(array, i, 2.0d);
Paul Sandoz734dbe42016-06-20 17:57:19 +02001021 assertEquals(o, 1.0d, "getAndAdd double");
Paul Sandozc073edc2016-09-01 10:17:01 -07001022 double x = (double) vh.get(array, i);
1023 assertEquals(x, (double)(1.0d + 2.0d), "getAndAdd double value");
Paul Sandoz734dbe42016-06-20 17:57:19 +02001024 }
Paul Sandoz82d48912016-09-01 10:16:57 -07001025
1026 {
1027 vh.set(array, i, 1.0d);
1028
1029 double o = (double) vh.getAndAddAcquire(array, i, 2.0d);
1030 assertEquals(o, 1.0d, "getAndAddAcquire double");
1031 double x = (double) vh.get(array, i);
1032 assertEquals(x, (double)(1.0d + 2.0d), "getAndAddAcquire double value");
1033 }
1034
1035 {
1036 vh.set(array, i, 1.0d);
1037
1038 double o = (double) vh.getAndAddRelease(array, i, 2.0d);
1039 assertEquals(o, 1.0d, "getAndAddReleasedouble");
1040 double x = (double) vh.get(array, i);
1041 assertEquals(x, (double)(1.0d + 2.0d), "getAndAddRelease double value");
1042 }
1043
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001044 }
1045 }
1046
1047 static void testArrayUnsupported(VarHandle vh) {
1048 double[] array = new double[10];
1049
1050 int i = 0;
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001051
Paul Sandoz82d48912016-09-01 10:16:57 -07001052
1053 checkUOE(() -> {
1054 double o = (double) vh.getAndBitwiseOr(array, i, 1.0d);
1055 });
1056
1057 checkUOE(() -> {
1058 double o = (double) vh.getAndBitwiseOrAcquire(array, i, 1.0d);
1059 });
1060
1061 checkUOE(() -> {
1062 double o = (double) vh.getAndBitwiseOrRelease(array, i, 1.0d);
1063 });
1064
1065 checkUOE(() -> {
1066 double o = (double) vh.getAndBitwiseAnd(array, i, 1.0d);
1067 });
1068
1069 checkUOE(() -> {
1070 double o = (double) vh.getAndBitwiseAndAcquire(array, i, 1.0d);
1071 });
1072
1073 checkUOE(() -> {
1074 double o = (double) vh.getAndBitwiseAndRelease(array, i, 1.0d);
1075 });
1076
1077 checkUOE(() -> {
1078 double o = (double) vh.getAndBitwiseXor(array, i, 1.0d);
1079 });
1080
1081 checkUOE(() -> {
1082 double o = (double) vh.getAndBitwiseXorAcquire(array, i, 1.0d);
1083 });
1084
1085 checkUOE(() -> {
1086 double o = (double) vh.getAndBitwiseXorRelease(array, i, 1.0d);
1087 });
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001088 }
1089
1090 static void testArrayIndexOutOfBounds(VarHandle vh) throws Throwable {
1091 double[] array = new double[10];
1092
1093 for (int i : new int[]{-1, Integer.MIN_VALUE, 10, 11, Integer.MAX_VALUE}) {
1094 final int ci = i;
1095
1096 checkIOOBE(() -> {
1097 double x = (double) vh.get(array, ci);
1098 });
1099
1100 checkIOOBE(() -> {
1101 vh.set(array, ci, 1.0d);
1102 });
1103
1104 checkIOOBE(() -> {
1105 double x = (double) vh.getVolatile(array, ci);
1106 });
1107
1108 checkIOOBE(() -> {
1109 vh.setVolatile(array, ci, 1.0d);
1110 });
1111
1112 checkIOOBE(() -> {
1113 double x = (double) vh.getAcquire(array, ci);
1114 });
1115
1116 checkIOOBE(() -> {
1117 vh.setRelease(array, ci, 1.0d);
1118 });
1119
1120 checkIOOBE(() -> {
1121 double x = (double) vh.getOpaque(array, ci);
1122 });
1123
1124 checkIOOBE(() -> {
1125 vh.setOpaque(array, ci, 1.0d);
1126 });
1127
Paul Sandoz734dbe42016-06-20 17:57:19 +02001128 checkIOOBE(() -> {
1129 boolean r = vh.compareAndSet(array, ci, 1.0d, 2.0d);
1130 });
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001131
Paul Sandoz734dbe42016-06-20 17:57:19 +02001132 checkIOOBE(() -> {
Paul Sandoz3f0273a2016-06-23 13:46:48 +02001133 double r = (double) vh.compareAndExchange(array, ci, 2.0d, 1.0d);
Paul Sandoz734dbe42016-06-20 17:57:19 +02001134 });
1135
1136 checkIOOBE(() -> {
1137 double r = (double) vh.compareAndExchangeAcquire(array, ci, 2.0d, 1.0d);
1138 });
1139
1140 checkIOOBE(() -> {
1141 double r = (double) vh.compareAndExchangeRelease(array, ci, 2.0d, 1.0d);
1142 });
1143
1144 checkIOOBE(() -> {
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -07001145 boolean r = vh.weakCompareAndSetPlain(array, ci, 1.0d, 2.0d);
Paul Sandoz734dbe42016-06-20 17:57:19 +02001146 });
1147
1148 checkIOOBE(() -> {
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -07001149 boolean r = vh.weakCompareAndSet(array, ci, 1.0d, 2.0d);
Paul Sandoz734dbe42016-06-20 17:57:19 +02001150 });
1151
1152 checkIOOBE(() -> {
1153 boolean r = vh.weakCompareAndSetAcquire(array, ci, 1.0d, 2.0d);
1154 });
1155
1156 checkIOOBE(() -> {
1157 boolean r = vh.weakCompareAndSetRelease(array, ci, 1.0d, 2.0d);
1158 });
1159
1160 checkIOOBE(() -> {
1161 double o = (double) vh.getAndSet(array, ci, 1.0d);
1162 });
1163
1164 checkIOOBE(() -> {
Paul Sandoz82d48912016-09-01 10:16:57 -07001165 double o = (double) vh.getAndSetAcquire(array, ci, 1.0d);
Paul Sandoz734dbe42016-06-20 17:57:19 +02001166 });
1167
1168 checkIOOBE(() -> {
Paul Sandoz82d48912016-09-01 10:16:57 -07001169 double o = (double) vh.getAndSetRelease(array, ci, 1.0d);
Paul Sandoz734dbe42016-06-20 17:57:19 +02001170 });
Paul Sandoz82d48912016-09-01 10:16:57 -07001171
1172 checkIOOBE(() -> {
1173 double o = (double) vh.getAndAdd(array, ci, 1.0d);
1174 });
1175
1176 checkIOOBE(() -> {
1177 double o = (double) vh.getAndAddAcquire(array, ci, 1.0d);
1178 });
1179
1180 checkIOOBE(() -> {
1181 double o = (double) vh.getAndAddRelease(array, ci, 1.0d);
1182 });
1183
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001184 }
1185 }
1186}
1187