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