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