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  * @comment Set CompileThresholdScaling to 0.1 so that the warmup loop sets to 2000 iterations
  27  *          to hit compilation thresholds
  28  * @run junit/othervm -Diters=2000 -XX:CompileThresholdScaling=0.1 VarHandleTestMethodHandleAccessBoolean
  29  */
  30 
  31 import java.lang.invoke.MethodHandle;
  32 import java.lang.invoke.MethodHandles;
  33 import java.lang.invoke.VarHandle;
  34 import java.util.ArrayList;
  35 import java.util.List;
  36 
  37 import static org.junit.jupiter.api.Assertions.*;
  38 import org.junit.jupiter.api.BeforeAll;
  39 import org.junit.jupiter.api.TestInstance;
  40 import org.junit.jupiter.params.ParameterizedTest;
  41 import org.junit.jupiter.params.provider.MethodSource;
  42 
  43 @TestInstance(TestInstance.Lifecycle.PER_CLASS)
  44 public class VarHandleTestMethodHandleAccessBoolean extends VarHandleBaseTest {
  45     static final boolean static_final_v = true;
  46 
  47     static boolean static_v;
  48 
  49     final boolean final_v = true;
  50 
  51     boolean v;
  52 
  53     VarHandle vhFinalField;
  54 
  55     VarHandle vhField;
  56 
  57     VarHandle vhStaticField;
  58 
  59     VarHandle vhStaticFinalField;
  60 
  61     VarHandle vhArray;
  62 
  63     @BeforeAll
  64     public void setup() throws Exception {
  65         vhFinalField = MethodHandles.lookup().findVarHandle(
  66                 VarHandleTestMethodHandleAccessBoolean.class, "final_v", boolean.class);
  67 
  68         vhField = MethodHandles.lookup().findVarHandle(
  69                 VarHandleTestMethodHandleAccessBoolean.class, "v", boolean.class);
  70 
  71         vhStaticFinalField = MethodHandles.lookup().findStaticVarHandle(
  72             VarHandleTestMethodHandleAccessBoolean.class, "static_final_v", boolean.class);
  73 
  74         vhStaticField = MethodHandles.lookup().findStaticVarHandle(
  75             VarHandleTestMethodHandleAccessBoolean.class, "static_v", boolean.class);
  76 
  77         vhArray = MethodHandles.arrayElementVarHandle(boolean[].class);
  78     }
  79 
  80     public Object[][] accessTestCaseProvider() throws Exception {
  81         List<AccessTestCase<?>> cases = new ArrayList<>();
  82 
  83         for (VarHandleToMethodHandle f : VarHandleToMethodHandle.values()) {
  84             cases.add(new MethodHandleAccessTestCase("Instance field",
  85                                                      vhField, f, hs -> testInstanceField(this, hs)));
  86             cases.add(new MethodHandleAccessTestCase("Instance field unsupported",
  87                                                      vhField, f, hs -> testInstanceFieldUnsupported(this, hs),
  88                                                      false));
  89 
  90             cases.add(new MethodHandleAccessTestCase("Static field",
  91                                                      vhStaticField, f, VarHandleTestMethodHandleAccessBoolean::testStaticField));
  92             cases.add(new MethodHandleAccessTestCase("Static field unsupported",
  93                                                      vhStaticField, f, VarHandleTestMethodHandleAccessBoolean::testStaticFieldUnsupported,
  94                                                      false));
  95 
  96             cases.add(new MethodHandleAccessTestCase("Array",
  97                                                      vhArray, f, VarHandleTestMethodHandleAccessBoolean::testArray));
  98             cases.add(new MethodHandleAccessTestCase("Array unsupported",
  99                                                      vhArray, f, VarHandleTestMethodHandleAccessBoolean::testArrayUnsupported,
 100                                                      false));
 101             cases.add(new MethodHandleAccessTestCase("Array index out of bounds",
 102                                                      vhArray, f, VarHandleTestMethodHandleAccessBoolean::testArrayIndexOutOfBounds,
 103                                                      false));
 104         }
 105 
 106         // Work around issue with jtreg summary reporting which truncates
 107         // the String result of Object.toString to 30 characters, hence
 108         // the first dummy argument
 109         return cases.stream().map(tc -> new Object[]{tc.toString(), tc}).toArray(Object[][]::new);
 110     }
 111 
 112     @ParameterizedTest
 113     @MethodSource("accessTestCaseProvider")
 114     public <T> void testAccess(String desc, AccessTestCase<T> atc) throws Throwable {
 115         T t = atc.get();
 116         int iters = atc.requiresLoop() ? ITERS : 1;
 117         for (int c = 0; c < iters; c++) {
 118             atc.testAccess(t);
 119         }
 120     }
 121 
 122     static void testInstanceField(VarHandleTestMethodHandleAccessBoolean recv, Handles hs) throws Throwable {
 123         // Plain
 124         {
 125             hs.get(TestAccessMode.SET).invokeExact(recv, true);
 126             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
 127             assertEquals(true, x, "set boolean value");
 128         }
 129 
 130 
 131         // Volatile
 132         {
 133             hs.get(TestAccessMode.SET_VOLATILE).invokeExact(recv, false);
 134             boolean x = (boolean) hs.get(TestAccessMode.GET_VOLATILE).invokeExact(recv);
 135             assertEquals(false, x, "setVolatile boolean value");
 136         }
 137 
 138         // Lazy
 139         {
 140             hs.get(TestAccessMode.SET_RELEASE).invokeExact(recv, true);
 141             boolean x = (boolean) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact(recv);
 142             assertEquals(true, x, "setRelease boolean value");
 143         }
 144 
 145         // Opaque
 146         {
 147             hs.get(TestAccessMode.SET_OPAQUE).invokeExact(recv, false);
 148             boolean x = (boolean) hs.get(TestAccessMode.GET_OPAQUE).invokeExact(recv);
 149             assertEquals(false, x, "setOpaque boolean value");
 150         }
 151 
 152         hs.get(TestAccessMode.SET).invokeExact(recv, true);
 153 
 154         // Compare
 155         {
 156             boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(recv, true, false);
 157             assertEquals(r, true, "success compareAndSet boolean");
 158             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
 159             assertEquals(false, x, "success compareAndSet boolean value");
 160         }
 161 
 162         {
 163             boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(recv, true, false);
 164             assertEquals(r, false, "failing compareAndSet boolean");
 165             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
 166             assertEquals(false, x, "failing compareAndSet boolean value");
 167         }
 168 
 169         {
 170             boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(recv, false, true);
 171             assertEquals(r, false, "success compareAndExchange boolean");
 172             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
 173             assertEquals(true, x, "success compareAndExchange boolean value");
 174         }
 175 
 176         {
 177             boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(recv, false, false);
 178             assertEquals(r, true, "failing compareAndExchange boolean");
 179             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
 180             assertEquals(true, x, "failing compareAndExchange boolean value");
 181         }
 182 
 183         {
 184             boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(recv, true, false);
 185             assertEquals(r, true, "success compareAndExchangeAcquire boolean");
 186             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
 187             assertEquals(false, x, "success compareAndExchangeAcquire boolean value");
 188         }
 189 
 190         {
 191             boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(recv, true, false);
 192             assertEquals(r, false, "failing compareAndExchangeAcquire boolean");
 193             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
 194             assertEquals(false, x, "failing compareAndExchangeAcquire boolean value");
 195         }
 196 
 197         {
 198             boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(recv, false, true);
 199             assertEquals(r, false, "success compareAndExchangeRelease boolean");
 200             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
 201             assertEquals(true, x, "success compareAndExchangeRelease boolean value");
 202         }
 203 
 204         {
 205             boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(recv, false, false);
 206             assertEquals(r, true, "failing compareAndExchangeRelease boolean");
 207             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
 208             assertEquals(true, x, "failing compareAndExchangeRelease boolean value");
 209         }
 210 
 211         {
 212             MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN);
 213             boolean success = false;
 214             for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
 215                 success = (boolean) mh.invokeExact(recv, true, false);
 216                 if (!success) weakDelay();
 217             }
 218             assertEquals(success, true, "success weakCompareAndSetPlain boolean");
 219             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
 220             assertEquals(false, x, "success weakCompareAndSetPlain boolean value");
 221         }
 222 
 223         {
 224             boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN).invokeExact(recv, true, false);
 225             assertEquals(success, false, "failing weakCompareAndSetPlain boolean");
 226             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
 227             assertEquals(false, x, "failing weakCompareAndSetPlain boolean value");
 228         }
 229 
 230         {
 231             MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE);
 232             boolean success = false;
 233             for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
 234                 success = (boolean) mh.invokeExact(recv, false, true);
 235                 if (!success) weakDelay();
 236             }
 237             assertEquals(success, true, "success weakCompareAndSetAcquire boolean");
 238             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
 239             assertEquals(true, x, "success weakCompareAndSetAcquire boolean");
 240         }
 241 
 242         {
 243             boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(recv, false, false);
 244             assertEquals(success, false, "failing weakCompareAndSetAcquire boolean");
 245             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
 246             assertEquals(true, x, "failing weakCompareAndSetAcquire boolean value");
 247         }
 248 
 249         {
 250             MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE);
 251             boolean success = false;
 252             for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
 253                 success = (boolean) mh.invokeExact(recv, true, false);
 254                 if (!success) weakDelay();
 255             }
 256             assertEquals(success, true, "success weakCompareAndSetRelease boolean");
 257             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
 258             assertEquals(false, x, "success weakCompareAndSetRelease boolean");
 259         }
 260 
 261         {
 262             boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(recv, true, false);
 263             assertEquals(success, false, "failing weakCompareAndSetRelease boolean");
 264             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
 265             assertEquals(false, x, "failing weakCompareAndSetRelease boolean value");
 266         }
 267 
 268         {
 269             boolean success = false;
 270             MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET);
 271             for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
 272                 success = (boolean) mh.invokeExact(recv, false, true);
 273                 if (!success) weakDelay();
 274             }
 275             assertEquals(success, true, "success weakCompareAndSet boolean");
 276             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
 277             assertEquals(true, x, "success weakCompareAndSet boolean");
 278         }
 279 
 280         {
 281             boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(recv, false, false);
 282             assertEquals(success, false, "failing weakCompareAndSet boolean");
 283             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
 284             assertEquals(true, x, "failing weakCompareAndSet boolean value");
 285         }
 286 
 287         // Compare set and get
 288         {
 289             boolean o = (boolean) hs.get(TestAccessMode.GET_AND_SET).invokeExact(recv, false);
 290             assertEquals(true, o, "getAndSet boolean");
 291             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
 292             assertEquals(false, x, "getAndSet boolean value");
 293         }
 294 
 295 
 296         // get and bitwise or
 297         {
 298             hs.get(TestAccessMode.SET).invokeExact(recv, true);
 299 
 300             boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_OR).invokeExact(recv, false);
 301             assertEquals(true, o, "getAndBitwiseOr boolean");
 302             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
 303             assertEquals((boolean)(true | false), x, "getAndBitwiseOr boolean value");
 304         }
 305 
 306         {
 307             hs.get(TestAccessMode.SET).invokeExact(recv, true);
 308 
 309             boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_OR_ACQUIRE).invokeExact(recv, false);
 310             assertEquals(true, o, "getAndBitwiseOrAcquire boolean");
 311             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
 312             assertEquals((boolean)(true | false), x, "getAndBitwiseOrAcquire boolean value");
 313         }
 314 
 315         {
 316             hs.get(TestAccessMode.SET).invokeExact(recv, true);
 317 
 318             boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_OR_RELEASE).invokeExact(recv, false);
 319             assertEquals(true, o, "getAndBitwiseOrRelease boolean");
 320             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
 321             assertEquals((boolean)(true | false), x, "getAndBitwiseOrRelease boolean value");
 322         }
 323 
 324         // get and bitwise and
 325         {
 326             hs.get(TestAccessMode.SET).invokeExact(recv, true);
 327 
 328             boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_AND).invokeExact(recv, false);
 329             assertEquals(true, o, "getAndBitwiseAnd boolean");
 330             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
 331             assertEquals((boolean)(true & false), x, "getAndBitwiseAnd boolean value");
 332         }
 333 
 334         {
 335             hs.get(TestAccessMode.SET).invokeExact(recv, true);
 336 
 337             boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_AND_ACQUIRE).invokeExact(recv, false);
 338             assertEquals(true, o, "getAndBitwiseAndAcquire boolean");
 339             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
 340             assertEquals((boolean)(true & false), x, "getAndBitwiseAndAcquire boolean value");
 341         }
 342 
 343         {
 344             hs.get(TestAccessMode.SET).invokeExact(recv, true);
 345 
 346             boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_AND_RELEASE).invokeExact(recv, false);
 347             assertEquals(true, o, "getAndBitwiseAndRelease boolean");
 348             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
 349             assertEquals((boolean)(true & false), x, "getAndBitwiseAndRelease boolean value");
 350         }
 351 
 352         // get and bitwise xor
 353         {
 354             hs.get(TestAccessMode.SET).invokeExact(recv, true);
 355 
 356             boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_XOR).invokeExact(recv, false);
 357             assertEquals(true, o, "getAndBitwiseXor boolean");
 358             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
 359             assertEquals((boolean)(true ^ false), x, "getAndBitwiseXor boolean value");
 360         }
 361 
 362         {
 363             hs.get(TestAccessMode.SET).invokeExact(recv, true);
 364 
 365             boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_XOR_ACQUIRE).invokeExact(recv, false);
 366             assertEquals(true, o, "getAndBitwiseXorAcquire boolean");
 367             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
 368             assertEquals((boolean)(true ^ false), x, "getAndBitwiseXorAcquire boolean value");
 369         }
 370 
 371         {
 372             hs.get(TestAccessMode.SET).invokeExact(recv, true);
 373 
 374             boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_XOR_RELEASE).invokeExact(recv, false);
 375             assertEquals(true, o, "getAndBitwiseXorRelease boolean");
 376             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
 377             assertEquals((boolean)(true ^ false), x, "getAndBitwiseXorRelease boolean value");
 378         }
 379     }
 380 
 381     static void testInstanceFieldUnsupported(VarHandleTestMethodHandleAccessBoolean recv, Handles hs) throws Throwable {
 382 
 383         for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_ADD)) {
 384             checkUOE(am, () -> {
 385                 boolean r = (boolean) hs.get(am).invokeExact(recv, true);
 386             });
 387         }
 388 
 389     }
 390 
 391 
 392     static void testStaticField(Handles hs) throws Throwable {
 393         // Plain
 394         {
 395             hs.get(TestAccessMode.SET).invokeExact(true);
 396             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
 397             assertEquals(true, x, "set boolean value");
 398         }
 399 
 400 
 401         // Volatile
 402         {
 403             hs.get(TestAccessMode.SET_VOLATILE).invokeExact(false);
 404             boolean x = (boolean) hs.get(TestAccessMode.GET_VOLATILE).invokeExact();
 405             assertEquals(false, x, "setVolatile boolean value");
 406         }
 407 
 408         // Lazy
 409         {
 410             hs.get(TestAccessMode.SET_RELEASE).invokeExact(true);
 411             boolean x = (boolean) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact();
 412             assertEquals(true, x, "setRelease boolean value");
 413         }
 414 
 415         // Opaque
 416         {
 417             hs.get(TestAccessMode.SET_OPAQUE).invokeExact(false);
 418             boolean x = (boolean) hs.get(TestAccessMode.GET_OPAQUE).invokeExact();
 419             assertEquals(false, x, "setOpaque boolean value");
 420         }
 421 
 422         hs.get(TestAccessMode.SET).invokeExact(true);
 423 
 424         // Compare
 425         {
 426             boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(true, false);
 427             assertEquals(r, true, "success compareAndSet boolean");
 428             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
 429             assertEquals(false, x, "success compareAndSet boolean value");
 430         }
 431 
 432         {
 433             boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(true, false);
 434             assertEquals(r, false, "failing compareAndSet boolean");
 435             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
 436             assertEquals(false, x, "failing compareAndSet boolean value");
 437         }
 438 
 439         {
 440             boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(false, true);
 441             assertEquals(r, false, "success compareAndExchange boolean");
 442             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
 443             assertEquals(true, x, "success compareAndExchange boolean value");
 444         }
 445 
 446         {
 447             boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(false, false);
 448             assertEquals(r, true, "failing compareAndExchange boolean");
 449             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
 450             assertEquals(true, x, "failing compareAndExchange boolean value");
 451         }
 452 
 453         {
 454             boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(true, false);
 455             assertEquals(r, true, "success compareAndExchangeAcquire boolean");
 456             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
 457             assertEquals(false, x, "success compareAndExchangeAcquire boolean value");
 458         }
 459 
 460         {
 461             boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(true, false);
 462             assertEquals(r, false, "failing compareAndExchangeAcquire boolean");
 463             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
 464             assertEquals(false, x, "failing compareAndExchangeAcquire boolean value");
 465         }
 466 
 467         {
 468             boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(false, true);
 469             assertEquals(r, false, "success compareAndExchangeRelease boolean");
 470             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
 471             assertEquals(true, x, "success compareAndExchangeRelease boolean value");
 472         }
 473 
 474         {
 475             boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(false, false);
 476             assertEquals(r, true, "failing compareAndExchangeRelease boolean");
 477             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
 478             assertEquals(true, x, "failing compareAndExchangeRelease boolean value");
 479         }
 480 
 481         {
 482             MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN);
 483             boolean success = false;
 484             for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
 485                 success = (boolean) mh.invokeExact(true, false);
 486                 if (!success) weakDelay();
 487             }
 488             assertEquals(success, true, "success weakCompareAndSetPlain boolean");
 489             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
 490             assertEquals(false, x, "success weakCompareAndSetPlain boolean value");
 491         }
 492 
 493         {
 494             boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN).invokeExact(true, false);
 495             assertEquals(success, false, "failing weakCompareAndSetPlain boolean");
 496             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
 497             assertEquals(false, x, "failing weakCompareAndSetPlain boolean value");
 498         }
 499 
 500         {
 501             MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE);
 502             boolean success = false;
 503             for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
 504                 success = (boolean) mh.invokeExact(false, true);
 505                 if (!success) weakDelay();
 506             }
 507             assertEquals(success, true, "success weakCompareAndSetAcquire boolean");
 508             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
 509             assertEquals(true, x, "success weakCompareAndSetAcquire boolean");
 510         }
 511 
 512         {
 513             MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE);
 514             boolean success = (boolean) mh.invokeExact(false, false);
 515             assertEquals(success, false, "failing weakCompareAndSetAcquire boolean");
 516             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
 517             assertEquals(true, x, "failing weakCompareAndSetAcquire boolean value");
 518         }
 519 
 520         {
 521             MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE);
 522             boolean success = false;
 523             for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
 524                 success = (boolean) mh.invokeExact(true, false);
 525                 if (!success) weakDelay();
 526             }
 527             assertEquals(success, true, "success weakCompareAndSetRelease boolean");
 528             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
 529             assertEquals(false, x, "success weakCompareAndSetRelease boolean");
 530         }
 531 
 532         {
 533             boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(true, false);
 534             assertEquals(success, false, "failing weakCompareAndSetRelease boolean");
 535             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
 536             assertEquals(false, x, "failing weakCompareAndSetRelease boolean value");
 537         }
 538 
 539         {
 540             MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET);
 541             boolean success = false;
 542             for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
 543                 success = (boolean) mh.invokeExact(false, true);
 544                 if (!success) weakDelay();
 545             }
 546             assertEquals(success, true, "success weakCompareAndSet boolean");
 547             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
 548             assertEquals(true, x, "success weakCompareAndSet boolean");
 549         }
 550 
 551         {
 552             boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(false, false);
 553             assertEquals(success, false, "failing weakCompareAndSet boolean");
 554             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
 555             assertEquals(true, x, "failing weakCompareAndSetRe boolean value");
 556         }
 557 
 558         // Compare set and get
 559         {
 560             hs.get(TestAccessMode.SET).invokeExact(true);
 561 
 562             boolean o = (boolean) hs.get(TestAccessMode.GET_AND_SET).invokeExact(false);
 563             assertEquals(true, o, "getAndSet boolean");
 564             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
 565             assertEquals(false, x, "getAndSet boolean value");
 566         }
 567 
 568         // Compare set and get
 569         {
 570             hs.get(TestAccessMode.SET).invokeExact(true);
 571 
 572             boolean o = (boolean) hs.get(TestAccessMode.GET_AND_SET_ACQUIRE).invokeExact(false);
 573             assertEquals(true, o, "getAndSetAcquire boolean");
 574             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
 575             assertEquals(false, x, "getAndSetAcquire boolean value");
 576         }
 577 
 578         // Compare set and get
 579         {
 580             hs.get(TestAccessMode.SET).invokeExact(true);
 581 
 582             boolean o = (boolean) hs.get(TestAccessMode.GET_AND_SET_RELEASE).invokeExact(false);
 583             assertEquals(true, o, "getAndSetRelease boolean");
 584             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
 585             assertEquals(false, x, "getAndSetRelease boolean value");
 586         }
 587 
 588 
 589         // get and bitwise or
 590         {
 591             hs.get(TestAccessMode.SET).invokeExact(true);
 592 
 593             boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_OR).invokeExact(false);
 594             assertEquals(true, o, "getAndBitwiseOr boolean");
 595             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
 596             assertEquals((boolean)(true | false), x, "getAndBitwiseOr boolean value");
 597         }
 598 
 599         {
 600             hs.get(TestAccessMode.SET).invokeExact(true);
 601 
 602             boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_OR_ACQUIRE).invokeExact(false);
 603             assertEquals(true, o, "getAndBitwiseOrAcquire boolean");
 604             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
 605             assertEquals((boolean)(true | false), x, "getAndBitwiseOrAcquire boolean value");
 606         }
 607 
 608         {
 609             hs.get(TestAccessMode.SET).invokeExact(true);
 610 
 611             boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_OR_RELEASE).invokeExact(false);
 612             assertEquals(true, o, "getAndBitwiseOrRelease boolean");
 613             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
 614             assertEquals((boolean)(true | false), x, "getAndBitwiseOrRelease boolean value");
 615         }
 616 
 617         // get and bitwise and
 618         {
 619             hs.get(TestAccessMode.SET).invokeExact(true);
 620 
 621             boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_AND).invokeExact(false);
 622             assertEquals(true, o, "getAndBitwiseAnd boolean");
 623             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
 624             assertEquals((boolean)(true & false), x, "getAndBitwiseAnd boolean value");
 625         }
 626 
 627         {
 628             hs.get(TestAccessMode.SET).invokeExact(true);
 629 
 630             boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_AND_ACQUIRE).invokeExact(false);
 631             assertEquals(true, o, "getAndBitwiseAndAcquire boolean");
 632             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
 633             assertEquals((boolean)(true & false), x, "getAndBitwiseAndAcquire boolean value");
 634         }
 635 
 636         {
 637             hs.get(TestAccessMode.SET).invokeExact(true);
 638 
 639             boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_AND_RELEASE).invokeExact(false);
 640             assertEquals(true, o, "getAndBitwiseAndRelease boolean");
 641             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
 642             assertEquals((boolean)(true & false), x, "getAndBitwiseAndRelease boolean value");
 643         }
 644 
 645         // get and bitwise xor
 646         {
 647             hs.get(TestAccessMode.SET).invokeExact(true);
 648 
 649             boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_XOR).invokeExact(false);
 650             assertEquals(true, o, "getAndBitwiseXor boolean");
 651             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
 652             assertEquals((boolean)(true ^ false), x, "getAndBitwiseXor boolean value");
 653         }
 654 
 655         {
 656             hs.get(TestAccessMode.SET).invokeExact(true);
 657 
 658             boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_XOR_ACQUIRE).invokeExact(false);
 659             assertEquals(true, o, "getAndBitwiseXorAcquire boolean");
 660             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
 661             assertEquals((boolean)(true ^ false), x, "getAndBitwiseXorAcquire boolean value");
 662         }
 663 
 664         {
 665             hs.get(TestAccessMode.SET).invokeExact(true);
 666 
 667             boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_XOR_RELEASE).invokeExact(false);
 668             assertEquals(true, o, "getAndBitwiseXorRelease boolean");
 669             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
 670             assertEquals((boolean)(true ^ false), x, "getAndBitwiseXorRelease boolean value");
 671         }
 672     }
 673 
 674     static void testStaticFieldUnsupported(Handles hs) throws Throwable {
 675 
 676         for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_ADD)) {
 677             checkUOE(am, () -> {
 678                 boolean r = (boolean) hs.get(am).invokeExact(true);
 679             });
 680         }
 681 
 682     }
 683 
 684 
 685     static void testArray(Handles hs) throws Throwable {
 686         boolean[] array = new boolean[10];
 687 
 688         for (int i = 0; i < array.length; i++) {
 689             // Plain
 690             {
 691                 hs.get(TestAccessMode.SET).invokeExact(array, i, true);
 692                 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
 693                 assertEquals(true, x, "get boolean value");
 694             }
 695 
 696 
 697             // Volatile
 698             {
 699                 hs.get(TestAccessMode.SET_VOLATILE).invokeExact(array, i, false);
 700                 boolean x = (boolean) hs.get(TestAccessMode.GET_VOLATILE).invokeExact(array, i);
 701                 assertEquals(false, x, "setVolatile boolean value");
 702             }
 703 
 704             // Lazy
 705             {
 706                 hs.get(TestAccessMode.SET_RELEASE).invokeExact(array, i, true);
 707                 boolean x = (boolean) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact(array, i);
 708                 assertEquals(true, x, "setRelease boolean value");
 709             }
 710 
 711             // Opaque
 712             {
 713                 hs.get(TestAccessMode.SET_OPAQUE).invokeExact(array, i, false);
 714                 boolean x = (boolean) hs.get(TestAccessMode.GET_OPAQUE).invokeExact(array, i);
 715                 assertEquals(false, x, "setOpaque boolean value");
 716             }
 717 
 718             hs.get(TestAccessMode.SET).invokeExact(array, i, true);
 719 
 720             // Compare
 721             {
 722                 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(array, i, true, false);
 723                 assertEquals(r, true, "success compareAndSet boolean");
 724                 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
 725                 assertEquals(false, x, "success compareAndSet boolean value");
 726             }
 727 
 728             {
 729                 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(array, i, true, false);
 730                 assertEquals(r, false, "failing compareAndSet boolean");
 731                 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
 732                 assertEquals(false, x, "failing compareAndSet boolean value");
 733             }
 734 
 735             {
 736                 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(array, i, false, true);
 737                 assertEquals(r, false, "success compareAndExchange boolean");
 738                 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
 739                 assertEquals(true, x, "success compareAndExchange boolean value");
 740             }
 741 
 742             {
 743                 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(array, i, false, false);
 744                 assertEquals(r, true, "failing compareAndExchange boolean");
 745                 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
 746                 assertEquals(true, x, "failing compareAndExchange boolean value");
 747             }
 748 
 749             {
 750                 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(array, i, true, false);
 751                 assertEquals(r, true, "success compareAndExchangeAcquire boolean");
 752                 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
 753                 assertEquals(false, x, "success compareAndExchangeAcquire boolean value");
 754             }
 755 
 756             {
 757                 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(array, i, true, false);
 758                 assertEquals(r, false, "failing compareAndExchangeAcquire boolean");
 759                 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
 760                 assertEquals(false, x, "failing compareAndExchangeAcquire boolean value");
 761             }
 762 
 763             {
 764                 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(array, i, false, true);
 765                 assertEquals(r, false, "success compareAndExchangeRelease boolean");
 766                 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
 767                 assertEquals(true, x, "success compareAndExchangeRelease boolean value");
 768             }
 769 
 770             {
 771                 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(array, i, false, false);
 772                 assertEquals(r, true, "failing compareAndExchangeRelease boolean");
 773                 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
 774                 assertEquals(true, x, "failing compareAndExchangeRelease boolean value");
 775             }
 776 
 777             {
 778                 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN);
 779                 boolean success = false;
 780                 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
 781                     success = (boolean) mh.invokeExact(array, i, true, false);
 782                     if (!success) weakDelay();
 783                 }
 784                 assertEquals(success, true, "success weakCompareAndSetPlain boolean");
 785                 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
 786                 assertEquals(false, x, "success weakCompareAndSetPlain boolean value");
 787             }
 788 
 789             {
 790                 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN).invokeExact(array, i, true, false);
 791                 assertEquals(success, false, "failing weakCompareAndSetPlain boolean");
 792                 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
 793                 assertEquals(false, x, "failing weakCompareAndSetPlain boolean value");
 794             }
 795 
 796             {
 797                 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE);
 798                 boolean success = false;
 799                 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
 800                     success = (boolean) mh.invokeExact(array, i, false, true);
 801                     if (!success) weakDelay();
 802                 }
 803                 assertEquals(success, true, "success weakCompareAndSetAcquire boolean");
 804                 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
 805                 assertEquals(true, x, "success weakCompareAndSetAcquire boolean");
 806             }
 807 
 808             {
 809                 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(array, i, false, false);
 810                 assertEquals(success, false, "failing weakCompareAndSetAcquire boolean");
 811                 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
 812                 assertEquals(true, x, "failing weakCompareAndSetAcquire boolean value");
 813             }
 814 
 815             {
 816                 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE);
 817                 boolean success = false;
 818                 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
 819                     success = (boolean) mh.invokeExact(array, i, true, false);
 820                     if (!success) weakDelay();
 821                 }
 822                 assertEquals(success, true, "success weakCompareAndSetRelease boolean");
 823                 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
 824                 assertEquals(false, x, "success weakCompareAndSetRelease boolean");
 825             }
 826 
 827             {
 828                 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(array, i, true, false);
 829                 assertEquals(success, false, "failing weakCompareAndSetAcquire boolean");
 830                 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
 831                 assertEquals(false, x, "failing weakCompareAndSetAcquire boolean value");
 832             }
 833 
 834             {
 835                 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET);
 836                 boolean success = false;
 837                 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
 838                     success = (boolean) mh.invokeExact(array, i, false, true);
 839                     if (!success) weakDelay();
 840                 }
 841                 assertEquals(success, true, "success weakCompareAndSet boolean");
 842                 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
 843                 assertEquals(true, x, "success weakCompareAndSet boolean");
 844             }
 845 
 846             {
 847                 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(array, i, false, false);
 848                 assertEquals(success, false, "failing weakCompareAndSet boolean");
 849                 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
 850                 assertEquals(true, x, "failing weakCompareAndSet boolean value");
 851             }
 852 
 853             // Compare set and get
 854             {
 855                 hs.get(TestAccessMode.SET).invokeExact(array, i, true);
 856 
 857                 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_SET).invokeExact(array, i, false);
 858                 assertEquals(true, o, "getAndSet boolean");
 859                 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
 860                 assertEquals(false, x, "getAndSet boolean value");
 861             }
 862 
 863             {
 864                 hs.get(TestAccessMode.SET).invokeExact(array, i, true);
 865 
 866                 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_SET_ACQUIRE).invokeExact(array, i, false);
 867                 assertEquals(true, o, "getAndSetAcquire boolean");
 868                 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
 869                 assertEquals(false, x, "getAndSetAcquire boolean value");
 870             }
 871 
 872             {
 873                 hs.get(TestAccessMode.SET).invokeExact(array, i, true);
 874 
 875                 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_SET_RELEASE).invokeExact(array, i, false);
 876                 assertEquals(true, o, "getAndSetRelease boolean");
 877                 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
 878                 assertEquals(false, x, "getAndSetRelease boolean value");
 879             }
 880 
 881 
 882         // get and bitwise or
 883         {
 884             hs.get(TestAccessMode.SET).invokeExact(array, i, true);
 885 
 886             boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_OR).invokeExact(array, i, false);
 887             assertEquals(true, o, "getAndBitwiseOr boolean");
 888             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
 889             assertEquals((boolean)(true | false), x, "getAndBitwiseOr boolean value");
 890         }
 891 
 892         {
 893             hs.get(TestAccessMode.SET).invokeExact(array, i, true);
 894 
 895             boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_OR_ACQUIRE).invokeExact(array, i, false);
 896             assertEquals(true, o, "getAndBitwiseOrAcquire boolean");
 897             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
 898             assertEquals((boolean)(true | false), x, "getAndBitwiseOrAcquire boolean value");
 899         }
 900 
 901         {
 902             hs.get(TestAccessMode.SET).invokeExact(array, i, true);
 903 
 904             boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_OR_RELEASE).invokeExact(array, i, false);
 905             assertEquals(true, o, "getAndBitwiseOrRelease boolean");
 906             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
 907             assertEquals((boolean)(true | false), x, "getAndBitwiseOrRelease boolean value");
 908         }
 909 
 910         // get and bitwise and
 911         {
 912             hs.get(TestAccessMode.SET).invokeExact(array, i, true);
 913 
 914             boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_AND).invokeExact(array, i, false);
 915             assertEquals(true, o, "getAndBitwiseAnd boolean");
 916             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
 917             assertEquals((boolean)(true & false), x, "getAndBitwiseAnd boolean value");
 918         }
 919 
 920         {
 921             hs.get(TestAccessMode.SET).invokeExact(array, i, true);
 922 
 923             boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_AND_ACQUIRE).invokeExact(array, i, false);
 924             assertEquals(true, o, "getAndBitwiseAndAcquire boolean");
 925             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
 926             assertEquals((boolean)(true & false), x, "getAndBitwiseAndAcquire boolean value");
 927         }
 928 
 929         {
 930             hs.get(TestAccessMode.SET).invokeExact(array, i, true);
 931 
 932             boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_AND_RELEASE).invokeExact(array, i, false);
 933             assertEquals(true, o, "getAndBitwiseAndRelease boolean");
 934             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
 935             assertEquals((boolean)(true & false), x, "getAndBitwiseAndRelease boolean value");
 936         }
 937 
 938         // get and bitwise xor
 939         {
 940             hs.get(TestAccessMode.SET).invokeExact(array, i, true);
 941 
 942             boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_XOR).invokeExact(array, i, false);
 943             assertEquals(true, o, "getAndBitwiseXor boolean");
 944             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
 945             assertEquals((boolean)(true ^ false), x, "getAndBitwiseXor boolean value");
 946         }
 947 
 948         {
 949             hs.get(TestAccessMode.SET).invokeExact(array, i, true);
 950 
 951             boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_XOR_ACQUIRE).invokeExact(array, i, false);
 952             assertEquals(true, o, "getAndBitwiseXorAcquire boolean");
 953             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
 954             assertEquals((boolean)(true ^ false), x, "getAndBitwiseXorAcquire boolean value");
 955         }
 956 
 957         {
 958             hs.get(TestAccessMode.SET).invokeExact(array, i, true);
 959 
 960             boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_XOR_RELEASE).invokeExact(array, i, false);
 961             assertEquals(true, o, "getAndBitwiseXorRelease boolean");
 962             boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
 963             assertEquals((boolean)(true ^ false), x, "getAndBitwiseXorRelease boolean value");
 964         }
 965         }
 966     }
 967 
 968     static void testArrayUnsupported(Handles hs) throws Throwable {
 969         boolean[] array = new boolean[10];
 970 
 971         final int i = 0;
 972 
 973         for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_ADD)) {
 974             checkUOE(am, () -> {
 975                 boolean o = (boolean) hs.get(am).invokeExact(array, i, true);
 976             });
 977         }
 978 
 979     }
 980 
 981     static void testArrayIndexOutOfBounds(Handles hs) throws Throwable {
 982         boolean[] array = new boolean[10];
 983 
 984         for (int i : new int[]{-1, Integer.MIN_VALUE, 10, 11, Integer.MAX_VALUE}) {
 985             final int ci = i;
 986 
 987             for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET)) {
 988                 checkAIOOBE(am, () -> {
 989                     boolean x = (boolean) hs.get(am).invokeExact(array, ci);
 990                 });
 991             }
 992 
 993             for (TestAccessMode am : testAccessModesOfType(TestAccessType.SET)) {
 994                 checkAIOOBE(am, () -> {
 995                     hs.get(am).invokeExact(array, ci, true);
 996                 });
 997             }
 998 
 999             for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_SET)) {
1000                 checkAIOOBE(am, () -> {
1001                     boolean r = (boolean) hs.get(am).invokeExact(array, ci, true, false);
1002                 });
1003             }
1004 
1005             for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_EXCHANGE)) {
1006                 checkAIOOBE(am, () -> {
1007                     boolean r = (boolean) hs.get(am).invokeExact(array, ci, false, true);
1008                 });
1009             }
1010 
1011             for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_SET)) {
1012                 checkAIOOBE(am, () -> {
1013                     boolean o = (boolean) hs.get(am).invokeExact(array, ci, true);
1014                 });
1015             }
1016 
1017 
1018             for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_BITWISE)) {
1019                 checkAIOOBE(am, () -> {
1020                     boolean o = (boolean) hs.get(am).invokeExact(array, ci, false);
1021                 });
1022             }
1023         }
1024     }
1025 }
1026