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