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