1 /*
   2  * Copyright (c) 2015, 2025, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 #warn
  25 
  26 /*
  27  * @test
  28 #if[Value]
  29  * @enablePreview
  30  * @modules java.base/jdk.internal.vm.annotation
  31 #end[Value]
  32  * @comment Set CompileThresholdScaling to 0.1 so that the warmup loop sets to 2000 iterations
  33  *          to hit compilation thresholds
  34  * @run junit/othervm -Diters=2000 -XX:CompileThresholdScaling=0.1 VarHandleTestMethodHandleAccess$Type$
  35  */
  36 
  37 import java.lang.invoke.MethodHandle;
  38 import java.lang.invoke.MethodHandles;
  39 import java.lang.invoke.VarHandle;
  40 import java.util.ArrayList;
  41 import java.util.List;
  42 
  43 import static org.junit.jupiter.api.Assertions.*;
  44 import org.junit.jupiter.api.BeforeAll;
  45 import org.junit.jupiter.api.TestInstance;
  46 import org.junit.jupiter.params.ParameterizedTest;
  47 import org.junit.jupiter.params.provider.MethodSource;
  48 
  49 @TestInstance(TestInstance.Lifecycle.PER_CLASS)
  50 public class VarHandleTestMethodHandleAccess$Type$ extends VarHandleBaseTest {
  51     static final $type$ static_final_v = $value1$;
  52 
  53     static $type$ static_v;
  54 
  55     final $type$ final_v = $value1$;
  56 
  57     $type$ v;
  58 
  59     VarHandle vhFinalField;
  60 
  61     VarHandle vhField;
  62 
  63     VarHandle vhStaticField;
  64 
  65     VarHandle vhStaticFinalField;
  66 
  67     VarHandle vhArray;
  68 
  69     @BeforeAll
  70     public void setup() throws Exception {
  71         vhFinalField = MethodHandles.lookup().findVarHandle(
  72                 VarHandleTestMethodHandleAccess$Type$.class, "final_v", $type$.class);
  73 
  74         vhField = MethodHandles.lookup().findVarHandle(
  75                 VarHandleTestMethodHandleAccess$Type$.class, "v", $type$.class);
  76 
  77         vhStaticFinalField = MethodHandles.lookup().findStaticVarHandle(
  78             VarHandleTestMethodHandleAccess$Type$.class, "static_final_v", $type$.class);
  79 
  80         vhStaticField = MethodHandles.lookup().findStaticVarHandle(
  81             VarHandleTestMethodHandleAccess$Type$.class, "static_v", $type$.class);
  82 
  83         vhArray = MethodHandles.arrayElementVarHandle($type$[].class);
  84     }
  85 
  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, VarHandleTestMethodHandleAccess$Type$::testStaticField));
  98             cases.add(new MethodHandleAccessTestCase("Static field unsupported",
  99                                                      vhStaticField, f, VarHandleTestMethodHandleAccess$Type$::testStaticFieldUnsupported,
 100                                                      false));
 101 
 102             cases.add(new MethodHandleAccessTestCase("Array",
 103                                                      vhArray, f, VarHandleTestMethodHandleAccess$Type$::testArray));
 104             cases.add(new MethodHandleAccessTestCase("Array unsupported",
 105                                                      vhArray, f, VarHandleTestMethodHandleAccess$Type$::testArrayUnsupported,
 106                                                      false));
 107             cases.add(new MethodHandleAccessTestCase("Array index out of bounds",
 108                                                      vhArray, f, VarHandleTestMethodHandleAccess$Type$::testArrayIndexOutOfBounds,
 109                                                      false));
 110         }
 111 
 112         // Work around issue with jtreg summary reporting which truncates
 113         // the String result of Object.toString to 30 characters, hence
 114         // the first dummy argument
 115         return cases.stream().map(tc -> new Object[]{tc.toString(), tc}).toArray(Object[][]::new);
 116     }
 117 
 118     @ParameterizedTest
 119     @MethodSource("accessTestCaseProvider")
 120     public <T> void testAccess(String desc, AccessTestCase<T> atc) throws Throwable {
 121         T t = atc.get();
 122         int iters = atc.requiresLoop() ? ITERS : 1;
 123         for (int c = 0; c < iters; c++) {
 124             atc.testAccess(t);
 125         }
 126     }
 127 
 128     static void testInstanceField(VarHandleTestMethodHandleAccess$Type$ recv, Handles hs) throws Throwable {
 129         // Plain
 130         {
 131             hs.get(TestAccessMode.SET).invokeExact(recv, $value1$);
 132             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(recv);
 133             assertEquals($value1$, x, "set $type$ value");
 134         }
 135 
 136 
 137         // Volatile
 138         {
 139             hs.get(TestAccessMode.SET_VOLATILE).invokeExact(recv, $value2$);
 140             $type$ x = ($type$) hs.get(TestAccessMode.GET_VOLATILE).invokeExact(recv);
 141             assertEquals($value2$, x, "setVolatile $type$ value");
 142         }
 143 
 144         // Lazy
 145         {
 146             hs.get(TestAccessMode.SET_RELEASE).invokeExact(recv, $value1$);
 147             $type$ x = ($type$) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact(recv);
 148             assertEquals($value1$, x, "setRelease $type$ value");
 149         }
 150 
 151         // Opaque
 152         {
 153             hs.get(TestAccessMode.SET_OPAQUE).invokeExact(recv, $value2$);
 154             $type$ x = ($type$) hs.get(TestAccessMode.GET_OPAQUE).invokeExact(recv);
 155             assertEquals($value2$, x, "setOpaque $type$ value");
 156         }
 157 
 158 #if[CAS]
 159         hs.get(TestAccessMode.SET).invokeExact(recv, $value1$);
 160 
 161         // Compare
 162         {
 163             boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(recv, $value1$, $value2$);
 164             assertEquals(r, true, "success compareAndSet $type$");
 165             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(recv);
 166             assertEquals($value2$, x, "success compareAndSet $type$ value");
 167         }
 168 
 169         {
 170             boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(recv, $value1$, $value3$);
 171             assertEquals(r, false, "failing compareAndSet $type$");
 172             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(recv);
 173             assertEquals($value2$, x, "failing compareAndSet $type$ value");
 174         }
 175 
 176         {
 177             $type$ r = ($type$) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(recv, $value2$, $value1$);
 178             assertEquals(r, $value2$, "success compareAndExchange $type$");
 179             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(recv);
 180             assertEquals($value1$, x, "success compareAndExchange $type$ value");
 181         }
 182 
 183         {
 184             $type$ r = ($type$) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(recv, $value2$, $value3$);
 185             assertEquals(r, $value1$, "failing compareAndExchange $type$");
 186             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(recv);
 187             assertEquals($value1$, x, "failing compareAndExchange $type$ value");
 188         }
 189 
 190         {
 191             $type$ r = ($type$) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(recv, $value1$, $value2$);
 192             assertEquals(r, $value1$, "success compareAndExchangeAcquire $type$");
 193             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(recv);
 194             assertEquals($value2$, x, "success compareAndExchangeAcquire $type$ value");
 195         }
 196 
 197         {
 198             $type$ r = ($type$) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(recv, $value1$, $value3$);
 199             assertEquals(r, $value2$, "failing compareAndExchangeAcquire $type$");
 200             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(recv);
 201             assertEquals($value2$, x, "failing compareAndExchangeAcquire $type$ value");
 202         }
 203 
 204         {
 205             $type$ r = ($type$) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(recv, $value2$, $value1$);
 206             assertEquals(r, $value2$, "success compareAndExchangeRelease $type$");
 207             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(recv);
 208             assertEquals($value1$, x, "success compareAndExchangeRelease $type$ value");
 209         }
 210 
 211         {
 212             $type$ r = ($type$) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(recv, $value2$, $value3$);
 213             assertEquals(r, $value1$, "failing compareAndExchangeRelease $type$");
 214             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(recv);
 215             assertEquals($value1$, x, "failing compareAndExchangeRelease $type$ value");
 216         }
 217 
 218         {
 219             MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN);
 220             boolean success = false;
 221             for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
 222                 success = (boolean) mh.invokeExact(recv, $value1$, $value2$);
 223                 if (!success) weakDelay();
 224             }
 225             assertEquals(success, true, "success weakCompareAndSetPlain $type$");
 226             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(recv);
 227             assertEquals($value2$, x, "success weakCompareAndSetPlain $type$ value");
 228         }
 229 
 230         {
 231             boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN).invokeExact(recv, $value1$, $value3$);
 232             assertEquals(success, false, "failing weakCompareAndSetPlain $type$");
 233             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(recv);
 234             assertEquals($value2$, x, "failing weakCompareAndSetPlain $type$ value");
 235         }
 236 
 237         {
 238             MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE);
 239             boolean success = false;
 240             for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
 241                 success = (boolean) mh.invokeExact(recv, $value2$, $value1$);
 242                 if (!success) weakDelay();
 243             }
 244             assertEquals(success, true, "success weakCompareAndSetAcquire $type$");
 245             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(recv);
 246             assertEquals($value1$, x, "success weakCompareAndSetAcquire $type$");
 247         }
 248 
 249         {
 250             boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(recv, $value2$, $value3$);
 251             assertEquals(success, false, "failing weakCompareAndSetAcquire $type$");
 252             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(recv);
 253             assertEquals($value1$, x, "failing weakCompareAndSetAcquire $type$ value");
 254         }
 255 
 256         {
 257             MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE);
 258             boolean success = false;
 259             for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
 260                 success = (boolean) mh.invokeExact(recv, $value1$, $value2$);
 261                 if (!success) weakDelay();
 262             }
 263             assertEquals(success, true, "success weakCompareAndSetRelease $type$");
 264             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(recv);
 265             assertEquals($value2$, x, "success weakCompareAndSetRelease $type$");
 266         }
 267 
 268         {
 269             boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(recv, $value1$, $value3$);
 270             assertEquals(success, false, "failing weakCompareAndSetRelease $type$");
 271             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(recv);
 272             assertEquals($value2$, x, "failing weakCompareAndSetRelease $type$ value");
 273         }
 274 
 275         {
 276             boolean success = false;
 277             MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET);
 278             for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
 279                 success = (boolean) mh.invokeExact(recv, $value2$, $value1$);
 280                 if (!success) weakDelay();
 281             }
 282             assertEquals(success, true, "success weakCompareAndSet $type$");
 283             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(recv);
 284             assertEquals($value1$, x, "success weakCompareAndSet $type$");
 285         }
 286 
 287         {
 288             boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(recv, $value2$, $value3$);
 289             assertEquals(success, false, "failing weakCompareAndSet $type$");
 290             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(recv);
 291             assertEquals($value1$, x, "failing weakCompareAndSet $type$ value");
 292         }
 293 
 294         // Compare set and get
 295         {
 296             $type$ o = ($type$) hs.get(TestAccessMode.GET_AND_SET).invokeExact(recv, $value2$);
 297             assertEquals($value1$, o, "getAndSet $type$");
 298             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(recv);
 299             assertEquals($value2$, x, "getAndSet $type$ value");
 300         }
 301 #end[CAS]
 302 
 303 #if[AtomicAdd]
 304         // get and add, add and get
 305         {
 306             hs.get(TestAccessMode.SET).invokeExact(recv, $value1$);
 307 
 308             $type$ o = ($type$) hs.get(TestAccessMode.GET_AND_ADD).invokeExact(recv, $value2$);
 309             assertEquals($value1$, o, "getAndAdd $type$");
 310             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(recv);
 311             assertEquals(($type$)($value1$ + $value2$), x, "getAndAdd $type$ value");
 312         }
 313 
 314         {
 315             hs.get(TestAccessMode.SET).invokeExact(recv, $value1$);
 316 
 317             $type$ o = ($type$) hs.get(TestAccessMode.GET_AND_ADD_ACQUIRE).invokeExact(recv, $value2$);
 318             assertEquals($value1$, o, "getAndAddAcquire $type$");
 319             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(recv);
 320             assertEquals(($type$)($value1$ + $value2$), x, "getAndAddAcquire $type$ value");
 321         }
 322 
 323         {
 324             hs.get(TestAccessMode.SET).invokeExact(recv, $value1$);
 325 
 326             $type$ o = ($type$) hs.get(TestAccessMode.GET_AND_ADD_RELEASE).invokeExact(recv, $value2$);
 327             assertEquals($value1$, o, "getAndAddRelease $type$");
 328             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(recv);
 329             assertEquals(($type$)($value1$ + $value2$), x, "getAndAddRelease $type$ value");
 330         }
 331 #end[AtomicAdd]
 332 
 333 #if[Bitwise]
 334         // get and bitwise or
 335         {
 336             hs.get(TestAccessMode.SET).invokeExact(recv, $value1$);
 337 
 338             $type$ o = ($type$) hs.get(TestAccessMode.GET_AND_BITWISE_OR).invokeExact(recv, $value2$);
 339             assertEquals($value1$, o, "getAndBitwiseOr $type$");
 340             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(recv);
 341             assertEquals(($type$)($value1$ | $value2$), x, "getAndBitwiseOr $type$ value");
 342         }
 343 
 344         {
 345             hs.get(TestAccessMode.SET).invokeExact(recv, $value1$);
 346 
 347             $type$ o = ($type$) hs.get(TestAccessMode.GET_AND_BITWISE_OR_ACQUIRE).invokeExact(recv, $value2$);
 348             assertEquals($value1$, o, "getAndBitwiseOrAcquire $type$");
 349             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(recv);
 350             assertEquals(($type$)($value1$ | $value2$), x, "getAndBitwiseOrAcquire $type$ value");
 351         }
 352 
 353         {
 354             hs.get(TestAccessMode.SET).invokeExact(recv, $value1$);
 355 
 356             $type$ o = ($type$) hs.get(TestAccessMode.GET_AND_BITWISE_OR_RELEASE).invokeExact(recv, $value2$);
 357             assertEquals($value1$, o, "getAndBitwiseOrRelease $type$");
 358             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(recv);
 359             assertEquals(($type$)($value1$ | $value2$), x, "getAndBitwiseOrRelease $type$ value");
 360         }
 361 
 362         // get and bitwise and
 363         {
 364             hs.get(TestAccessMode.SET).invokeExact(recv, $value1$);
 365 
 366             $type$ o = ($type$) hs.get(TestAccessMode.GET_AND_BITWISE_AND).invokeExact(recv, $value2$);
 367             assertEquals($value1$, o, "getAndBitwiseAnd $type$");
 368             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(recv);
 369             assertEquals(($type$)($value1$ & $value2$), x, "getAndBitwiseAnd $type$ value");
 370         }
 371 
 372         {
 373             hs.get(TestAccessMode.SET).invokeExact(recv, $value1$);
 374 
 375             $type$ o = ($type$) hs.get(TestAccessMode.GET_AND_BITWISE_AND_ACQUIRE).invokeExact(recv, $value2$);
 376             assertEquals($value1$, o, "getAndBitwiseAndAcquire $type$");
 377             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(recv);
 378             assertEquals(($type$)($value1$ & $value2$), x, "getAndBitwiseAndAcquire $type$ value");
 379         }
 380 
 381         {
 382             hs.get(TestAccessMode.SET).invokeExact(recv, $value1$);
 383 
 384             $type$ o = ($type$) hs.get(TestAccessMode.GET_AND_BITWISE_AND_RELEASE).invokeExact(recv, $value2$);
 385             assertEquals($value1$, o, "getAndBitwiseAndRelease $type$");
 386             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(recv);
 387             assertEquals(($type$)($value1$ & $value2$), x, "getAndBitwiseAndRelease $type$ value");
 388         }
 389 
 390         // get and bitwise xor
 391         {
 392             hs.get(TestAccessMode.SET).invokeExact(recv, $value1$);
 393 
 394             $type$ o = ($type$) hs.get(TestAccessMode.GET_AND_BITWISE_XOR).invokeExact(recv, $value2$);
 395             assertEquals($value1$, o, "getAndBitwiseXor $type$");
 396             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(recv);
 397             assertEquals(($type$)($value1$ ^ $value2$), x, "getAndBitwiseXor $type$ value");
 398         }
 399 
 400         {
 401             hs.get(TestAccessMode.SET).invokeExact(recv, $value1$);
 402 
 403             $type$ o = ($type$) hs.get(TestAccessMode.GET_AND_BITWISE_XOR_ACQUIRE).invokeExact(recv, $value2$);
 404             assertEquals($value1$, o, "getAndBitwiseXorAcquire $type$");
 405             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(recv);
 406             assertEquals(($type$)($value1$ ^ $value2$), x, "getAndBitwiseXorAcquire $type$ value");
 407         }
 408 
 409         {
 410             hs.get(TestAccessMode.SET).invokeExact(recv, $value1$);
 411 
 412             $type$ o = ($type$) hs.get(TestAccessMode.GET_AND_BITWISE_XOR_RELEASE).invokeExact(recv, $value2$);
 413             assertEquals($value1$, o, "getAndBitwiseXorRelease $type$");
 414             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(recv);
 415             assertEquals(($type$)($value1$ ^ $value2$), x, "getAndBitwiseXorRelease $type$ value");
 416         }
 417 #end[Bitwise]
 418     }
 419 
 420     static void testInstanceFieldUnsupported(VarHandleTestMethodHandleAccess$Type$ recv, Handles hs) throws Throwable {
 421 #if[!CAS]
 422         for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_SET)) {
 423             checkUOE(am, () -> {
 424                 boolean r = (boolean) hs.get(am).invokeExact(recv, $value1$, $value2$);
 425             });
 426         }
 427 
 428         for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_EXCHANGE)) {
 429             checkUOE(am, () -> {
 430                 $type$ r = ($type$) hs.get(am).invokeExact(recv, $value1$, $value2$);
 431             });
 432         }
 433 
 434         for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_SET)) {
 435             checkUOE(am, () -> {
 436                 $type$ r = ($type$) hs.get(am).invokeExact(recv, $value1$);
 437             });
 438         }
 439 #end[CAS]
 440 
 441 #if[!AtomicAdd]
 442         for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_ADD)) {
 443             checkUOE(am, () -> {
 444                 $type$ r = ($type$) hs.get(am).invokeExact(recv, $value1$);
 445             });
 446         }
 447 #end[AtomicAdd]
 448 
 449 #if[!Bitwise]
 450         for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_BITWISE)) {
 451             checkUOE(am, () -> {
 452                 $type$ r = ($type$) hs.get(am).invokeExact(recv, $value1$);
 453             });
 454         }
 455 #end[Bitwise]
 456     }
 457 
 458 
 459     static void testStaticField(Handles hs) throws Throwable {
 460         // Plain
 461         {
 462             hs.get(TestAccessMode.SET).invokeExact($value1$);
 463             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact();
 464             assertEquals($value1$, x, "set $type$ value");
 465         }
 466 
 467 
 468         // Volatile
 469         {
 470             hs.get(TestAccessMode.SET_VOLATILE).invokeExact($value2$);
 471             $type$ x = ($type$) hs.get(TestAccessMode.GET_VOLATILE).invokeExact();
 472             assertEquals($value2$, x, "setVolatile $type$ value");
 473         }
 474 
 475         // Lazy
 476         {
 477             hs.get(TestAccessMode.SET_RELEASE).invokeExact($value1$);
 478             $type$ x = ($type$) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact();
 479             assertEquals($value1$, x, "setRelease $type$ value");
 480         }
 481 
 482         // Opaque
 483         {
 484             hs.get(TestAccessMode.SET_OPAQUE).invokeExact($value2$);
 485             $type$ x = ($type$) hs.get(TestAccessMode.GET_OPAQUE).invokeExact();
 486             assertEquals($value2$, x, "setOpaque $type$ value");
 487         }
 488 
 489 #if[CAS]
 490         hs.get(TestAccessMode.SET).invokeExact($value1$);
 491 
 492         // Compare
 493         {
 494             boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact($value1$, $value2$);
 495             assertEquals(r, true, "success compareAndSet $type$");
 496             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact();
 497             assertEquals($value2$, x, "success compareAndSet $type$ value");
 498         }
 499 
 500         {
 501             boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact($value1$, $value3$);
 502             assertEquals(r, false, "failing compareAndSet $type$");
 503             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact();
 504             assertEquals($value2$, x, "failing compareAndSet $type$ value");
 505         }
 506 
 507         {
 508             $type$ r = ($type$) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact($value2$, $value1$);
 509             assertEquals(r, $value2$, "success compareAndExchange $type$");
 510             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact();
 511             assertEquals($value1$, x, "success compareAndExchange $type$ value");
 512         }
 513 
 514         {
 515             $type$ r = ($type$) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact($value2$, $value3$);
 516             assertEquals(r, $value1$, "failing compareAndExchange $type$");
 517             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact();
 518             assertEquals($value1$, x, "failing compareAndExchange $type$ value");
 519         }
 520 
 521         {
 522             $type$ r = ($type$) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact($value1$, $value2$);
 523             assertEquals(r, $value1$, "success compareAndExchangeAcquire $type$");
 524             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact();
 525             assertEquals($value2$, x, "success compareAndExchangeAcquire $type$ value");
 526         }
 527 
 528         {
 529             $type$ r = ($type$) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact($value1$, $value3$);
 530             assertEquals(r, $value2$, "failing compareAndExchangeAcquire $type$");
 531             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact();
 532             assertEquals($value2$, x, "failing compareAndExchangeAcquire $type$ value");
 533         }
 534 
 535         {
 536             $type$ r = ($type$) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact($value2$, $value1$);
 537             assertEquals(r, $value2$, "success compareAndExchangeRelease $type$");
 538             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact();
 539             assertEquals($value1$, x, "success compareAndExchangeRelease $type$ value");
 540         }
 541 
 542         {
 543             $type$ r = ($type$) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact($value2$, $value3$);
 544             assertEquals(r, $value1$, "failing compareAndExchangeRelease $type$");
 545             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact();
 546             assertEquals($value1$, x, "failing compareAndExchangeRelease $type$ value");
 547         }
 548 
 549         {
 550             MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN);
 551             boolean success = false;
 552             for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
 553                 success = (boolean) mh.invokeExact($value1$, $value2$);
 554                 if (!success) weakDelay();
 555             }
 556             assertEquals(success, true, "success weakCompareAndSetPlain $type$");
 557             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact();
 558             assertEquals($value2$, x, "success weakCompareAndSetPlain $type$ value");
 559         }
 560 
 561         {
 562             boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN).invokeExact($value1$, $value3$);
 563             assertEquals(success, false, "failing weakCompareAndSetPlain $type$");
 564             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact();
 565             assertEquals($value2$, x, "failing weakCompareAndSetPlain $type$ value");
 566         }
 567 
 568         {
 569             MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE);
 570             boolean success = false;
 571             for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
 572                 success = (boolean) mh.invokeExact($value2$, $value1$);
 573                 if (!success) weakDelay();
 574             }
 575             assertEquals(success, true, "success weakCompareAndSetAcquire $type$");
 576             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact();
 577             assertEquals($value1$, x, "success weakCompareAndSetAcquire $type$");
 578         }
 579 
 580         {
 581             MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE);
 582             boolean success = (boolean) mh.invokeExact($value2$, $value3$);
 583             assertEquals(success, false, "failing weakCompareAndSetAcquire $type$");
 584             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact();
 585             assertEquals($value1$, x, "failing weakCompareAndSetAcquire $type$ value");
 586         }
 587 
 588         {
 589             MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE);
 590             boolean success = false;
 591             for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
 592                 success = (boolean) mh.invokeExact($value1$, $value2$);
 593                 if (!success) weakDelay();
 594             }
 595             assertEquals(success, true, "success weakCompareAndSetRelease $type$");
 596             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact();
 597             assertEquals($value2$, x, "success weakCompareAndSetRelease $type$");
 598         }
 599 
 600         {
 601             boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact($value1$, $value3$);
 602             assertEquals(success, false, "failing weakCompareAndSetRelease $type$");
 603             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact();
 604             assertEquals($value2$, x, "failing weakCompareAndSetRelease $type$ value");
 605         }
 606 
 607         {
 608             MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET);
 609             boolean success = false;
 610             for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
 611                 success = (boolean) mh.invokeExact($value2$, $value1$);
 612                 if (!success) weakDelay();
 613             }
 614             assertEquals(success, true, "success weakCompareAndSet $type$");
 615             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact();
 616             assertEquals($value1$, x, "success weakCompareAndSet $type$");
 617         }
 618 
 619         {
 620             boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact($value2$, $value3$);
 621             assertEquals(success, false, "failing weakCompareAndSet $type$");
 622             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact();
 623             assertEquals($value1$, x, "failing weakCompareAndSetRe $type$ value");
 624         }
 625 
 626         // Compare set and get
 627         {
 628             hs.get(TestAccessMode.SET).invokeExact($value1$);
 629 
 630             $type$ o = ($type$) hs.get(TestAccessMode.GET_AND_SET).invokeExact($value2$);
 631             assertEquals($value1$, o, "getAndSet $type$");
 632             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact();
 633             assertEquals($value2$, x, "getAndSet $type$ value");
 634         }
 635 
 636         // Compare set and get
 637         {
 638             hs.get(TestAccessMode.SET).invokeExact($value1$);
 639 
 640             $type$ o = ($type$) hs.get(TestAccessMode.GET_AND_SET_ACQUIRE).invokeExact($value2$);
 641             assertEquals($value1$, o, "getAndSetAcquire $type$");
 642             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact();
 643             assertEquals($value2$, x, "getAndSetAcquire $type$ value");
 644         }
 645 
 646         // Compare set and get
 647         {
 648             hs.get(TestAccessMode.SET).invokeExact($value1$);
 649 
 650             $type$ o = ($type$) hs.get(TestAccessMode.GET_AND_SET_RELEASE).invokeExact($value2$);
 651             assertEquals($value1$, o, "getAndSetRelease $type$");
 652             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact();
 653             assertEquals($value2$, x, "getAndSetRelease $type$ value");
 654         }
 655 #end[CAS]
 656 
 657 #if[AtomicAdd]
 658         // get and add, add and get
 659         {
 660             hs.get(TestAccessMode.SET).invokeExact($value1$);
 661 
 662             $type$ o = ($type$) hs.get(TestAccessMode.GET_AND_ADD).invokeExact($value2$);
 663             assertEquals($value1$, o, "getAndAdd $type$");
 664             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact();
 665             assertEquals(($type$)($value1$ + $value2$), x, "getAndAdd $type$ value");
 666         }
 667 
 668         {
 669             hs.get(TestAccessMode.SET).invokeExact($value1$);
 670 
 671             $type$ o = ($type$) hs.get(TestAccessMode.GET_AND_ADD_ACQUIRE).invokeExact($value2$);
 672             assertEquals($value1$, o, "getAndAddAcquire $type$");
 673             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact();
 674             assertEquals(($type$)($value1$ + $value2$), x, "getAndAddAcquire $type$ value");
 675         }
 676 
 677         {
 678             hs.get(TestAccessMode.SET).invokeExact($value1$);
 679 
 680             $type$ o = ($type$) hs.get(TestAccessMode.GET_AND_ADD_RELEASE).invokeExact($value2$);
 681             assertEquals($value1$, o, "getAndAddRelease $type$");
 682             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact();
 683             assertEquals(($type$)($value1$ + $value2$), x, "getAndAddRelease $type$ value");
 684         }
 685 #end[AtomicAdd]
 686 
 687 #if[Bitwise]
 688         // get and bitwise or
 689         {
 690             hs.get(TestAccessMode.SET).invokeExact($value1$);
 691 
 692             $type$ o = ($type$) hs.get(TestAccessMode.GET_AND_BITWISE_OR).invokeExact($value2$);
 693             assertEquals($value1$, o, "getAndBitwiseOr $type$");
 694             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact();
 695             assertEquals(($type$)($value1$ | $value2$), x, "getAndBitwiseOr $type$ value");
 696         }
 697 
 698         {
 699             hs.get(TestAccessMode.SET).invokeExact($value1$);
 700 
 701             $type$ o = ($type$) hs.get(TestAccessMode.GET_AND_BITWISE_OR_ACQUIRE).invokeExact($value2$);
 702             assertEquals($value1$, o, "getAndBitwiseOrAcquire $type$");
 703             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact();
 704             assertEquals(($type$)($value1$ | $value2$), x, "getAndBitwiseOrAcquire $type$ value");
 705         }
 706 
 707         {
 708             hs.get(TestAccessMode.SET).invokeExact($value1$);
 709 
 710             $type$ o = ($type$) hs.get(TestAccessMode.GET_AND_BITWISE_OR_RELEASE).invokeExact($value2$);
 711             assertEquals($value1$, o, "getAndBitwiseOrRelease $type$");
 712             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact();
 713             assertEquals(($type$)($value1$ | $value2$), x, "getAndBitwiseOrRelease $type$ value");
 714         }
 715 
 716         // get and bitwise and
 717         {
 718             hs.get(TestAccessMode.SET).invokeExact($value1$);
 719 
 720             $type$ o = ($type$) hs.get(TestAccessMode.GET_AND_BITWISE_AND).invokeExact($value2$);
 721             assertEquals($value1$, o, "getAndBitwiseAnd $type$");
 722             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact();
 723             assertEquals(($type$)($value1$ & $value2$), x, "getAndBitwiseAnd $type$ value");
 724         }
 725 
 726         {
 727             hs.get(TestAccessMode.SET).invokeExact($value1$);
 728 
 729             $type$ o = ($type$) hs.get(TestAccessMode.GET_AND_BITWISE_AND_ACQUIRE).invokeExact($value2$);
 730             assertEquals($value1$, o, "getAndBitwiseAndAcquire $type$");
 731             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact();
 732             assertEquals(($type$)($value1$ & $value2$), x, "getAndBitwiseAndAcquire $type$ value");
 733         }
 734 
 735         {
 736             hs.get(TestAccessMode.SET).invokeExact($value1$);
 737 
 738             $type$ o = ($type$) hs.get(TestAccessMode.GET_AND_BITWISE_AND_RELEASE).invokeExact($value2$);
 739             assertEquals($value1$, o, "getAndBitwiseAndRelease $type$");
 740             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact();
 741             assertEquals(($type$)($value1$ & $value2$), x, "getAndBitwiseAndRelease $type$ value");
 742         }
 743 
 744         // get and bitwise xor
 745         {
 746             hs.get(TestAccessMode.SET).invokeExact($value1$);
 747 
 748             $type$ o = ($type$) hs.get(TestAccessMode.GET_AND_BITWISE_XOR).invokeExact($value2$);
 749             assertEquals($value1$, o, "getAndBitwiseXor $type$");
 750             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact();
 751             assertEquals(($type$)($value1$ ^ $value2$), x, "getAndBitwiseXor $type$ value");
 752         }
 753 
 754         {
 755             hs.get(TestAccessMode.SET).invokeExact($value1$);
 756 
 757             $type$ o = ($type$) hs.get(TestAccessMode.GET_AND_BITWISE_XOR_ACQUIRE).invokeExact($value2$);
 758             assertEquals($value1$, o, "getAndBitwiseXorAcquire $type$");
 759             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact();
 760             assertEquals(($type$)($value1$ ^ $value2$), x, "getAndBitwiseXorAcquire $type$ value");
 761         }
 762 
 763         {
 764             hs.get(TestAccessMode.SET).invokeExact($value1$);
 765 
 766             $type$ o = ($type$) hs.get(TestAccessMode.GET_AND_BITWISE_XOR_RELEASE).invokeExact($value2$);
 767             assertEquals($value1$, o, "getAndBitwiseXorRelease $type$");
 768             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact();
 769             assertEquals(($type$)($value1$ ^ $value2$), x, "getAndBitwiseXorRelease $type$ value");
 770         }
 771 #end[Bitwise]
 772     }
 773 
 774     static void testStaticFieldUnsupported(Handles hs) throws Throwable {
 775 #if[!CAS]
 776         for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_SET)) {
 777             checkUOE(am, () -> {
 778                 boolean r = (boolean) hs.get(am).invokeExact($value1$, $value2$);
 779             });
 780         }
 781 
 782         for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_EXCHANGE)) {
 783             checkUOE(am, () -> {
 784                 $type$ r = ($type$) hs.get(am).invokeExact($value1$, $value2$);
 785             });
 786         }
 787 
 788         for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_SET)) {
 789             checkUOE(am, () -> {
 790                 $type$ r = ($type$) hs.get(am).invokeExact($value1$);
 791             });
 792         }
 793 #end[CAS]
 794 
 795 #if[!AtomicAdd]
 796         for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_ADD)) {
 797             checkUOE(am, () -> {
 798                 $type$ r = ($type$) hs.get(am).invokeExact($value1$);
 799             });
 800         }
 801 #end[AtomicAdd]
 802 
 803 #if[!Bitwise]
 804         for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_BITWISE)) {
 805             checkUOE(am, () -> {
 806                 $type$ r = ($type$) hs.get(am).invokeExact($value1$);
 807             });
 808         }
 809 #end[Bitwise]
 810     }
 811 
 812 
 813     static void testArray(Handles hs) throws Throwable {
 814         $type$[] array = new $type$[10];
 815 
 816         for (int i = 0; i < array.length; i++) {
 817             // Plain
 818             {
 819                 hs.get(TestAccessMode.SET).invokeExact(array, i, $value1$);
 820                 $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(array, i);
 821                 assertEquals($value1$, x, "get $type$ value");
 822             }
 823 
 824 
 825             // Volatile
 826             {
 827                 hs.get(TestAccessMode.SET_VOLATILE).invokeExact(array, i, $value2$);
 828                 $type$ x = ($type$) hs.get(TestAccessMode.GET_VOLATILE).invokeExact(array, i);
 829                 assertEquals($value2$, x, "setVolatile $type$ value");
 830             }
 831 
 832             // Lazy
 833             {
 834                 hs.get(TestAccessMode.SET_RELEASE).invokeExact(array, i, $value1$);
 835                 $type$ x = ($type$) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact(array, i);
 836                 assertEquals($value1$, x, "setRelease $type$ value");
 837             }
 838 
 839             // Opaque
 840             {
 841                 hs.get(TestAccessMode.SET_OPAQUE).invokeExact(array, i, $value2$);
 842                 $type$ x = ($type$) hs.get(TestAccessMode.GET_OPAQUE).invokeExact(array, i);
 843                 assertEquals($value2$, x, "setOpaque $type$ value");
 844             }
 845 
 846 #if[CAS]
 847             hs.get(TestAccessMode.SET).invokeExact(array, i, $value1$);
 848 
 849             // Compare
 850             {
 851                 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(array, i, $value1$, $value2$);
 852                 assertEquals(r, true, "success compareAndSet $type$");
 853                 $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(array, i);
 854                 assertEquals($value2$, x, "success compareAndSet $type$ value");
 855             }
 856 
 857             {
 858                 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(array, i, $value1$, $value3$);
 859                 assertEquals(r, false, "failing compareAndSet $type$");
 860                 $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(array, i);
 861                 assertEquals($value2$, x, "failing compareAndSet $type$ value");
 862             }
 863 
 864             {
 865                 $type$ r = ($type$) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(array, i, $value2$, $value1$);
 866                 assertEquals(r, $value2$, "success compareAndExchange $type$");
 867                 $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(array, i);
 868                 assertEquals($value1$, x, "success compareAndExchange $type$ value");
 869             }
 870 
 871             {
 872                 $type$ r = ($type$) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(array, i, $value2$, $value3$);
 873                 assertEquals(r, $value1$, "failing compareAndExchange $type$");
 874                 $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(array, i);
 875                 assertEquals($value1$, x, "failing compareAndExchange $type$ value");
 876             }
 877 
 878             {
 879                 $type$ r = ($type$) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(array, i, $value1$, $value2$);
 880                 assertEquals(r, $value1$, "success compareAndExchangeAcquire $type$");
 881                 $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(array, i);
 882                 assertEquals($value2$, x, "success compareAndExchangeAcquire $type$ value");
 883             }
 884 
 885             {
 886                 $type$ r = ($type$) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(array, i, $value1$, $value3$);
 887                 assertEquals(r, $value2$, "failing compareAndExchangeAcquire $type$");
 888                 $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(array, i);
 889                 assertEquals($value2$, x, "failing compareAndExchangeAcquire $type$ value");
 890             }
 891 
 892             {
 893                 $type$ r = ($type$) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(array, i, $value2$, $value1$);
 894                 assertEquals(r, $value2$, "success compareAndExchangeRelease $type$");
 895                 $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(array, i);
 896                 assertEquals($value1$, x, "success compareAndExchangeRelease $type$ value");
 897             }
 898 
 899             {
 900                 $type$ r = ($type$) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(array, i, $value2$, $value3$);
 901                 assertEquals(r, $value1$, "failing compareAndExchangeRelease $type$");
 902                 $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(array, i);
 903                 assertEquals($value1$, x, "failing compareAndExchangeRelease $type$ value");
 904             }
 905 
 906             {
 907                 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN);
 908                 boolean success = false;
 909                 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
 910                     success = (boolean) mh.invokeExact(array, i, $value1$, $value2$);
 911                     if (!success) weakDelay();
 912                 }
 913                 assertEquals(success, true, "success weakCompareAndSetPlain $type$");
 914                 $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(array, i);
 915                 assertEquals($value2$, x, "success weakCompareAndSetPlain $type$ value");
 916             }
 917 
 918             {
 919                 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN).invokeExact(array, i, $value1$, $value3$);
 920                 assertEquals(success, false, "failing weakCompareAndSetPlain $type$");
 921                 $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(array, i);
 922                 assertEquals($value2$, x, "failing weakCompareAndSetPlain $type$ value");
 923             }
 924 
 925             {
 926                 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE);
 927                 boolean success = false;
 928                 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
 929                     success = (boolean) mh.invokeExact(array, i, $value2$, $value1$);
 930                     if (!success) weakDelay();
 931                 }
 932                 assertEquals(success, true, "success weakCompareAndSetAcquire $type$");
 933                 $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(array, i);
 934                 assertEquals($value1$, x, "success weakCompareAndSetAcquire $type$");
 935             }
 936 
 937             {
 938                 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(array, i, $value2$, $value3$);
 939                 assertEquals(success, false, "failing weakCompareAndSetAcquire $type$");
 940                 $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(array, i);
 941                 assertEquals($value1$, x, "failing weakCompareAndSetAcquire $type$ value");
 942             }
 943 
 944             {
 945                 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE);
 946                 boolean success = false;
 947                 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
 948                     success = (boolean) mh.invokeExact(array, i, $value1$, $value2$);
 949                     if (!success) weakDelay();
 950                 }
 951                 assertEquals(success, true, "success weakCompareAndSetRelease $type$");
 952                 $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(array, i);
 953                 assertEquals($value2$, x, "success weakCompareAndSetRelease $type$");
 954             }
 955 
 956             {
 957                 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(array, i, $value1$, $value3$);
 958                 assertEquals(success, false, "failing weakCompareAndSetAcquire $type$");
 959                 $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(array, i);
 960                 assertEquals($value2$, x, "failing weakCompareAndSetAcquire $type$ value");
 961             }
 962 
 963             {
 964                 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET);
 965                 boolean success = false;
 966                 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
 967                     success = (boolean) mh.invokeExact(array, i, $value2$, $value1$);
 968                     if (!success) weakDelay();
 969                 }
 970                 assertEquals(success, true, "success weakCompareAndSet $type$");
 971                 $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(array, i);
 972                 assertEquals($value1$, x, "success weakCompareAndSet $type$");
 973             }
 974 
 975             {
 976                 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(array, i, $value2$, $value3$);
 977                 assertEquals(success, false, "failing weakCompareAndSet $type$");
 978                 $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(array, i);
 979                 assertEquals($value1$, x, "failing weakCompareAndSet $type$ value");
 980             }
 981 
 982             // Compare set and get
 983             {
 984                 hs.get(TestAccessMode.SET).invokeExact(array, i, $value1$);
 985 
 986                 $type$ o = ($type$) hs.get(TestAccessMode.GET_AND_SET).invokeExact(array, i, $value2$);
 987                 assertEquals($value1$, o, "getAndSet $type$");
 988                 $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(array, i);
 989                 assertEquals($value2$, x, "getAndSet $type$ value");
 990             }
 991 
 992             {
 993                 hs.get(TestAccessMode.SET).invokeExact(array, i, $value1$);
 994 
 995                 $type$ o = ($type$) hs.get(TestAccessMode.GET_AND_SET_ACQUIRE).invokeExact(array, i, $value2$);
 996                 assertEquals($value1$, o, "getAndSetAcquire $type$");
 997                 $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(array, i);
 998                 assertEquals($value2$, x, "getAndSetAcquire $type$ value");
 999             }
1000 
1001             {
1002                 hs.get(TestAccessMode.SET).invokeExact(array, i, $value1$);
1003 
1004                 $type$ o = ($type$) hs.get(TestAccessMode.GET_AND_SET_RELEASE).invokeExact(array, i, $value2$);
1005                 assertEquals($value1$, o, "getAndSetRelease $type$");
1006                 $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(array, i);
1007                 assertEquals($value2$, x, "getAndSetRelease $type$ value");
1008             }
1009 #end[CAS]
1010 
1011 #if[AtomicAdd]
1012             // get and add, add and get
1013             {
1014                 hs.get(TestAccessMode.SET).invokeExact(array, i, $value1$);
1015 
1016                 $type$ o = ($type$) hs.get(TestAccessMode.GET_AND_ADD).invokeExact(array, i, $value2$);
1017                 assertEquals($value1$, o, "getAndAdd $type$");
1018                 $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(array, i);
1019                 assertEquals(($type$)($value1$ + $value2$), x, "getAndAdd $type$ value");
1020             }
1021 
1022             {
1023                 hs.get(TestAccessMode.SET).invokeExact(array, i, $value1$);
1024 
1025                 $type$ o = ($type$) hs.get(TestAccessMode.GET_AND_ADD_ACQUIRE).invokeExact(array, i, $value2$);
1026                 assertEquals($value1$, o, "getAndAddAcquire $type$");
1027                 $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(array, i);
1028                 assertEquals(($type$)($value1$ + $value2$), x, "getAndAddAcquire $type$ value");
1029             }
1030 
1031             {
1032                 hs.get(TestAccessMode.SET).invokeExact(array, i, $value1$);
1033 
1034                 $type$ o = ($type$) hs.get(TestAccessMode.GET_AND_ADD_RELEASE).invokeExact(array, i, $value2$);
1035                 assertEquals($value1$, o, "getAndAddRelease $type$");
1036                 $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(array, i);
1037                 assertEquals(($type$)($value1$ + $value2$), x, "getAndAddRelease $type$ value");
1038             }
1039 #end[AtomicAdd]
1040 
1041 #if[Bitwise]
1042         // get and bitwise or
1043         {
1044             hs.get(TestAccessMode.SET).invokeExact(array, i, $value1$);
1045 
1046             $type$ o = ($type$) hs.get(TestAccessMode.GET_AND_BITWISE_OR).invokeExact(array, i, $value2$);
1047             assertEquals($value1$, o, "getAndBitwiseOr $type$");
1048             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(array, i);
1049             assertEquals(($type$)($value1$ | $value2$), x, "getAndBitwiseOr $type$ value");
1050         }
1051 
1052         {
1053             hs.get(TestAccessMode.SET).invokeExact(array, i, $value1$);
1054 
1055             $type$ o = ($type$) hs.get(TestAccessMode.GET_AND_BITWISE_OR_ACQUIRE).invokeExact(array, i, $value2$);
1056             assertEquals($value1$, o, "getAndBitwiseOrAcquire $type$");
1057             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(array, i);
1058             assertEquals(($type$)($value1$ | $value2$), x, "getAndBitwiseOrAcquire $type$ value");
1059         }
1060 
1061         {
1062             hs.get(TestAccessMode.SET).invokeExact(array, i, $value1$);
1063 
1064             $type$ o = ($type$) hs.get(TestAccessMode.GET_AND_BITWISE_OR_RELEASE).invokeExact(array, i, $value2$);
1065             assertEquals($value1$, o, "getAndBitwiseOrRelease $type$");
1066             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(array, i);
1067             assertEquals(($type$)($value1$ | $value2$), x, "getAndBitwiseOrRelease $type$ value");
1068         }
1069 
1070         // get and bitwise and
1071         {
1072             hs.get(TestAccessMode.SET).invokeExact(array, i, $value1$);
1073 
1074             $type$ o = ($type$) hs.get(TestAccessMode.GET_AND_BITWISE_AND).invokeExact(array, i, $value2$);
1075             assertEquals($value1$, o, "getAndBitwiseAnd $type$");
1076             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(array, i);
1077             assertEquals(($type$)($value1$ & $value2$), x, "getAndBitwiseAnd $type$ value");
1078         }
1079 
1080         {
1081             hs.get(TestAccessMode.SET).invokeExact(array, i, $value1$);
1082 
1083             $type$ o = ($type$) hs.get(TestAccessMode.GET_AND_BITWISE_AND_ACQUIRE).invokeExact(array, i, $value2$);
1084             assertEquals($value1$, o, "getAndBitwiseAndAcquire $type$");
1085             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(array, i);
1086             assertEquals(($type$)($value1$ & $value2$), x, "getAndBitwiseAndAcquire $type$ value");
1087         }
1088 
1089         {
1090             hs.get(TestAccessMode.SET).invokeExact(array, i, $value1$);
1091 
1092             $type$ o = ($type$) hs.get(TestAccessMode.GET_AND_BITWISE_AND_RELEASE).invokeExact(array, i, $value2$);
1093             assertEquals($value1$, o, "getAndBitwiseAndRelease $type$");
1094             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(array, i);
1095             assertEquals(($type$)($value1$ & $value2$), x, "getAndBitwiseAndRelease $type$ value");
1096         }
1097 
1098         // get and bitwise xor
1099         {
1100             hs.get(TestAccessMode.SET).invokeExact(array, i, $value1$);
1101 
1102             $type$ o = ($type$) hs.get(TestAccessMode.GET_AND_BITWISE_XOR).invokeExact(array, i, $value2$);
1103             assertEquals($value1$, o, "getAndBitwiseXor $type$");
1104             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(array, i);
1105             assertEquals(($type$)($value1$ ^ $value2$), x, "getAndBitwiseXor $type$ value");
1106         }
1107 
1108         {
1109             hs.get(TestAccessMode.SET).invokeExact(array, i, $value1$);
1110 
1111             $type$ o = ($type$) hs.get(TestAccessMode.GET_AND_BITWISE_XOR_ACQUIRE).invokeExact(array, i, $value2$);
1112             assertEquals($value1$, o, "getAndBitwiseXorAcquire $type$");
1113             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(array, i);
1114             assertEquals(($type$)($value1$ ^ $value2$), x, "getAndBitwiseXorAcquire $type$ value");
1115         }
1116 
1117         {
1118             hs.get(TestAccessMode.SET).invokeExact(array, i, $value1$);
1119 
1120             $type$ o = ($type$) hs.get(TestAccessMode.GET_AND_BITWISE_XOR_RELEASE).invokeExact(array, i, $value2$);
1121             assertEquals($value1$, o, "getAndBitwiseXorRelease $type$");
1122             $type$ x = ($type$) hs.get(TestAccessMode.GET).invokeExact(array, i);
1123             assertEquals(($type$)($value1$ ^ $value2$), x, "getAndBitwiseXorRelease $type$ value");
1124         }
1125 #end[Bitwise]
1126         }
1127     }
1128 
1129     static void testArrayUnsupported(Handles hs) throws Throwable {
1130         $type$[] array = new $type$[10];
1131 
1132         final int i = 0;
1133 #if[!CAS]
1134         for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_SET)) {
1135             checkUOE(am, () -> {
1136                 boolean r = (boolean) hs.get(am).invokeExact(array, i, $value1$, $value2$);
1137             });
1138         }
1139 
1140         for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_EXCHANGE)) {
1141             checkUOE(am, () -> {
1142                 $type$ r = ($type$) hs.get(am).invokeExact(array, i, $value1$, $value2$);
1143             });
1144         }
1145 
1146         for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_SET)) {
1147             checkUOE(am, () -> {
1148                 $type$ r = ($type$) hs.get(am).invokeExact(array, i, $value1$);
1149             });
1150         }
1151 #end[CAS]
1152 
1153 #if[!AtomicAdd]
1154         for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_ADD)) {
1155             checkUOE(am, () -> {
1156                 $type$ o = ($type$) hs.get(am).invokeExact(array, i, $value1$);
1157             });
1158         }
1159 #end[AtomicAdd]
1160 
1161 #if[!Bitwise]
1162         for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_BITWISE)) {
1163             checkUOE(am, () -> {
1164                 $type$ o = ($type$) hs.get(am).invokeExact(array, i, $value1$);
1165             });
1166         }
1167 #end[Bitwise]
1168     }
1169 
1170     static void testArrayIndexOutOfBounds(Handles hs) throws Throwable {
1171         $type$[] array = new $type$[10];
1172 
1173         for (int i : new int[]{-1, Integer.MIN_VALUE, 10, 11, Integer.MAX_VALUE}) {
1174             final int ci = i;
1175 
1176             for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET)) {
1177                 checkAIOOBE(am, () -> {
1178                     $type$ x = ($type$) hs.get(am).invokeExact(array, ci);
1179                 });
1180             }
1181 
1182             for (TestAccessMode am : testAccessModesOfType(TestAccessType.SET)) {
1183                 checkAIOOBE(am, () -> {
1184                     hs.get(am).invokeExact(array, ci, $value1$);
1185                 });
1186             }
1187 
1188 #if[CAS]
1189             for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_SET)) {
1190                 checkAIOOBE(am, () -> {
1191                     boolean r = (boolean) hs.get(am).invokeExact(array, ci, $value1$, $value2$);
1192                 });
1193             }
1194 
1195             for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_EXCHANGE)) {
1196                 checkAIOOBE(am, () -> {
1197                     $type$ r = ($type$) hs.get(am).invokeExact(array, ci, $value2$, $value1$);
1198                 });
1199             }
1200 
1201             for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_SET)) {
1202                 checkAIOOBE(am, () -> {
1203                     $type$ o = ($type$) hs.get(am).invokeExact(array, ci, $value1$);
1204                 });
1205             }
1206 #end[CAS]
1207 
1208 #if[AtomicAdd]
1209             for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_ADD)) {
1210                 checkAIOOBE(am, () -> {
1211                     $type$ o = ($type$) hs.get(am).invokeExact(array, ci, $value3$);
1212                 });
1213             }
1214 #end[AtomicAdd]
1215 
1216 #if[Bitwise]
1217             for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_BITWISE)) {
1218                 checkAIOOBE(am, () -> {
1219                     $type$ o = ($type$) hs.get(am).invokeExact(array, ci, $value3$);
1220                 });
1221             }
1222 #end[Bitwise]
1223         }
1224     }
1225 }
1226