1 /*
2 * Copyright (c) 2015, 2025, 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 // -- This file was mechanically generated: Do not edit! -- //
25
26 /*
27 * @test
28 * @enablePreview
29 * @modules java.base/jdk.internal.vm.annotation
30 * @run junit/othervm -Diters=10 -Xint VarHandleTestAccessValue
31 *
32 * @comment Set CompileThresholdScaling to 0.1 so that the warmup loop sets to 2000 iterations
33 * to hit compilation thresholds
34 *
35 * @run junit/othervm -Diters=2000 -XX:CompileThresholdScaling=0.1 -XX:TieredStopAtLevel=1 VarHandleTestAccessValue
36 * @run junit/othervm -Diters=2000 -XX:CompileThresholdScaling=0.1 VarHandleTestAccessValue
37 * @run junit/othervm -Diters=2000 -XX:CompileThresholdScaling=0.1 -XX:-TieredCompilation VarHandleTestAccessValue
38 */
39
40 import java.lang.invoke.MethodHandles;
41 import java.lang.invoke.VarHandle;
42 import java.util.ArrayList;
43 import java.util.Arrays;
44 import java.util.List;
45
46 import static org.junit.jupiter.api.Assertions.*;
47 import org.junit.jupiter.api.BeforeAll;
48 import org.junit.jupiter.api.Test;
49 import org.junit.jupiter.api.TestInstance;
50 import org.junit.jupiter.params.ParameterizedTest;
51 import org.junit.jupiter.params.provider.MethodSource;
52
53 @TestInstance(TestInstance.Lifecycle.PER_CLASS)
54 public class VarHandleTestAccessValue extends VarHandleBaseTest {
55 static final Value static_final_v = Value.getInstance(10);
56
57 static Value static_v;
58
59 final Value final_v = Value.getInstance(10);
60
61 Value v;
62
63 static final Value static_final_v2 = Value.getInstance(10);
64
65 static Value static_v2;
66
67 final Value final_v2 = Value.getInstance(10);
68
69 Value v2;
70
71 VarHandle vhFinalField;
72
73 VarHandle vhField;
74
75 VarHandle vhStaticField;
76
77 VarHandle vhStaticFinalField;
78
79 VarHandle vhArray;
80
81 VarHandle vhArrayObject;
82
83 VarHandle[] allocate(boolean same) {
84 List<VarHandle> vhs = new ArrayList<>();
85
86 String postfix = same ? "" : "2";
87 VarHandle vh;
88 try {
89 vh = MethodHandles.lookup().findVarHandle(
90 VarHandleTestAccessValue.class, "final_v" + postfix, Value.class);
91 vhs.add(vh);
92
93 vh = MethodHandles.lookup().findVarHandle(
94 VarHandleTestAccessValue.class, "v" + postfix, Value.class);
95 vhs.add(vh);
96
97 vh = MethodHandles.lookup().findStaticVarHandle(
98 VarHandleTestAccessValue.class, "static_final_v" + postfix, Value.class);
99 vhs.add(vh);
100
101 vh = MethodHandles.lookup().findStaticVarHandle(
102 VarHandleTestAccessValue.class, "static_v" + postfix, Value.class);
103 vhs.add(vh);
104
105 if (same) {
106 vh = MethodHandles.arrayElementVarHandle(Value[].class);
107 }
108 else {
109 vh = MethodHandles.arrayElementVarHandle(String[].class);
110 }
111 vhs.add(vh);
112 } catch (Exception e) {
113 throw new InternalError(e);
114 }
115 return vhs.toArray(new VarHandle[0]);
116 }
117
118 @BeforeAll
119 public void setup() throws Exception {
120 vhFinalField = MethodHandles.lookup().findVarHandle(
121 VarHandleTestAccessValue.class, "final_v", Value.class);
122
123 vhField = MethodHandles.lookup().findVarHandle(
124 VarHandleTestAccessValue.class, "v", Value.class);
125
126 vhStaticFinalField = MethodHandles.lookup().findStaticVarHandle(
127 VarHandleTestAccessValue.class, "static_final_v", Value.class);
128
129 vhStaticField = MethodHandles.lookup().findStaticVarHandle(
130 VarHandleTestAccessValue.class, "static_v", Value.class);
131
132 vhArray = MethodHandles.arrayElementVarHandle(Value[].class);
133 vhArrayObject = MethodHandles.arrayElementVarHandle(Object[].class);
134 }
135
136 public Object[][] varHandlesProvider() throws Exception {
137 List<VarHandle> vhs = new ArrayList<>();
138 vhs.add(vhField);
139 vhs.add(vhStaticField);
140 vhs.add(vhArray);
141
142 return vhs.stream().map(tc -> new Object[]{tc}).toArray(Object[][]::new);
143 }
144
145 @Test
146 public void testEquals() {
147 VarHandle[] vhs1 = allocate(true);
148 VarHandle[] vhs2 = allocate(true);
149
150 for (int i = 0; i < vhs1.length; i++) {
151 for (int j = 0; j < vhs1.length; j++) {
152 if (i != j) {
153 assertNotEquals(vhs1[i], vhs1[j]);
154 assertNotEquals(vhs1[i], vhs2[j]);
155 }
156 }
157 }
158
159 VarHandle[] vhs3 = allocate(false);
160 for (int i = 0; i < vhs1.length; i++) {
161 assertNotEquals(vhs1[i], vhs3[i]);
162 }
163 }
164
165 @ParameterizedTest
166 @MethodSource("varHandlesProvider")
167 public void testIsAccessModeSupported(VarHandle vh) {
168 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET));
169 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET));
170 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_VOLATILE));
171 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET_VOLATILE));
172 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_ACQUIRE));
173 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET_RELEASE));
174 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_OPAQUE));
175 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET_OPAQUE));
176
177 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_SET));
178 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE));
179 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_ACQUIRE));
180 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_RELEASE));
181 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_PLAIN));
182 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET));
183 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE));
184 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE));
185 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET));
186 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET_ACQUIRE));
187 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET_RELEASE));
188
189 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD));
190 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD_ACQUIRE));
191 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD_RELEASE));
192
193 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_OR));
194 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_OR_ACQUIRE));
195 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_OR_RELEASE));
196 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_AND));
197 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_AND_ACQUIRE));
198 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_AND_RELEASE));
199 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_XOR));
200 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_XOR_ACQUIRE));
201 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_XOR_RELEASE));
202 }
203
204 public Object[][] typesProvider() throws Exception {
205 List<Object[]> types = new ArrayList<>();
206 types.add(new Object[] {vhField, Arrays.asList(VarHandleTestAccessValue.class)});
207 types.add(new Object[] {vhStaticField, Arrays.asList()});
208 types.add(new Object[] {vhArray, Arrays.asList(Value[].class, int.class)});
209
210 return types.stream().toArray(Object[][]::new);
211 }
212
213 @ParameterizedTest
214 @MethodSource("typesProvider")
215 public void testTypes(VarHandle vh, List<Class<?>> pts) {
216 assertEquals(Value.class, vh.varType());
217
218 assertEquals(pts, vh.coordinateTypes());
219
220 testTypes(vh);
221 }
222
223 @Test
224 public void testLookupInstanceToStatic() {
225 checkIAE("Lookup of static final field to instance final field", () -> {
226 MethodHandles.lookup().findStaticVarHandle(
227 VarHandleTestAccessValue.class, "final_v", Value.class);
228 });
229
230 checkIAE("Lookup of static field to instance field", () -> {
231 MethodHandles.lookup().findStaticVarHandle(
232 VarHandleTestAccessValue.class, "v", Value.class);
233 });
234 }
235
236 @Test
237 public void testLookupStaticToInstance() {
238 checkIAE("Lookup of instance final field to static final field", () -> {
239 MethodHandles.lookup().findVarHandle(
240 VarHandleTestAccessValue.class, "static_final_v", Value.class);
241 });
242
243 checkIAE("Lookup of instance field to static field", () -> {
244 vhStaticField = MethodHandles.lookup().findVarHandle(
245 VarHandleTestAccessValue.class, "static_v", Value.class);
246 });
247 }
248
249 public Object[][] accessTestCaseProvider() throws Exception {
250 List<AccessTestCase<?>> cases = new ArrayList<>();
251
252 cases.add(new VarHandleAccessTestCase("Instance final field",
253 vhFinalField, vh -> testInstanceFinalField(this, vh)));
254 cases.add(new VarHandleAccessTestCase("Instance final field unsupported",
255 vhFinalField, vh -> testInstanceFinalFieldUnsupported(this, vh),
256 false));
257
258 cases.add(new VarHandleAccessTestCase("Static final field",
259 vhStaticFinalField, VarHandleTestAccessValue::testStaticFinalField));
260 cases.add(new VarHandleAccessTestCase("Static final field unsupported",
261 vhStaticFinalField, VarHandleTestAccessValue::testStaticFinalFieldUnsupported,
262 false));
263
264 cases.add(new VarHandleAccessTestCase("Instance field",
265 vhField, vh -> testInstanceField(this, vh)));
266 cases.add(new VarHandleAccessTestCase("Instance field unsupported",
267 vhField, vh -> testInstanceFieldUnsupported(this, vh),
268 false));
269
270 cases.add(new VarHandleAccessTestCase("Static field",
271 vhStaticField, VarHandleTestAccessValue::testStaticField));
272 cases.add(new VarHandleAccessTestCase("Static field unsupported",
273 vhStaticField, VarHandleTestAccessValue::testStaticFieldUnsupported,
274 false));
275
276 cases.add(new VarHandleAccessTestCase("Array",
277 vhArray, VarHandleTestAccessValue::testArray));
278 cases.add(new VarHandleAccessTestCase("Array Object[]",
279 vhArrayObject, VarHandleTestAccessValue::testArray));
280 cases.add(new VarHandleAccessTestCase("Array unsupported",
281 vhArray, VarHandleTestAccessValue::testArrayUnsupported,
282 false));
283 cases.add(new VarHandleAccessTestCase("Array index out of bounds",
284 vhArray, VarHandleTestAccessValue::testArrayIndexOutOfBounds,
285 false));
286 cases.add(new VarHandleAccessTestCase("Array store exception",
287 vhArrayObject, VarHandleTestAccessValue::testArrayStoreException,
288 false));
289 // Work around issue with jtreg summary reporting which truncates
290 // the String result of Object.toString to 30 characters, hence
291 // the first dummy argument
292 return cases.stream().map(tc -> new Object[]{tc.toString(), tc}).toArray(Object[][]::new);
293 }
294
295 @ParameterizedTest
296 @MethodSource("accessTestCaseProvider")
297 public <T> void testAccess(String desc, AccessTestCase<T> atc) throws Throwable {
298 T t = atc.get();
299 int iters = atc.requiresLoop() ? ITERS : 1;
300 for (int c = 0; c < iters; c++) {
301 atc.testAccess(t);
302 }
303 }
304
305 static void testInstanceFinalField(VarHandleTestAccessValue recv, VarHandle vh) {
306 // Plain
307 {
308 Value x = (Value) vh.get(recv);
309 assertEquals(Value.getInstance(10), x, "get Value value");
310 }
311
312
313 // Volatile
314 {
315 Value x = (Value) vh.getVolatile(recv);
316 assertEquals(Value.getInstance(10), x, "getVolatile Value value");
317 }
318
319 // Lazy
320 {
321 Value x = (Value) vh.getAcquire(recv);
322 assertEquals(Value.getInstance(10), x, "getRelease Value value");
323 }
324
325 // Opaque
326 {
327 Value x = (Value) vh.getOpaque(recv);
328 assertEquals(Value.getInstance(10), x, "getOpaque Value value");
329 }
330 }
331
332 static void testInstanceFinalFieldUnsupported(VarHandleTestAccessValue recv, VarHandle vh) {
333 checkUOE(() -> {
334 vh.set(recv, Value.getInstance(20));
335 });
336
337 checkUOE(() -> {
338 vh.setVolatile(recv, Value.getInstance(20));
339 });
340
341 checkUOE(() -> {
342 vh.setRelease(recv, Value.getInstance(20));
343 });
344
345 checkUOE(() -> {
346 vh.setOpaque(recv, Value.getInstance(20));
347 });
348
349
350 checkUOE(() -> {
351 Value o = (Value) vh.getAndAdd(recv, Value.getInstance(10));
352 });
353
354 checkUOE(() -> {
355 Value o = (Value) vh.getAndAddAcquire(recv, Value.getInstance(10));
356 });
357
358 checkUOE(() -> {
359 Value o = (Value) vh.getAndAddRelease(recv, Value.getInstance(10));
360 });
361
362 checkUOE(() -> {
363 Value o = (Value) vh.getAndBitwiseOr(recv, Value.getInstance(10));
364 });
365
366 checkUOE(() -> {
367 Value o = (Value) vh.getAndBitwiseOrAcquire(recv, Value.getInstance(10));
368 });
369
370 checkUOE(() -> {
371 Value o = (Value) vh.getAndBitwiseOrRelease(recv, Value.getInstance(10));
372 });
373
374 checkUOE(() -> {
375 Value o = (Value) vh.getAndBitwiseAnd(recv, Value.getInstance(10));
376 });
377
378 checkUOE(() -> {
379 Value o = (Value) vh.getAndBitwiseAndAcquire(recv, Value.getInstance(10));
380 });
381
382 checkUOE(() -> {
383 Value o = (Value) vh.getAndBitwiseAndRelease(recv, Value.getInstance(10));
384 });
385
386 checkUOE(() -> {
387 Value o = (Value) vh.getAndBitwiseXor(recv, Value.getInstance(10));
388 });
389
390 checkUOE(() -> {
391 Value o = (Value) vh.getAndBitwiseXorAcquire(recv, Value.getInstance(10));
392 });
393
394 checkUOE(() -> {
395 Value o = (Value) vh.getAndBitwiseXorRelease(recv, Value.getInstance(10));
396 });
397 }
398
399
400 static void testStaticFinalField(VarHandle vh) {
401 // Plain
402 {
403 Value x = (Value) vh.get();
404 assertEquals(Value.getInstance(10), x, "get Value value");
405 }
406
407
408 // Volatile
409 {
410 Value x = (Value) vh.getVolatile();
411 assertEquals(Value.getInstance(10), x, "getVolatile Value value");
412 }
413
414 // Lazy
415 {
416 Value x = (Value) vh.getAcquire();
417 assertEquals(Value.getInstance(10), x, "getRelease Value value");
418 }
419
420 // Opaque
421 {
422 Value x = (Value) vh.getOpaque();
423 assertEquals(Value.getInstance(10), x, "getOpaque Value value");
424 }
425 }
426
427 static void testStaticFinalFieldUnsupported(VarHandle vh) {
428 checkUOE(() -> {
429 vh.set(Value.getInstance(20));
430 });
431
432 checkUOE(() -> {
433 vh.setVolatile(Value.getInstance(20));
434 });
435
436 checkUOE(() -> {
437 vh.setRelease(Value.getInstance(20));
438 });
439
440 checkUOE(() -> {
441 vh.setOpaque(Value.getInstance(20));
442 });
443
444
445 checkUOE(() -> {
446 Value o = (Value) vh.getAndAdd(Value.getInstance(10));
447 });
448
449 checkUOE(() -> {
450 Value o = (Value) vh.getAndAddAcquire(Value.getInstance(10));
451 });
452
453 checkUOE(() -> {
454 Value o = (Value) vh.getAndAddRelease(Value.getInstance(10));
455 });
456
457 checkUOE(() -> {
458 Value o = (Value) vh.getAndBitwiseOr(Value.getInstance(10));
459 });
460
461 checkUOE(() -> {
462 Value o = (Value) vh.getAndBitwiseOrAcquire(Value.getInstance(10));
463 });
464
465 checkUOE(() -> {
466 Value o = (Value) vh.getAndBitwiseOrRelease(Value.getInstance(10));
467 });
468
469 checkUOE(() -> {
470 Value o = (Value) vh.getAndBitwiseAnd(Value.getInstance(10));
471 });
472
473 checkUOE(() -> {
474 Value o = (Value) vh.getAndBitwiseAndAcquire(Value.getInstance(10));
475 });
476
477 checkUOE(() -> {
478 Value o = (Value) vh.getAndBitwiseAndRelease(Value.getInstance(10));
479 });
480
481 checkUOE(() -> {
482 Value o = (Value) vh.getAndBitwiseXor(Value.getInstance(10));
483 });
484
485 checkUOE(() -> {
486 Value o = (Value) vh.getAndBitwiseXorAcquire(Value.getInstance(10));
487 });
488
489 checkUOE(() -> {
490 Value o = (Value) vh.getAndBitwiseXorRelease(Value.getInstance(10));
491 });
492 }
493
494
495 static void testInstanceField(VarHandleTestAccessValue recv, VarHandle vh) {
496 // Plain
497 {
498 vh.set(recv, Value.getInstance(10));
499 Value x = (Value) vh.get(recv);
500 assertEquals(Value.getInstance(10), x, "set Value value");
501 }
502
503
504 // Volatile
505 {
506 vh.setVolatile(recv, Value.getInstance(20));
507 Value x = (Value) vh.getVolatile(recv);
508 assertEquals(Value.getInstance(20), x, "setVolatile Value value");
509 }
510
511 // Lazy
512 {
513 vh.setRelease(recv, Value.getInstance(10));
514 Value x = (Value) vh.getAcquire(recv);
515 assertEquals(Value.getInstance(10), x, "setRelease Value value");
516 }
517
518 // Opaque
519 {
520 vh.setOpaque(recv, Value.getInstance(20));
521 Value x = (Value) vh.getOpaque(recv);
522 assertEquals(Value.getInstance(20), x, "setOpaque Value value");
523 }
524
525 vh.set(recv, Value.getInstance(10));
526
527 // Compare
528 {
529 boolean r = vh.compareAndSet(recv, Value.getInstance(10), Value.getInstance(20));
530 assertEquals(r, true, "success compareAndSet Value");
531 Value x = (Value) vh.get(recv);
532 assertEquals(Value.getInstance(20), x, "success compareAndSet Value value");
533 }
534
535 {
536 boolean r = vh.compareAndSet(recv, Value.getInstance(10), Value.getInstance(30));
537 assertEquals(r, false, "failing compareAndSet Value");
538 Value x = (Value) vh.get(recv);
539 assertEquals(Value.getInstance(20), x, "failing compareAndSet Value value");
540 }
541
542 {
543 Value r = (Value) vh.compareAndExchange(recv, Value.getInstance(20), Value.getInstance(10));
544 assertEquals(r, Value.getInstance(20), "success compareAndExchange Value");
545 Value x = (Value) vh.get(recv);
546 assertEquals(Value.getInstance(10), x, "success compareAndExchange Value value");
547 }
548
549 {
550 Value r = (Value) vh.compareAndExchange(recv, Value.getInstance(20), Value.getInstance(30));
551 assertEquals(r, Value.getInstance(10), "failing compareAndExchange Value");
552 Value x = (Value) vh.get(recv);
553 assertEquals(Value.getInstance(10), x, "failing compareAndExchange Value value");
554 }
555
556 {
557 Value r = (Value) vh.compareAndExchangeAcquire(recv, Value.getInstance(10), Value.getInstance(20));
558 assertEquals(r, Value.getInstance(10), "success compareAndExchangeAcquire Value");
559 Value x = (Value) vh.get(recv);
560 assertEquals(Value.getInstance(20), x, "success compareAndExchangeAcquire Value value");
561 }
562
563 {
564 Value r = (Value) vh.compareAndExchangeAcquire(recv, Value.getInstance(10), Value.getInstance(30));
565 assertEquals(r, Value.getInstance(20), "failing compareAndExchangeAcquire Value");
566 Value x = (Value) vh.get(recv);
567 assertEquals(Value.getInstance(20), x, "failing compareAndExchangeAcquire Value value");
568 }
569
570 {
571 Value r = (Value) vh.compareAndExchangeRelease(recv, Value.getInstance(20), Value.getInstance(10));
572 assertEquals(r, Value.getInstance(20), "success compareAndExchangeRelease Value");
573 Value x = (Value) vh.get(recv);
574 assertEquals(Value.getInstance(10), x, "success compareAndExchangeRelease Value value");
575 }
576
577 {
578 Value r = (Value) vh.compareAndExchangeRelease(recv, Value.getInstance(20), Value.getInstance(30));
579 assertEquals(r, Value.getInstance(10), "failing compareAndExchangeRelease Value");
580 Value x = (Value) vh.get(recv);
581 assertEquals(Value.getInstance(10), x, "failing compareAndExchangeRelease Value value");
582 }
583
584 {
585 boolean success = false;
586 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
587 success = vh.weakCompareAndSetPlain(recv, Value.getInstance(10), Value.getInstance(20));
588 if (!success) weakDelay();
589 }
590 assertEquals(success, true, "success weakCompareAndSetPlain Value");
591 Value x = (Value) vh.get(recv);
592 assertEquals(Value.getInstance(20), x, "success weakCompareAndSetPlain Value value");
593 }
594
595 {
596 boolean success = vh.weakCompareAndSetPlain(recv, Value.getInstance(10), Value.getInstance(30));
597 assertEquals(success, false, "failing weakCompareAndSetPlain Value");
598 Value x = (Value) vh.get(recv);
599 assertEquals(Value.getInstance(20), x, "failing weakCompareAndSetPlain Value value");
600 }
601
602 {
603 boolean success = false;
604 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
605 success = vh.weakCompareAndSetAcquire(recv, Value.getInstance(20), Value.getInstance(10));
606 if (!success) weakDelay();
607 }
608 assertEquals(success, true, "success weakCompareAndSetAcquire Value");
609 Value x = (Value) vh.get(recv);
610 assertEquals(Value.getInstance(10), x, "success weakCompareAndSetAcquire Value");
611 }
612
613 {
614 boolean success = vh.weakCompareAndSetAcquire(recv, Value.getInstance(20), Value.getInstance(30));
615 assertEquals(success, false, "failing weakCompareAndSetAcquire Value");
616 Value x = (Value) vh.get(recv);
617 assertEquals(Value.getInstance(10), x, "failing weakCompareAndSetAcquire Value value");
618 }
619
620 {
621 boolean success = false;
622 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
623 success = vh.weakCompareAndSetRelease(recv, Value.getInstance(10), Value.getInstance(20));
624 if (!success) weakDelay();
625 }
626 assertEquals(success, true, "success weakCompareAndSetRelease Value");
627 Value x = (Value) vh.get(recv);
628 assertEquals(Value.getInstance(20), x, "success weakCompareAndSetRelease Value");
629 }
630
631 {
632 boolean success = vh.weakCompareAndSetRelease(recv, Value.getInstance(10), Value.getInstance(30));
633 assertEquals(success, false, "failing weakCompareAndSetRelease Value");
634 Value x = (Value) vh.get(recv);
635 assertEquals(Value.getInstance(20), x, "failing weakCompareAndSetRelease Value value");
636 }
637
638 {
639 boolean success = false;
640 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
641 success = vh.weakCompareAndSet(recv, Value.getInstance(20), Value.getInstance(10));
642 if (!success) weakDelay();
643 }
644 assertEquals(success, true, "success weakCompareAndSet Value");
645 Value x = (Value) vh.get(recv);
646 assertEquals(Value.getInstance(10), x, "success weakCompareAndSet Value value");
647 }
648
649 {
650 boolean success = vh.weakCompareAndSet(recv, Value.getInstance(20), Value.getInstance(30));
651 assertEquals(success, false, "failing weakCompareAndSet Value");
652 Value x = (Value) vh.get(recv);
653 assertEquals(Value.getInstance(10), x, "failing weakCompareAndSet Value value");
654 }
655
656 // Compare set and get
657 {
658 vh.set(recv, Value.getInstance(10));
659
660 Value o = (Value) vh.getAndSet(recv, Value.getInstance(20));
661 assertEquals(Value.getInstance(10), o, "getAndSet Value");
662 Value x = (Value) vh.get(recv);
663 assertEquals(Value.getInstance(20), x, "getAndSet Value value");
664 }
665
666 {
667 vh.set(recv, Value.getInstance(10));
668
669 Value o = (Value) vh.getAndSetAcquire(recv, Value.getInstance(20));
670 assertEquals(Value.getInstance(10), o, "getAndSetAcquire Value");
671 Value x = (Value) vh.get(recv);
672 assertEquals(Value.getInstance(20), x, "getAndSetAcquire Value value");
673 }
674
675 {
676 vh.set(recv, Value.getInstance(10));
677
678 Value o = (Value) vh.getAndSetRelease(recv, Value.getInstance(20));
679 assertEquals(Value.getInstance(10), o, "getAndSetRelease Value");
680 Value x = (Value) vh.get(recv);
681 assertEquals(Value.getInstance(20), x, "getAndSetRelease Value value");
682 }
683
684
685 }
686
687 static void testInstanceFieldUnsupported(VarHandleTestAccessValue recv, VarHandle vh) {
688
689 checkUOE(() -> {
690 Value o = (Value) vh.getAndAdd(recv, Value.getInstance(10));
691 });
692
693 checkUOE(() -> {
694 Value o = (Value) vh.getAndAddAcquire(recv, Value.getInstance(10));
695 });
696
697 checkUOE(() -> {
698 Value o = (Value) vh.getAndAddRelease(recv, Value.getInstance(10));
699 });
700
701 checkUOE(() -> {
702 Value o = (Value) vh.getAndBitwiseOr(recv, Value.getInstance(10));
703 });
704
705 checkUOE(() -> {
706 Value o = (Value) vh.getAndBitwiseOrAcquire(recv, Value.getInstance(10));
707 });
708
709 checkUOE(() -> {
710 Value o = (Value) vh.getAndBitwiseOrRelease(recv, Value.getInstance(10));
711 });
712
713 checkUOE(() -> {
714 Value o = (Value) vh.getAndBitwiseAnd(recv, Value.getInstance(10));
715 });
716
717 checkUOE(() -> {
718 Value o = (Value) vh.getAndBitwiseAndAcquire(recv, Value.getInstance(10));
719 });
720
721 checkUOE(() -> {
722 Value o = (Value) vh.getAndBitwiseAndRelease(recv, Value.getInstance(10));
723 });
724
725 checkUOE(() -> {
726 Value o = (Value) vh.getAndBitwiseXor(recv, Value.getInstance(10));
727 });
728
729 checkUOE(() -> {
730 Value o = (Value) vh.getAndBitwiseXorAcquire(recv, Value.getInstance(10));
731 });
732
733 checkUOE(() -> {
734 Value o = (Value) vh.getAndBitwiseXorRelease(recv, Value.getInstance(10));
735 });
736 }
737
738
739 static void testStaticField(VarHandle vh) {
740 // Plain
741 {
742 vh.set(Value.getInstance(10));
743 Value x = (Value) vh.get();
744 assertEquals(Value.getInstance(10), x, "set Value value");
745 }
746
747
748 // Volatile
749 {
750 vh.setVolatile(Value.getInstance(20));
751 Value x = (Value) vh.getVolatile();
752 assertEquals(Value.getInstance(20), x, "setVolatile Value value");
753 }
754
755 // Lazy
756 {
757 vh.setRelease(Value.getInstance(10));
758 Value x = (Value) vh.getAcquire();
759 assertEquals(Value.getInstance(10), x, "setRelease Value value");
760 }
761
762 // Opaque
763 {
764 vh.setOpaque(Value.getInstance(20));
765 Value x = (Value) vh.getOpaque();
766 assertEquals(Value.getInstance(20), x, "setOpaque Value value");
767 }
768
769 vh.set(Value.getInstance(10));
770
771 // Compare
772 {
773 boolean r = vh.compareAndSet(Value.getInstance(10), Value.getInstance(20));
774 assertEquals(r, true, "success compareAndSet Value");
775 Value x = (Value) vh.get();
776 assertEquals(Value.getInstance(20), x, "success compareAndSet Value value");
777 }
778
779 {
780 boolean r = vh.compareAndSet(Value.getInstance(10), Value.getInstance(30));
781 assertEquals(r, false, "failing compareAndSet Value");
782 Value x = (Value) vh.get();
783 assertEquals(Value.getInstance(20), x, "failing compareAndSet Value value");
784 }
785
786 {
787 Value r = (Value) vh.compareAndExchange(Value.getInstance(20), Value.getInstance(10));
788 assertEquals(r, Value.getInstance(20), "success compareAndExchange Value");
789 Value x = (Value) vh.get();
790 assertEquals(Value.getInstance(10), x, "success compareAndExchange Value value");
791 }
792
793 {
794 Value r = (Value) vh.compareAndExchange(Value.getInstance(20), Value.getInstance(30));
795 assertEquals(r, Value.getInstance(10), "failing compareAndExchange Value");
796 Value x = (Value) vh.get();
797 assertEquals(Value.getInstance(10), x, "failing compareAndExchange Value value");
798 }
799
800 {
801 Value r = (Value) vh.compareAndExchangeAcquire(Value.getInstance(10), Value.getInstance(20));
802 assertEquals(r, Value.getInstance(10), "success compareAndExchangeAcquire Value");
803 Value x = (Value) vh.get();
804 assertEquals(Value.getInstance(20), x, "success compareAndExchangeAcquire Value value");
805 }
806
807 {
808 Value r = (Value) vh.compareAndExchangeAcquire(Value.getInstance(10), Value.getInstance(30));
809 assertEquals(r, Value.getInstance(20), "failing compareAndExchangeAcquire Value");
810 Value x = (Value) vh.get();
811 assertEquals(Value.getInstance(20), x, "failing compareAndExchangeAcquire Value value");
812 }
813
814 {
815 Value r = (Value) vh.compareAndExchangeRelease(Value.getInstance(20), Value.getInstance(10));
816 assertEquals(r, Value.getInstance(20), "success compareAndExchangeRelease Value");
817 Value x = (Value) vh.get();
818 assertEquals(Value.getInstance(10), x, "success compareAndExchangeRelease Value value");
819 }
820
821 {
822 Value r = (Value) vh.compareAndExchangeRelease(Value.getInstance(20), Value.getInstance(30));
823 assertEquals(r, Value.getInstance(10), "failing compareAndExchangeRelease Value");
824 Value x = (Value) vh.get();
825 assertEquals(Value.getInstance(10), x, "failing compareAndExchangeRelease Value value");
826 }
827
828 {
829 boolean success = false;
830 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
831 success = vh.weakCompareAndSetPlain(Value.getInstance(10), Value.getInstance(20));
832 if (!success) weakDelay();
833 }
834 assertEquals(success, true, "success weakCompareAndSetPlain Value");
835 Value x = (Value) vh.get();
836 assertEquals(Value.getInstance(20), x, "success weakCompareAndSetPlain Value value");
837 }
838
839 {
840 boolean success = vh.weakCompareAndSetPlain(Value.getInstance(10), Value.getInstance(30));
841 assertEquals(success, false, "failing weakCompareAndSetPlain Value");
842 Value x = (Value) vh.get();
843 assertEquals(Value.getInstance(20), x, "failing weakCompareAndSetPlain Value value");
844 }
845
846 {
847 boolean success = false;
848 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
849 success = vh.weakCompareAndSetAcquire(Value.getInstance(20), Value.getInstance(10));
850 if (!success) weakDelay();
851 }
852 assertEquals(success, true, "success weakCompareAndSetAcquire Value");
853 Value x = (Value) vh.get();
854 assertEquals(Value.getInstance(10), x, "success weakCompareAndSetAcquire Value");
855 }
856
857 {
858 boolean success = vh.weakCompareAndSetAcquire(Value.getInstance(20), Value.getInstance(30));
859 assertEquals(success, false, "failing weakCompareAndSetAcquire Value");
860 Value x = (Value) vh.get();
861 assertEquals(Value.getInstance(10), x, "failing weakCompareAndSetAcquire Value value");
862 }
863
864 {
865 boolean success = false;
866 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
867 success = vh.weakCompareAndSetRelease(Value.getInstance(10), Value.getInstance(20));
868 if (!success) weakDelay();
869 }
870 assertEquals(success, true, "success weakCompareAndSetRelease Value");
871 Value x = (Value) vh.get();
872 assertEquals(Value.getInstance(20), x, "success weakCompareAndSetRelease Value");
873 }
874
875 {
876 boolean success = vh.weakCompareAndSetRelease(Value.getInstance(10), Value.getInstance(30));
877 assertEquals(success, false, "failing weakCompareAndSetRelease Value");
878 Value x = (Value) vh.get();
879 assertEquals(Value.getInstance(20), x, "failing weakCompareAndSetRelease Value value");
880 }
881
882 {
883 boolean success = false;
884 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
885 success = vh.weakCompareAndSet(Value.getInstance(20), Value.getInstance(10));
886 if (!success) weakDelay();
887 }
888 assertEquals(success, true, "success weakCompareAndSet Value");
889 Value x = (Value) vh.get();
890 assertEquals(Value.getInstance(10), x, "success weakCompareAndSet Value");
891 }
892
893 {
894 boolean success = vh.weakCompareAndSet(Value.getInstance(20), Value.getInstance(30));
895 assertEquals(success, false, "failing weakCompareAndSet Value");
896 Value x = (Value) vh.get();
897 assertEquals(Value.getInstance(10), x, "failing weakCompareAndSet Value value");
898 }
899
900 // Compare set and get
901 {
902 vh.set(Value.getInstance(10));
903
904 Value o = (Value) vh.getAndSet(Value.getInstance(20));
905 assertEquals(Value.getInstance(10), o, "getAndSet Value");
906 Value x = (Value) vh.get();
907 assertEquals(Value.getInstance(20), x, "getAndSet Value value");
908 }
909
910 {
911 vh.set(Value.getInstance(10));
912
913 Value o = (Value) vh.getAndSetAcquire(Value.getInstance(20));
914 assertEquals(Value.getInstance(10), o, "getAndSetAcquire Value");
915 Value x = (Value) vh.get();
916 assertEquals(Value.getInstance(20), x, "getAndSetAcquire Value value");
917 }
918
919 {
920 vh.set(Value.getInstance(10));
921
922 Value o = (Value) vh.getAndSetRelease(Value.getInstance(20));
923 assertEquals(Value.getInstance(10), o, "getAndSetRelease Value");
924 Value x = (Value) vh.get();
925 assertEquals(Value.getInstance(20), x, "getAndSetRelease Value value");
926 }
927
928
929 }
930
931 static void testStaticFieldUnsupported(VarHandle vh) {
932
933 checkUOE(() -> {
934 Value o = (Value) vh.getAndAdd(Value.getInstance(10));
935 });
936
937 checkUOE(() -> {
938 Value o = (Value) vh.getAndAddAcquire(Value.getInstance(10));
939 });
940
941 checkUOE(() -> {
942 Value o = (Value) vh.getAndAddRelease(Value.getInstance(10));
943 });
944
945 checkUOE(() -> {
946 Value o = (Value) vh.getAndBitwiseOr(Value.getInstance(10));
947 });
948
949 checkUOE(() -> {
950 Value o = (Value) vh.getAndBitwiseOrAcquire(Value.getInstance(10));
951 });
952
953 checkUOE(() -> {
954 Value o = (Value) vh.getAndBitwiseOrRelease(Value.getInstance(10));
955 });
956
957 checkUOE(() -> {
958 Value o = (Value) vh.getAndBitwiseAnd(Value.getInstance(10));
959 });
960
961 checkUOE(() -> {
962 Value o = (Value) vh.getAndBitwiseAndAcquire(Value.getInstance(10));
963 });
964
965 checkUOE(() -> {
966 Value o = (Value) vh.getAndBitwiseAndRelease(Value.getInstance(10));
967 });
968
969 checkUOE(() -> {
970 Value o = (Value) vh.getAndBitwiseXor(Value.getInstance(10));
971 });
972
973 checkUOE(() -> {
974 Value o = (Value) vh.getAndBitwiseXorAcquire(Value.getInstance(10));
975 });
976
977 checkUOE(() -> {
978 Value o = (Value) vh.getAndBitwiseXorRelease(Value.getInstance(10));
979 });
980 }
981
982
983 static void testArray(VarHandle vh) {
984 Value[] array = new Value[10];
985
986 for (int i = 0; i < array.length; i++) {
987 // Plain
988 {
989 vh.set(array, i, Value.getInstance(10));
990 Value x = (Value) vh.get(array, i);
991 assertEquals(Value.getInstance(10), x, "get Value value");
992 }
993
994
995 // Volatile
996 {
997 vh.setVolatile(array, i, Value.getInstance(20));
998 Value x = (Value) vh.getVolatile(array, i);
999 assertEquals(Value.getInstance(20), x, "setVolatile Value value");
1000 }
1001
1002 // Lazy
1003 {
1004 vh.setRelease(array, i, Value.getInstance(10));
1005 Value x = (Value) vh.getAcquire(array, i);
1006 assertEquals(Value.getInstance(10), x, "setRelease Value value");
1007 }
1008
1009 // Opaque
1010 {
1011 vh.setOpaque(array, i, Value.getInstance(20));
1012 Value x = (Value) vh.getOpaque(array, i);
1013 assertEquals(Value.getInstance(20), x, "setOpaque Value value");
1014 }
1015
1016 vh.set(array, i, Value.getInstance(10));
1017
1018 // Compare
1019 {
1020 boolean r = vh.compareAndSet(array, i, Value.getInstance(10), Value.getInstance(20));
1021 assertEquals(r, true, "success compareAndSet Value");
1022 Value x = (Value) vh.get(array, i);
1023 assertEquals(Value.getInstance(20), x, "success compareAndSet Value value");
1024 }
1025
1026 {
1027 boolean r = vh.compareAndSet(array, i, Value.getInstance(10), Value.getInstance(30));
1028 assertEquals(r, false, "failing compareAndSet Value");
1029 Value x = (Value) vh.get(array, i);
1030 assertEquals(Value.getInstance(20), x, "failing compareAndSet Value value");
1031 }
1032
1033 {
1034 Value r = (Value) vh.compareAndExchange(array, i, Value.getInstance(20), Value.getInstance(10));
1035 assertEquals(r, Value.getInstance(20), "success compareAndExchange Value");
1036 Value x = (Value) vh.get(array, i);
1037 assertEquals(Value.getInstance(10), x, "success compareAndExchange Value value");
1038 }
1039
1040 {
1041 Value r = (Value) vh.compareAndExchange(array, i, Value.getInstance(20), Value.getInstance(30));
1042 assertEquals(r, Value.getInstance(10), "failing compareAndExchange Value");
1043 Value x = (Value) vh.get(array, i);
1044 assertEquals(Value.getInstance(10), x, "failing compareAndExchange Value value");
1045 }
1046
1047 {
1048 Value r = (Value) vh.compareAndExchangeAcquire(array, i, Value.getInstance(10), Value.getInstance(20));
1049 assertEquals(r, Value.getInstance(10), "success compareAndExchangeAcquire Value");
1050 Value x = (Value) vh.get(array, i);
1051 assertEquals(Value.getInstance(20), x, "success compareAndExchangeAcquire Value value");
1052 }
1053
1054 {
1055 Value r = (Value) vh.compareAndExchangeAcquire(array, i, Value.getInstance(10), Value.getInstance(30));
1056 assertEquals(r, Value.getInstance(20), "failing compareAndExchangeAcquire Value");
1057 Value x = (Value) vh.get(array, i);
1058 assertEquals(Value.getInstance(20), x, "failing compareAndExchangeAcquire Value value");
1059 }
1060
1061 {
1062 Value r = (Value) vh.compareAndExchangeRelease(array, i, Value.getInstance(20), Value.getInstance(10));
1063 assertEquals(r, Value.getInstance(20), "success compareAndExchangeRelease Value");
1064 Value x = (Value) vh.get(array, i);
1065 assertEquals(Value.getInstance(10), x, "success compareAndExchangeRelease Value value");
1066 }
1067
1068 {
1069 Value r = (Value) vh.compareAndExchangeRelease(array, i, Value.getInstance(20), Value.getInstance(30));
1070 assertEquals(r, Value.getInstance(10), "failing compareAndExchangeRelease Value");
1071 Value x = (Value) vh.get(array, i);
1072 assertEquals(Value.getInstance(10), x, "failing compareAndExchangeRelease Value value");
1073 }
1074
1075 {
1076 boolean success = false;
1077 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
1078 success = vh.weakCompareAndSetPlain(array, i, Value.getInstance(10), Value.getInstance(20));
1079 if (!success) weakDelay();
1080 }
1081 assertEquals(success, true, "success weakCompareAndSetPlain Value");
1082 Value x = (Value) vh.get(array, i);
1083 assertEquals(Value.getInstance(20), x, "success weakCompareAndSetPlain Value value");
1084 }
1085
1086 {
1087 boolean success = vh.weakCompareAndSetPlain(array, i, Value.getInstance(10), Value.getInstance(30));
1088 assertEquals(success, false, "failing weakCompareAndSetPlain Value");
1089 Value x = (Value) vh.get(array, i);
1090 assertEquals(Value.getInstance(20), x, "failing weakCompareAndSetPlain Value value");
1091 }
1092
1093 {
1094 boolean success = false;
1095 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
1096 success = vh.weakCompareAndSetAcquire(array, i, Value.getInstance(20), Value.getInstance(10));
1097 if (!success) weakDelay();
1098 }
1099 assertEquals(success, true, "success weakCompareAndSetAcquire Value");
1100 Value x = (Value) vh.get(array, i);
1101 assertEquals(Value.getInstance(10), x, "success weakCompareAndSetAcquire Value");
1102 }
1103
1104 {
1105 boolean success = vh.weakCompareAndSetAcquire(array, i, Value.getInstance(20), Value.getInstance(30));
1106 assertEquals(success, false, "failing weakCompareAndSetAcquire Value");
1107 Value x = (Value) vh.get(array, i);
1108 assertEquals(Value.getInstance(10), x, "failing weakCompareAndSetAcquire Value value");
1109 }
1110
1111 {
1112 boolean success = false;
1113 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
1114 success = vh.weakCompareAndSetRelease(array, i, Value.getInstance(10), Value.getInstance(20));
1115 if (!success) weakDelay();
1116 }
1117 assertEquals(success, true, "success weakCompareAndSetRelease Value");
1118 Value x = (Value) vh.get(array, i);
1119 assertEquals(Value.getInstance(20), x, "success weakCompareAndSetRelease Value");
1120 }
1121
1122 {
1123 boolean success = vh.weakCompareAndSetRelease(array, i, Value.getInstance(10), Value.getInstance(30));
1124 assertEquals(success, false, "failing weakCompareAndSetRelease Value");
1125 Value x = (Value) vh.get(array, i);
1126 assertEquals(Value.getInstance(20), x, "failing weakCompareAndSetRelease Value value");
1127 }
1128
1129 {
1130 boolean success = false;
1131 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
1132 success = vh.weakCompareAndSet(array, i, Value.getInstance(20), Value.getInstance(10));
1133 if (!success) weakDelay();
1134 }
1135 assertEquals(success, true, "success weakCompareAndSet Value");
1136 Value x = (Value) vh.get(array, i);
1137 assertEquals(Value.getInstance(10), x, "success weakCompareAndSet Value");
1138 }
1139
1140 {
1141 boolean success = vh.weakCompareAndSet(array, i, Value.getInstance(20), Value.getInstance(30));
1142 assertEquals(success, false, "failing weakCompareAndSet Value");
1143 Value x = (Value) vh.get(array, i);
1144 assertEquals(Value.getInstance(10), x, "failing weakCompareAndSet Value value");
1145 }
1146
1147 // Compare set and get
1148 {
1149 vh.set(array, i, Value.getInstance(10));
1150
1151 Value o = (Value) vh.getAndSet(array, i, Value.getInstance(20));
1152 assertEquals(Value.getInstance(10), o, "getAndSet Value");
1153 Value x = (Value) vh.get(array, i);
1154 assertEquals(Value.getInstance(20), x, "getAndSet Value value");
1155 }
1156
1157 {
1158 vh.set(array, i, Value.getInstance(10));
1159
1160 Value o = (Value) vh.getAndSetAcquire(array, i, Value.getInstance(20));
1161 assertEquals(Value.getInstance(10), o, "getAndSetAcquire Value");
1162 Value x = (Value) vh.get(array, i);
1163 assertEquals(Value.getInstance(20), x, "getAndSetAcquire Value value");
1164 }
1165
1166 {
1167 vh.set(array, i, Value.getInstance(10));
1168
1169 Value o = (Value) vh.getAndSetRelease(array, i, Value.getInstance(20));
1170 assertEquals(Value.getInstance(10), o, "getAndSetRelease Value");
1171 Value x = (Value) vh.get(array, i);
1172 assertEquals(Value.getInstance(20), x, "getAndSetRelease Value value");
1173 }
1174
1175
1176 }
1177 }
1178
1179 static void testArrayUnsupported(VarHandle vh) {
1180 Value[] array = new Value[10];
1181
1182 int i = 0;
1183
1184 checkUOE(() -> {
1185 Value o = (Value) vh.getAndAdd(array, i, Value.getInstance(10));
1186 });
1187
1188 checkUOE(() -> {
1189 Value o = (Value) vh.getAndAddAcquire(array, i, Value.getInstance(10));
1190 });
1191
1192 checkUOE(() -> {
1193 Value o = (Value) vh.getAndAddRelease(array, i, Value.getInstance(10));
1194 });
1195
1196 checkUOE(() -> {
1197 Value o = (Value) vh.getAndBitwiseOr(array, i, Value.getInstance(10));
1198 });
1199
1200 checkUOE(() -> {
1201 Value o = (Value) vh.getAndBitwiseOrAcquire(array, i, Value.getInstance(10));
1202 });
1203
1204 checkUOE(() -> {
1205 Value o = (Value) vh.getAndBitwiseOrRelease(array, i, Value.getInstance(10));
1206 });
1207
1208 checkUOE(() -> {
1209 Value o = (Value) vh.getAndBitwiseAnd(array, i, Value.getInstance(10));
1210 });
1211
1212 checkUOE(() -> {
1213 Value o = (Value) vh.getAndBitwiseAndAcquire(array, i, Value.getInstance(10));
1214 });
1215
1216 checkUOE(() -> {
1217 Value o = (Value) vh.getAndBitwiseAndRelease(array, i, Value.getInstance(10));
1218 });
1219
1220 checkUOE(() -> {
1221 Value o = (Value) vh.getAndBitwiseXor(array, i, Value.getInstance(10));
1222 });
1223
1224 checkUOE(() -> {
1225 Value o = (Value) vh.getAndBitwiseXorAcquire(array, i, Value.getInstance(10));
1226 });
1227
1228 checkUOE(() -> {
1229 Value o = (Value) vh.getAndBitwiseXorRelease(array, i, Value.getInstance(10));
1230 });
1231 }
1232
1233 static void testArrayIndexOutOfBounds(VarHandle vh) throws Throwable {
1234 Value[] array = new Value[10];
1235
1236 for (int i : new int[]{-1, Integer.MIN_VALUE, 10, 11, Integer.MAX_VALUE}) {
1237 final int ci = i;
1238
1239 checkAIOOBE(() -> {
1240 Value x = (Value) vh.get(array, ci);
1241 });
1242
1243 checkAIOOBE(() -> {
1244 vh.set(array, ci, Value.getInstance(10));
1245 });
1246
1247 checkAIOOBE(() -> {
1248 Value x = (Value) vh.getVolatile(array, ci);
1249 });
1250
1251 checkAIOOBE(() -> {
1252 vh.setVolatile(array, ci, Value.getInstance(10));
1253 });
1254
1255 checkAIOOBE(() -> {
1256 Value x = (Value) vh.getAcquire(array, ci);
1257 });
1258
1259 checkAIOOBE(() -> {
1260 vh.setRelease(array, ci, Value.getInstance(10));
1261 });
1262
1263 checkAIOOBE(() -> {
1264 Value x = (Value) vh.getOpaque(array, ci);
1265 });
1266
1267 checkAIOOBE(() -> {
1268 vh.setOpaque(array, ci, Value.getInstance(10));
1269 });
1270
1271 checkAIOOBE(() -> {
1272 boolean r = vh.compareAndSet(array, ci, Value.getInstance(10), Value.getInstance(20));
1273 });
1274
1275 checkAIOOBE(() -> {
1276 Value r = (Value) vh.compareAndExchange(array, ci, Value.getInstance(20), Value.getInstance(10));
1277 });
1278
1279 checkAIOOBE(() -> {
1280 Value r = (Value) vh.compareAndExchangeAcquire(array, ci, Value.getInstance(20), Value.getInstance(10));
1281 });
1282
1283 checkAIOOBE(() -> {
1284 Value r = (Value) vh.compareAndExchangeRelease(array, ci, Value.getInstance(20), Value.getInstance(10));
1285 });
1286
1287 checkAIOOBE(() -> {
1288 boolean r = vh.weakCompareAndSetPlain(array, ci, Value.getInstance(10), Value.getInstance(20));
1289 });
1290
1291 checkAIOOBE(() -> {
1292 boolean r = vh.weakCompareAndSet(array, ci, Value.getInstance(10), Value.getInstance(20));
1293 });
1294
1295 checkAIOOBE(() -> {
1296 boolean r = vh.weakCompareAndSetAcquire(array, ci, Value.getInstance(10), Value.getInstance(20));
1297 });
1298
1299 checkAIOOBE(() -> {
1300 boolean r = vh.weakCompareAndSetRelease(array, ci, Value.getInstance(10), Value.getInstance(20));
1301 });
1302
1303 checkAIOOBE(() -> {
1304 Value o = (Value) vh.getAndSet(array, ci, Value.getInstance(10));
1305 });
1306
1307 checkAIOOBE(() -> {
1308 Value o = (Value) vh.getAndSetAcquire(array, ci, Value.getInstance(10));
1309 });
1310
1311 checkAIOOBE(() -> {
1312 Value o = (Value) vh.getAndSetRelease(array, ci, Value.getInstance(10));
1313 });
1314
1315
1316 }
1317 }
1318
1319 static void testArrayStoreException(VarHandle vh) throws Throwable {
1320 Object[] array = new Value[10];
1321 Arrays.fill(array, Value.getInstance(10));
1322 Object value = new Object();
1323
1324 // Set
1325 checkASE(() -> {
1326 vh.set(array, 0, value);
1327 });
1328
1329 // SetVolatile
1330 checkASE(() -> {
1331 vh.setVolatile(array, 0, value);
1332 });
1333
1334 // SetOpaque
1335 checkASE(() -> {
1336 vh.setOpaque(array, 0, value);
1337 });
1338
1339 // SetRelease
1340 checkASE(() -> {
1341 vh.setRelease(array, 0, value);
1342 });
1343
1344 // CompareAndSet
1345 checkASE(() -> { // receiver reference class
1346 boolean r = vh.compareAndSet(array, 0, Value.getInstance(10), value);
1347 });
1348
1349 // WeakCompareAndSet
1350 checkASE(() -> { // receiver reference class
1351 boolean r = vh.weakCompareAndSetPlain(array, 0, Value.getInstance(10), value);
1352 });
1353
1354 // WeakCompareAndSetVolatile
1355 checkASE(() -> { // receiver reference class
1356 boolean r = vh.weakCompareAndSet(array, 0, Value.getInstance(10), value);
1357 });
1358
1359 // WeakCompareAndSetAcquire
1360 checkASE(() -> { // receiver reference class
1361 boolean r = vh.weakCompareAndSetAcquire(array, 0, Value.getInstance(10), value);
1362 });
1363
1364 // WeakCompareAndSetRelease
1365 checkASE(() -> { // receiver reference class
1366 boolean r = vh.weakCompareAndSetRelease(array, 0, Value.getInstance(10), value);
1367 });
1368
1369 // CompareAndExchange
1370 checkASE(() -> { // receiver reference class
1371 Value x = (Value) vh.compareAndExchange(array, 0, Value.getInstance(10), value);
1372 });
1373
1374 // CompareAndExchangeAcquire
1375 checkASE(() -> { // receiver reference class
1376 Value x = (Value) vh.compareAndExchangeAcquire(array, 0, Value.getInstance(10), value);
1377 });
1378
1379 // CompareAndExchangeRelease
1380 checkASE(() -> { // receiver reference class
1381 Value x = (Value) vh.compareAndExchangeRelease(array, 0, Value.getInstance(10), value);
1382 });
1383
1384 // GetAndSet
1385 checkASE(() -> { // receiver reference class
1386 Value x = (Value) vh.getAndSet(array, 0, value);
1387 });
1388
1389 // GetAndSetAcquire
1390 checkASE(() -> { // receiver reference class
1391 Value x = (Value) vh.getAndSetAcquire(array, 0, value);
1392 });
1393
1394 // GetAndSetRelease
1395 checkASE(() -> { // receiver reference class
1396 Value x = (Value) vh.getAndSetRelease(array, 0, value);
1397 });
1398 }
1399 }
1400