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