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