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