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 VarHandleTestMethodHandleAccessInt
  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 VarHandleTestMethodHandleAccessInt extends VarHandleBaseTest {
  44     static final int static_final_v = 0x01234567;
  45 
  46     static int static_v;
  47 
  48     final int final_v = 0x01234567;
  49 
  50     int 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                 VarHandleTestMethodHandleAccessInt.class, "final_v", int.class);
  68 
  69         vhField = MethodHandles.lookup().findVarHandle(
  70                 VarHandleTestMethodHandleAccessInt.class, "v", int.class);
  71 
  72         vhStaticFinalField = MethodHandles.lookup().findStaticVarHandle(
  73             VarHandleTestMethodHandleAccessInt.class, "static_final_v", int.class);
  74 
  75         vhStaticField = MethodHandles.lookup().findStaticVarHandle(
  76             VarHandleTestMethodHandleAccessInt.class, "static_v", int.class);
  77 
  78         vhArray = MethodHandles.arrayElementVarHandle(int[].class);
  79 
  80         vhValueTypeField = MethodHandles.lookup().findVarHandle(
  81                     Value.class, "int_v", int.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, VarHandleTestMethodHandleAccessInt::testStaticField));
  98             cases.add(new MethodHandleAccessTestCase("Static field unsupported",
  99                                                      vhStaticField, f, VarHandleTestMethodHandleAccessInt::testStaticFieldUnsupported,
 100                                                      false));
 101 
 102             cases.add(new MethodHandleAccessTestCase("Array",
 103                                                      vhArray, f, VarHandleTestMethodHandleAccessInt::testArray));
 104             cases.add(new MethodHandleAccessTestCase("Array unsupported",
 105                                                      vhArray, f, VarHandleTestMethodHandleAccessInt::testArrayUnsupported,
 106                                                      false));
 107             cases.add(new MethodHandleAccessTestCase("Array index out of bounds",
 108                                                      vhArray, f, VarHandleTestMethodHandleAccessInt::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(VarHandleTestMethodHandleAccessInt recv, Handles hs) throws Throwable {
 134         // Plain
 135         {
 136             hs.get(TestAccessMode.SET).invokeExact(recv, 0x01234567);
 137             int x = (int) hs.get(TestAccessMode.GET).invokeExact(recv);
 138             assertEquals(x, 0x01234567, "set int value");
 139         }
 140 
 141 
 142         // Volatile
 143         {
 144             hs.get(TestAccessMode.SET_VOLATILE).invokeExact(recv, 0x89ABCDEF);
 145             int x = (int) hs.get(TestAccessMode.GET_VOLATILE).invokeExact(recv);
 146             assertEquals(x, 0x89ABCDEF, "setVolatile int value");
 147         }
 148 
 149         // Lazy
 150         {
 151             hs.get(TestAccessMode.SET_RELEASE).invokeExact(recv, 0x01234567);
 152             int x = (int) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact(recv);
 153             assertEquals(x, 0x01234567, "setRelease int value");
 154         }
 155 
 156         // Opaque
 157         {
 158             hs.get(TestAccessMode.SET_OPAQUE).invokeExact(recv, 0x89ABCDEF);
 159             int x = (int) hs.get(TestAccessMode.GET_OPAQUE).invokeExact(recv);
 160             assertEquals(x, 0x89ABCDEF, "setOpaque int value");
 161         }
 162 
 163         hs.get(TestAccessMode.SET).invokeExact(recv, 0x01234567);
 164 
 165         // Compare
 166         {
 167             boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(recv, 0x01234567, 0x89ABCDEF);
 168             assertEquals(r, true, "success compareAndSet int");
 169             int x = (int) hs.get(TestAccessMode.GET).invokeExact(recv);
 170             assertEquals(x, 0x89ABCDEF, "success compareAndSet int value");
 171         }
 172 
 173         {
 174             boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(recv, 0x01234567, 0xCAFEBABE);
 175             assertEquals(r, false, "failing compareAndSet int");
 176             int x = (int) hs.get(TestAccessMode.GET).invokeExact(recv);
 177             assertEquals(x, 0x89ABCDEF, "failing compareAndSet int value");
 178         }
 179 
 180         {
 181             int r = (int) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(recv, 0x89ABCDEF, 0x01234567);
 182             assertEquals(r, 0x89ABCDEF, "success compareAndExchange int");
 183             int x = (int) hs.get(TestAccessMode.GET).invokeExact(recv);
 184             assertEquals(x, 0x01234567, "success compareAndExchange int value");
 185         }
 186 
 187         {
 188             int r = (int) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(recv, 0x89ABCDEF, 0xCAFEBABE);
 189             assertEquals(r, 0x01234567, "failing compareAndExchange int");
 190             int x = (int) hs.get(TestAccessMode.GET).invokeExact(recv);
 191             assertEquals(x, 0x01234567, "failing compareAndExchange int value");
 192         }
 193 
 194         {
 195             int r = (int) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(recv, 0x01234567, 0x89ABCDEF);
 196             assertEquals(r, 0x01234567, "success compareAndExchangeAcquire int");
 197             int x = (int) hs.get(TestAccessMode.GET).invokeExact(recv);
 198             assertEquals(x, 0x89ABCDEF, "success compareAndExchangeAcquire int value");
 199         }
 200 
 201         {
 202             int r = (int) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(recv, 0x01234567, 0xCAFEBABE);
 203             assertEquals(r, 0x89ABCDEF, "failing compareAndExchangeAcquire int");
 204             int x = (int) hs.get(TestAccessMode.GET).invokeExact(recv);
 205             assertEquals(x, 0x89ABCDEF, "failing compareAndExchangeAcquire int value");
 206         }
 207 
 208         {
 209             int r = (int) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(recv, 0x89ABCDEF, 0x01234567);
 210             assertEquals(r, 0x89ABCDEF, "success compareAndExchangeRelease int");
 211             int x = (int) hs.get(TestAccessMode.GET).invokeExact(recv);
 212             assertEquals(x, 0x01234567, "success compareAndExchangeRelease int value");
 213         }
 214 
 215         {
 216             int r = (int) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(recv, 0x89ABCDEF, 0xCAFEBABE);
 217             assertEquals(r, 0x01234567, "failing compareAndExchangeRelease int");
 218             int x = (int) hs.get(TestAccessMode.GET).invokeExact(recv);
 219             assertEquals(x, 0x01234567, "failing compareAndExchangeRelease int 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, 0x01234567, 0x89ABCDEF);
 226             }
 227             assertEquals(success, true, "weakCompareAndSetPlain int");
 228             int x = (int) hs.get(TestAccessMode.GET).invokeExact(recv);
 229             assertEquals(x, 0x89ABCDEF, "weakCompareAndSetPlain int 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, 0x89ABCDEF, 0x01234567);
 236             }
 237             assertEquals(success, true, "weakCompareAndSetAcquire int");
 238             int x = (int) hs.get(TestAccessMode.GET).invokeExact(recv);
 239             assertEquals(x, 0x01234567, "weakCompareAndSetAcquire int");
 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, 0x01234567, 0x89ABCDEF);
 246             }
 247             assertEquals(success, true, "weakCompareAndSetRelease int");
 248             int x = (int) hs.get(TestAccessMode.GET).invokeExact(recv);
 249             assertEquals(x, 0x89ABCDEF, "weakCompareAndSetRelease int");
 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, 0x89ABCDEF, 0x01234567);
 256             }
 257             assertEquals(success, true, "weakCompareAndSet int");
 258             int x = (int) hs.get(TestAccessMode.GET).invokeExact(recv);
 259             assertEquals(x, 0x01234567, "weakCompareAndSet int");
 260         }
 261 
 262         // Compare set and get
 263         {
 264             int o = (int) hs.get(TestAccessMode.GET_AND_SET).invokeExact(recv, 0x89ABCDEF);
 265             assertEquals(o, 0x01234567, "getAndSet int");
 266             int x = (int) hs.get(TestAccessMode.GET).invokeExact(recv);
 267             assertEquals(x, 0x89ABCDEF, "getAndSet int value");
 268         }
 269 
 270         // get and add, add and get
 271         {
 272             hs.get(TestAccessMode.SET).invokeExact(recv, 0x01234567);
 273 
 274             int o = (int) hs.get(TestAccessMode.GET_AND_ADD).invokeExact(recv, 0x89ABCDEF);
 275             assertEquals(o, 0x01234567, "getAndAdd int");
 276             int x = (int) hs.get(TestAccessMode.GET).invokeExact(recv);
 277             assertEquals(x, (int)(0x01234567 + 0x89ABCDEF), "getAndAdd int value");
 278         }
 279 
 280         {
 281             hs.get(TestAccessMode.SET).invokeExact(recv, 0x01234567);
 282 
 283             int o = (int) hs.get(TestAccessMode.GET_AND_ADD_ACQUIRE).invokeExact(recv, 0x89ABCDEF);
 284             assertEquals(o, 0x01234567, "getAndAddAcquire int");
 285             int x = (int) hs.get(TestAccessMode.GET).invokeExact(recv);
 286             assertEquals(x, (int)(0x01234567 + 0x89ABCDEF), "getAndAddAcquire int value");
 287         }
 288 
 289         {
 290             hs.get(TestAccessMode.SET).invokeExact(recv, 0x01234567);
 291 
 292             int o = (int) hs.get(TestAccessMode.GET_AND_ADD_RELEASE).invokeExact(recv, 0x89ABCDEF);
 293             assertEquals(o, 0x01234567, "getAndAddRelease int");
 294             int x = (int) hs.get(TestAccessMode.GET).invokeExact(recv);
 295             assertEquals(x, (int)(0x01234567 + 0x89ABCDEF), "getAndAddRelease int value");
 296         }
 297 
 298         // get and bitwise or
 299         {
 300             hs.get(TestAccessMode.SET).invokeExact(recv, 0x01234567);
 301 
 302             int o = (int) hs.get(TestAccessMode.GET_AND_BITWISE_OR).invokeExact(recv, 0x89ABCDEF);
 303             assertEquals(o, 0x01234567, "getAndBitwiseOr int");
 304             int x = (int) hs.get(TestAccessMode.GET).invokeExact(recv);
 305             assertEquals(x, (int)(0x01234567 | 0x89ABCDEF), "getAndBitwiseOr int value");
 306         }
 307 
 308         {
 309             hs.get(TestAccessMode.SET).invokeExact(recv, 0x01234567);
 310 
 311             int o = (int) hs.get(TestAccessMode.GET_AND_BITWISE_OR_ACQUIRE).invokeExact(recv, 0x89ABCDEF);
 312             assertEquals(o, 0x01234567, "getAndBitwiseOrAcquire int");
 313             int x = (int) hs.get(TestAccessMode.GET).invokeExact(recv);
 314             assertEquals(x, (int)(0x01234567 | 0x89ABCDEF), "getAndBitwiseOrAcquire int value");
 315         }
 316 
 317         {
 318             hs.get(TestAccessMode.SET).invokeExact(recv, 0x01234567);
 319 
 320             int o = (int) hs.get(TestAccessMode.GET_AND_BITWISE_OR_RELEASE).invokeExact(recv, 0x89ABCDEF);
 321             assertEquals(o, 0x01234567, "getAndBitwiseOrRelease int");
 322             int x = (int) hs.get(TestAccessMode.GET).invokeExact(recv);
 323             assertEquals(x, (int)(0x01234567 | 0x89ABCDEF), "getAndBitwiseOrRelease int value");
 324         }
 325 
 326         // get and bitwise and
 327         {
 328             hs.get(TestAccessMode.SET).invokeExact(recv, 0x01234567);
 329 
 330             int o = (int) hs.get(TestAccessMode.GET_AND_BITWISE_AND).invokeExact(recv, 0x89ABCDEF);
 331             assertEquals(o, 0x01234567, "getAndBitwiseAnd int");
 332             int x = (int) hs.get(TestAccessMode.GET).invokeExact(recv);
 333             assertEquals(x, (int)(0x01234567 & 0x89ABCDEF), "getAndBitwiseAnd int value");
 334         }
 335 
 336         {
 337             hs.get(TestAccessMode.SET).invokeExact(recv, 0x01234567);
 338 
 339             int o = (int) hs.get(TestAccessMode.GET_AND_BITWISE_AND_ACQUIRE).invokeExact(recv, 0x89ABCDEF);
 340             assertEquals(o, 0x01234567, "getAndBitwiseAndAcquire int");
 341             int x = (int) hs.get(TestAccessMode.GET).invokeExact(recv);
 342             assertEquals(x, (int)(0x01234567 & 0x89ABCDEF), "getAndBitwiseAndAcquire int value");
 343         }
 344 
 345         {
 346             hs.get(TestAccessMode.SET).invokeExact(recv, 0x01234567);
 347 
 348             int o = (int) hs.get(TestAccessMode.GET_AND_BITWISE_AND_RELEASE).invokeExact(recv, 0x89ABCDEF);
 349             assertEquals(o, 0x01234567, "getAndBitwiseAndRelease int");
 350             int x = (int) hs.get(TestAccessMode.GET).invokeExact(recv);
 351             assertEquals(x, (int)(0x01234567 & 0x89ABCDEF), "getAndBitwiseAndRelease int value");
 352         }
 353 
 354         // get and bitwise xor
 355         {
 356             hs.get(TestAccessMode.SET).invokeExact(recv, 0x01234567);
 357 
 358             int o = (int) hs.get(TestAccessMode.GET_AND_BITWISE_XOR).invokeExact(recv, 0x89ABCDEF);
 359             assertEquals(o, 0x01234567, "getAndBitwiseXor int");
 360             int x = (int) hs.get(TestAccessMode.GET).invokeExact(recv);
 361             assertEquals(x, (int)(0x01234567 ^ 0x89ABCDEF), "getAndBitwiseXor int value");
 362         }
 363 
 364         {
 365             hs.get(TestAccessMode.SET).invokeExact(recv, 0x01234567);
 366 
 367             int o = (int) hs.get(TestAccessMode.GET_AND_BITWISE_XOR_ACQUIRE).invokeExact(recv, 0x89ABCDEF);
 368             assertEquals(o, 0x01234567, "getAndBitwiseXorAcquire int");
 369             int x = (int) hs.get(TestAccessMode.GET).invokeExact(recv);
 370             assertEquals(x, (int)(0x01234567 ^ 0x89ABCDEF), "getAndBitwiseXorAcquire int value");
 371         }
 372 
 373         {
 374             hs.get(TestAccessMode.SET).invokeExact(recv, 0x01234567);
 375 
 376             int o = (int) hs.get(TestAccessMode.GET_AND_BITWISE_XOR_RELEASE).invokeExact(recv, 0x89ABCDEF);
 377             assertEquals(o, 0x01234567, "getAndBitwiseXorRelease int");
 378             int x = (int) hs.get(TestAccessMode.GET).invokeExact(recv);
 379             assertEquals(x, (int)(0x01234567 ^ 0x89ABCDEF), "getAndBitwiseXorRelease int value");
 380         }
 381     }
 382 
 383     static void testInstanceFieldUnsupported(VarHandleTestMethodHandleAccessInt recv, Handles hs) throws Throwable {
 384 
 385 
 386     }
 387 
 388     static void testValueTypeField(Value recv, Handles hs) throws Throwable {
 389         // Plain
 390         {
 391             int x = (int) hs.get(TestAccessMode.GET).invokeExact(recv);
 392             assertEquals(x, 0x01234567, "get int 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, 0x01234567);
 401             });
 402         }
 403 
 404 
 405     }
 406 
 407     static void testStaticField(Handles hs) throws Throwable {
 408         // Plain
 409         {
 410             hs.get(TestAccessMode.SET).invokeExact(0x01234567);
 411             int x = (int) hs.get(TestAccessMode.GET).invokeExact();
 412             assertEquals(x, 0x01234567, "set int value");
 413         }
 414 
 415 
 416         // Volatile
 417         {
 418             hs.get(TestAccessMode.SET_VOLATILE).invokeExact(0x89ABCDEF);
 419             int x = (int) hs.get(TestAccessMode.GET_VOLATILE).invokeExact();
 420             assertEquals(x, 0x89ABCDEF, "setVolatile int value");
 421         }
 422 
 423         // Lazy
 424         {
 425             hs.get(TestAccessMode.SET_RELEASE).invokeExact(0x01234567);
 426             int x = (int) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact();
 427             assertEquals(x, 0x01234567, "setRelease int value");
 428         }
 429 
 430         // Opaque
 431         {
 432             hs.get(TestAccessMode.SET_OPAQUE).invokeExact(0x89ABCDEF);
 433             int x = (int) hs.get(TestAccessMode.GET_OPAQUE).invokeExact();
 434             assertEquals(x, 0x89ABCDEF, "setOpaque int value");
 435         }
 436 
 437         hs.get(TestAccessMode.SET).invokeExact(0x01234567);
 438 
 439         // Compare
 440         {
 441             boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(0x01234567, 0x89ABCDEF);
 442             assertEquals(r, true, "success compareAndSet int");
 443             int x = (int) hs.get(TestAccessMode.GET).invokeExact();
 444             assertEquals(x, 0x89ABCDEF, "success compareAndSet int value");
 445         }
 446 
 447         {
 448             boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(0x01234567, 0xCAFEBABE);
 449             assertEquals(r, false, "failing compareAndSet int");
 450             int x = (int) hs.get(TestAccessMode.GET).invokeExact();
 451             assertEquals(x, 0x89ABCDEF, "failing compareAndSet int value");
 452         }
 453 
 454         {
 455             int r = (int) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(0x89ABCDEF, 0x01234567);
 456             assertEquals(r, 0x89ABCDEF, "success compareAndExchange int");
 457             int x = (int) hs.get(TestAccessMode.GET).invokeExact();
 458             assertEquals(x, 0x01234567, "success compareAndExchange int value");
 459         }
 460 
 461         {
 462             int r = (int) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(0x89ABCDEF, 0xCAFEBABE);
 463             assertEquals(r, 0x01234567, "failing compareAndExchange int");
 464             int x = (int) hs.get(TestAccessMode.GET).invokeExact();
 465             assertEquals(x, 0x01234567, "failing compareAndExchange int value");
 466         }
 467 
 468         {
 469             int r = (int) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(0x01234567, 0x89ABCDEF);
 470             assertEquals(r, 0x01234567, "success compareAndExchangeAcquire int");
 471             int x = (int) hs.get(TestAccessMode.GET).invokeExact();
 472             assertEquals(x, 0x89ABCDEF, "success compareAndExchangeAcquire int value");
 473         }
 474 
 475         {
 476             int r = (int) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(0x01234567, 0xCAFEBABE);
 477             assertEquals(r, 0x89ABCDEF, "failing compareAndExchangeAcquire int");
 478             int x = (int) hs.get(TestAccessMode.GET).invokeExact();
 479             assertEquals(x, 0x89ABCDEF, "failing compareAndExchangeAcquire int value");
 480         }
 481 
 482         {
 483             int r = (int) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(0x89ABCDEF, 0x01234567);
 484             assertEquals(r, 0x89ABCDEF, "success compareAndExchangeRelease int");
 485             int x = (int) hs.get(TestAccessMode.GET).invokeExact();
 486             assertEquals(x, 0x01234567, "success compareAndExchangeRelease int value");
 487         }
 488 
 489         {
 490             int r = (int) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(0x89ABCDEF, 0xCAFEBABE);
 491             assertEquals(r, 0x01234567, "failing compareAndExchangeRelease int");
 492             int x = (int) hs.get(TestAccessMode.GET).invokeExact();
 493             assertEquals(x, 0x01234567, "failing compareAndExchangeRelease int 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(0x01234567, 0x89ABCDEF);
 500             }
 501             assertEquals(success, true, "weakCompareAndSetPlain int");
 502             int x = (int) hs.get(TestAccessMode.GET).invokeExact();
 503             assertEquals(x, 0x89ABCDEF, "weakCompareAndSetPlain int 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(0x89ABCDEF, 0x01234567);
 510             }
 511             assertEquals(success, true, "weakCompareAndSetAcquire int");
 512             int x = (int) hs.get(TestAccessMode.GET).invokeExact();
 513             assertEquals(x, 0x01234567, "weakCompareAndSetAcquire int");
 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(0x01234567, 0x89ABCDEF);
 520             }
 521             assertEquals(success, true, "weakCompareAndSetRelease int");
 522             int x = (int) hs.get(TestAccessMode.GET).invokeExact();
 523             assertEquals(x, 0x89ABCDEF, "weakCompareAndSetRelease int");
 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(0x89ABCDEF, 0x01234567);
 530             }
 531             assertEquals(success, true, "weakCompareAndSet int");
 532             int x = (int) hs.get(TestAccessMode.GET).invokeExact();
 533             assertEquals(x, 0x01234567, "weakCompareAndSet int");
 534         }
 535 
 536         // Compare set and get
 537         {
 538             hs.get(TestAccessMode.SET).invokeExact(0x01234567);
 539 
 540             int o = (int) hs.get(TestAccessMode.GET_AND_SET).invokeExact(0x89ABCDEF);
 541             assertEquals(o, 0x01234567, "getAndSet int");
 542             int x = (int) hs.get(TestAccessMode.GET).invokeExact();
 543             assertEquals(x, 0x89ABCDEF, "getAndSet int value");
 544         }
 545 
 546         // Compare set and get
 547         {
 548             hs.get(TestAccessMode.SET).invokeExact(0x01234567);
 549 
 550             int o = (int) hs.get(TestAccessMode.GET_AND_SET_ACQUIRE).invokeExact(0x89ABCDEF);
 551             assertEquals(o, 0x01234567, "getAndSetAcquire int");
 552             int x = (int) hs.get(TestAccessMode.GET).invokeExact();
 553             assertEquals(x, 0x89ABCDEF, "getAndSetAcquire int value");
 554         }
 555 
 556         // Compare set and get
 557         {
 558             hs.get(TestAccessMode.SET).invokeExact(0x01234567);
 559 
 560             int o = (int) hs.get(TestAccessMode.GET_AND_SET_RELEASE).invokeExact(0x89ABCDEF);
 561             assertEquals(o, 0x01234567, "getAndSetRelease int");
 562             int x = (int) hs.get(TestAccessMode.GET).invokeExact();
 563             assertEquals(x, 0x89ABCDEF, "getAndSetRelease int value");
 564         }
 565 
 566         // get and add, add and get
 567         {
 568             hs.get(TestAccessMode.SET).invokeExact(0x01234567);
 569 
 570             int o = (int) hs.get(TestAccessMode.GET_AND_ADD).invokeExact(0x89ABCDEF);
 571             assertEquals(o, 0x01234567, "getAndAdd int");
 572             int x = (int) hs.get(TestAccessMode.GET).invokeExact();
 573             assertEquals(x, (int)(0x01234567 + 0x89ABCDEF), "getAndAdd int value");
 574         }
 575 
 576         {
 577             hs.get(TestAccessMode.SET).invokeExact(0x01234567);
 578 
 579             int o = (int) hs.get(TestAccessMode.GET_AND_ADD_ACQUIRE).invokeExact(0x89ABCDEF);
 580             assertEquals(o, 0x01234567, "getAndAddAcquire int");
 581             int x = (int) hs.get(TestAccessMode.GET).invokeExact();
 582             assertEquals(x, (int)(0x01234567 + 0x89ABCDEF), "getAndAddAcquire int value");
 583         }
 584 
 585         {
 586             hs.get(TestAccessMode.SET).invokeExact(0x01234567);
 587 
 588             int o = (int) hs.get(TestAccessMode.GET_AND_ADD_RELEASE).invokeExact(0x89ABCDEF);
 589             assertEquals(o, 0x01234567, "getAndAddRelease int");
 590             int x = (int) hs.get(TestAccessMode.GET).invokeExact();
 591             assertEquals(x, (int)(0x01234567 + 0x89ABCDEF), "getAndAddRelease int value");
 592         }
 593 
 594         // get and bitwise or
 595         {
 596             hs.get(TestAccessMode.SET).invokeExact(0x01234567);
 597 
 598             int o = (int) hs.get(TestAccessMode.GET_AND_BITWISE_OR).invokeExact(0x89ABCDEF);
 599             assertEquals(o, 0x01234567, "getAndBitwiseOr int");
 600             int x = (int) hs.get(TestAccessMode.GET).invokeExact();
 601             assertEquals(x, (int)(0x01234567 | 0x89ABCDEF), "getAndBitwiseOr int value");
 602         }
 603 
 604         {
 605             hs.get(TestAccessMode.SET).invokeExact(0x01234567);
 606 
 607             int o = (int) hs.get(TestAccessMode.GET_AND_BITWISE_OR_ACQUIRE).invokeExact(0x89ABCDEF);
 608             assertEquals(o, 0x01234567, "getAndBitwiseOrAcquire int");
 609             int x = (int) hs.get(TestAccessMode.GET).invokeExact();
 610             assertEquals(x, (int)(0x01234567 | 0x89ABCDEF), "getAndBitwiseOrAcquire int value");
 611         }
 612 
 613         {
 614             hs.get(TestAccessMode.SET).invokeExact(0x01234567);
 615 
 616             int o = (int) hs.get(TestAccessMode.GET_AND_BITWISE_OR_RELEASE).invokeExact(0x89ABCDEF);
 617             assertEquals(o, 0x01234567, "getAndBitwiseOrRelease int");
 618             int x = (int) hs.get(TestAccessMode.GET).invokeExact();
 619             assertEquals(x, (int)(0x01234567 | 0x89ABCDEF), "getAndBitwiseOrRelease int value");
 620         }
 621 
 622         // get and bitwise and
 623         {
 624             hs.get(TestAccessMode.SET).invokeExact(0x01234567);
 625 
 626             int o = (int) hs.get(TestAccessMode.GET_AND_BITWISE_AND).invokeExact(0x89ABCDEF);
 627             assertEquals(o, 0x01234567, "getAndBitwiseAnd int");
 628             int x = (int) hs.get(TestAccessMode.GET).invokeExact();
 629             assertEquals(x, (int)(0x01234567 & 0x89ABCDEF), "getAndBitwiseAnd int value");
 630         }
 631 
 632         {
 633             hs.get(TestAccessMode.SET).invokeExact(0x01234567);
 634 
 635             int o = (int) hs.get(TestAccessMode.GET_AND_BITWISE_AND_ACQUIRE).invokeExact(0x89ABCDEF);
 636             assertEquals(o, 0x01234567, "getAndBitwiseAndAcquire int");
 637             int x = (int) hs.get(TestAccessMode.GET).invokeExact();
 638             assertEquals(x, (int)(0x01234567 & 0x89ABCDEF), "getAndBitwiseAndAcquire int value");
 639         }
 640 
 641         {
 642             hs.get(TestAccessMode.SET).invokeExact(0x01234567);
 643 
 644             int o = (int) hs.get(TestAccessMode.GET_AND_BITWISE_AND_RELEASE).invokeExact(0x89ABCDEF);
 645             assertEquals(o, 0x01234567, "getAndBitwiseAndRelease int");
 646             int x = (int) hs.get(TestAccessMode.GET).invokeExact();
 647             assertEquals(x, (int)(0x01234567 & 0x89ABCDEF), "getAndBitwiseAndRelease int value");
 648         }
 649 
 650         // get and bitwise xor
 651         {
 652             hs.get(TestAccessMode.SET).invokeExact(0x01234567);
 653 
 654             int o = (int) hs.get(TestAccessMode.GET_AND_BITWISE_XOR).invokeExact(0x89ABCDEF);
 655             assertEquals(o, 0x01234567, "getAndBitwiseXor int");
 656             int x = (int) hs.get(TestAccessMode.GET).invokeExact();
 657             assertEquals(x, (int)(0x01234567 ^ 0x89ABCDEF), "getAndBitwiseXor int value");
 658         }
 659 
 660         {
 661             hs.get(TestAccessMode.SET).invokeExact(0x01234567);
 662 
 663             int o = (int) hs.get(TestAccessMode.GET_AND_BITWISE_XOR_ACQUIRE).invokeExact(0x89ABCDEF);
 664             assertEquals(o, 0x01234567, "getAndBitwiseXorAcquire int");
 665             int x = (int) hs.get(TestAccessMode.GET).invokeExact();
 666             assertEquals(x, (int)(0x01234567 ^ 0x89ABCDEF), "getAndBitwiseXorAcquire int value");
 667         }
 668 
 669         {
 670             hs.get(TestAccessMode.SET).invokeExact(0x01234567);
 671 
 672             int o = (int) hs.get(TestAccessMode.GET_AND_BITWISE_XOR_RELEASE).invokeExact(0x89ABCDEF);
 673             assertEquals(o, 0x01234567, "getAndBitwiseXorRelease int");
 674             int x = (int) hs.get(TestAccessMode.GET).invokeExact();
 675             assertEquals(x, (int)(0x01234567 ^ 0x89ABCDEF), "getAndBitwiseXorRelease int 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         int[] array = new int[10];
 687 
 688         for (int i = 0; i < array.length; i++) {
 689             // Plain
 690             {
 691                 hs.get(TestAccessMode.SET).invokeExact(array, i, 0x01234567);
 692                 int x = (int) hs.get(TestAccessMode.GET).invokeExact(array, i);
 693                 assertEquals(x, 0x01234567, "get int value");
 694             }
 695 
 696 
 697             // Volatile
 698             {
 699                 hs.get(TestAccessMode.SET_VOLATILE).invokeExact(array, i, 0x89ABCDEF);
 700                 int x = (int) hs.get(TestAccessMode.GET_VOLATILE).invokeExact(array, i);
 701                 assertEquals(x, 0x89ABCDEF, "setVolatile int value");
 702             }
 703 
 704             // Lazy
 705             {
 706                 hs.get(TestAccessMode.SET_RELEASE).invokeExact(array, i, 0x01234567);
 707                 int x = (int) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact(array, i);
 708                 assertEquals(x, 0x01234567, "setRelease int value");
 709             }
 710 
 711             // Opaque
 712             {
 713                 hs.get(TestAccessMode.SET_OPAQUE).invokeExact(array, i, 0x89ABCDEF);
 714                 int x = (int) hs.get(TestAccessMode.GET_OPAQUE).invokeExact(array, i);
 715                 assertEquals(x, 0x89ABCDEF, "setOpaque int value");
 716             }
 717 
 718             hs.get(TestAccessMode.SET).invokeExact(array, i, 0x01234567);
 719 
 720             // Compare
 721             {
 722                 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(array, i, 0x01234567, 0x89ABCDEF);
 723                 assertEquals(r, true, "success compareAndSet int");
 724                 int x = (int) hs.get(TestAccessMode.GET).invokeExact(array, i);
 725                 assertEquals(x, 0x89ABCDEF, "success compareAndSet int value");
 726             }
 727 
 728             {
 729                 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(array, i, 0x01234567, 0xCAFEBABE);
 730                 assertEquals(r, false, "failing compareAndSet int");
 731                 int x = (int) hs.get(TestAccessMode.GET).invokeExact(array, i);
 732                 assertEquals(x, 0x89ABCDEF, "failing compareAndSet int value");
 733             }
 734 
 735             {
 736                 int r = (int) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(array, i, 0x89ABCDEF, 0x01234567);
 737                 assertEquals(r, 0x89ABCDEF, "success compareAndExchange int");
 738                 int x = (int) hs.get(TestAccessMode.GET).invokeExact(array, i);
 739                 assertEquals(x, 0x01234567, "success compareAndExchange int value");
 740             }
 741 
 742             {
 743                 int r = (int) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(array, i, 0x89ABCDEF, 0xCAFEBABE);
 744                 assertEquals(r, 0x01234567, "failing compareAndExchange int");
 745                 int x = (int) hs.get(TestAccessMode.GET).invokeExact(array, i);
 746                 assertEquals(x, 0x01234567, "failing compareAndExchange int value");
 747             }
 748 
 749             {
 750                 int r = (int) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(array, i, 0x01234567, 0x89ABCDEF);
 751                 assertEquals(r, 0x01234567, "success compareAndExchangeAcquire int");
 752                 int x = (int) hs.get(TestAccessMode.GET).invokeExact(array, i);
 753                 assertEquals(x, 0x89ABCDEF, "success compareAndExchangeAcquire int value");
 754             }
 755 
 756             {
 757                 int r = (int) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(array, i, 0x01234567, 0xCAFEBABE);
 758                 assertEquals(r, 0x89ABCDEF, "failing compareAndExchangeAcquire int");
 759                 int x = (int) hs.get(TestAccessMode.GET).invokeExact(array, i);
 760                 assertEquals(x, 0x89ABCDEF, "failing compareAndExchangeAcquire int value");
 761             }
 762 
 763             {
 764                 int r = (int) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(array, i, 0x89ABCDEF, 0x01234567);
 765                 assertEquals(r, 0x89ABCDEF, "success compareAndExchangeRelease int");
 766                 int x = (int) hs.get(TestAccessMode.GET).invokeExact(array, i);
 767                 assertEquals(x, 0x01234567, "success compareAndExchangeRelease int value");
 768             }
 769 
 770             {
 771                 int r = (int) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(array, i, 0x89ABCDEF, 0xCAFEBABE);
 772                 assertEquals(r, 0x01234567, "failing compareAndExchangeRelease int");
 773                 int x = (int) hs.get(TestAccessMode.GET).invokeExact(array, i);
 774                 assertEquals(x, 0x01234567, "failing compareAndExchangeRelease int 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, 0x01234567, 0x89ABCDEF);
 781                 }
 782                 assertEquals(success, true, "weakCompareAndSetPlain int");
 783                 int x = (int) hs.get(TestAccessMode.GET).invokeExact(array, i);
 784                 assertEquals(x, 0x89ABCDEF, "weakCompareAndSetPlain int 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, 0x89ABCDEF, 0x01234567);
 791                 }
 792                 assertEquals(success, true, "weakCompareAndSetAcquire int");
 793                 int x = (int) hs.get(TestAccessMode.GET).invokeExact(array, i);
 794                 assertEquals(x, 0x01234567, "weakCompareAndSetAcquire int");
 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, 0x01234567, 0x89ABCDEF);
 801                 }
 802                 assertEquals(success, true, "weakCompareAndSetRelease int");
 803                 int x = (int) hs.get(TestAccessMode.GET).invokeExact(array, i);
 804                 assertEquals(x, 0x89ABCDEF, "weakCompareAndSetRelease int");
 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, 0x89ABCDEF, 0x01234567);
 811                 }
 812                 assertEquals(success, true, "weakCompareAndSet int");
 813                 int x = (int) hs.get(TestAccessMode.GET).invokeExact(array, i);
 814                 assertEquals(x, 0x01234567, "weakCompareAndSet int");
 815             }
 816 
 817             // Compare set and get
 818             {
 819                 hs.get(TestAccessMode.SET).invokeExact(array, i, 0x01234567);
 820 
 821                 int o = (int) hs.get(TestAccessMode.GET_AND_SET).invokeExact(array, i, 0x89ABCDEF);
 822                 assertEquals(o, 0x01234567, "getAndSet int");
 823                 int x = (int) hs.get(TestAccessMode.GET).invokeExact(array, i);
 824                 assertEquals(x, 0x89ABCDEF, "getAndSet int value");
 825             }
 826 
 827             {
 828                 hs.get(TestAccessMode.SET).invokeExact(array, i, 0x01234567);
 829 
 830                 int o = (int) hs.get(TestAccessMode.GET_AND_SET_ACQUIRE).invokeExact(array, i, 0x89ABCDEF);
 831                 assertEquals(o, 0x01234567, "getAndSetAcquire int");
 832                 int x = (int) hs.get(TestAccessMode.GET).invokeExact(array, i);
 833                 assertEquals(x, 0x89ABCDEF, "getAndSetAcquire int value");
 834             }
 835 
 836             {
 837                 hs.get(TestAccessMode.SET).invokeExact(array, i, 0x01234567);
 838 
 839                 int o = (int) hs.get(TestAccessMode.GET_AND_SET_RELEASE).invokeExact(array, i, 0x89ABCDEF);
 840                 assertEquals(o, 0x01234567, "getAndSetRelease int");
 841                 int x = (int) hs.get(TestAccessMode.GET).invokeExact(array, i);
 842                 assertEquals(x, 0x89ABCDEF, "getAndSetRelease int value");
 843             }
 844 
 845             // get and add, add and get
 846             {
 847                 hs.get(TestAccessMode.SET).invokeExact(array, i, 0x01234567);
 848 
 849                 int o = (int) hs.get(TestAccessMode.GET_AND_ADD).invokeExact(array, i, 0x89ABCDEF);
 850                 assertEquals(o, 0x01234567, "getAndAdd int");
 851                 int x = (int) hs.get(TestAccessMode.GET).invokeExact(array, i);
 852                 assertEquals(x, (int)(0x01234567 + 0x89ABCDEF), "getAndAdd int value");
 853             }
 854 
 855             {
 856                 hs.get(TestAccessMode.SET).invokeExact(array, i, 0x01234567);
 857 
 858                 int o = (int) hs.get(TestAccessMode.GET_AND_ADD_ACQUIRE).invokeExact(array, i, 0x89ABCDEF);
 859                 assertEquals(o, 0x01234567, "getAndAddAcquire int");
 860                 int x = (int) hs.get(TestAccessMode.GET).invokeExact(array, i);
 861                 assertEquals(x, (int)(0x01234567 + 0x89ABCDEF), "getAndAddAcquire int value");
 862             }
 863 
 864             {
 865                 hs.get(TestAccessMode.SET).invokeExact(array, i, 0x01234567);
 866 
 867                 int o = (int) hs.get(TestAccessMode.GET_AND_ADD_RELEASE).invokeExact(array, i, 0x89ABCDEF);
 868                 assertEquals(o, 0x01234567, "getAndAddRelease int");
 869                 int x = (int) hs.get(TestAccessMode.GET).invokeExact(array, i);
 870                 assertEquals(x, (int)(0x01234567 + 0x89ABCDEF), "getAndAddRelease int value");
 871             }
 872 
 873         // get and bitwise or
 874         {
 875             hs.get(TestAccessMode.SET).invokeExact(array, i, 0x01234567);
 876 
 877             int o = (int) hs.get(TestAccessMode.GET_AND_BITWISE_OR).invokeExact(array, i, 0x89ABCDEF);
 878             assertEquals(o, 0x01234567, "getAndBitwiseOr int");
 879             int x = (int) hs.get(TestAccessMode.GET).invokeExact(array, i);
 880             assertEquals(x, (int)(0x01234567 | 0x89ABCDEF), "getAndBitwiseOr int value");
 881         }
 882 
 883         {
 884             hs.get(TestAccessMode.SET).invokeExact(array, i, 0x01234567);
 885 
 886             int o = (int) hs.get(TestAccessMode.GET_AND_BITWISE_OR_ACQUIRE).invokeExact(array, i, 0x89ABCDEF);
 887             assertEquals(o, 0x01234567, "getAndBitwiseOrAcquire int");
 888             int x = (int) hs.get(TestAccessMode.GET).invokeExact(array, i);
 889             assertEquals(x, (int)(0x01234567 | 0x89ABCDEF), "getAndBitwiseOrAcquire int value");
 890         }
 891 
 892         {
 893             hs.get(TestAccessMode.SET).invokeExact(array, i, 0x01234567);
 894 
 895             int o = (int) hs.get(TestAccessMode.GET_AND_BITWISE_OR_RELEASE).invokeExact(array, i, 0x89ABCDEF);
 896             assertEquals(o, 0x01234567, "getAndBitwiseOrRelease int");
 897             int x = (int) hs.get(TestAccessMode.GET).invokeExact(array, i);
 898             assertEquals(x, (int)(0x01234567 | 0x89ABCDEF), "getAndBitwiseOrRelease int value");
 899         }
 900 
 901         // get and bitwise and
 902         {
 903             hs.get(TestAccessMode.SET).invokeExact(array, i, 0x01234567);
 904 
 905             int o = (int) hs.get(TestAccessMode.GET_AND_BITWISE_AND).invokeExact(array, i, 0x89ABCDEF);
 906             assertEquals(o, 0x01234567, "getAndBitwiseAnd int");
 907             int x = (int) hs.get(TestAccessMode.GET).invokeExact(array, i);
 908             assertEquals(x, (int)(0x01234567 & 0x89ABCDEF), "getAndBitwiseAnd int value");
 909         }
 910 
 911         {
 912             hs.get(TestAccessMode.SET).invokeExact(array, i, 0x01234567);
 913 
 914             int o = (int) hs.get(TestAccessMode.GET_AND_BITWISE_AND_ACQUIRE).invokeExact(array, i, 0x89ABCDEF);
 915             assertEquals(o, 0x01234567, "getAndBitwiseAndAcquire int");
 916             int x = (int) hs.get(TestAccessMode.GET).invokeExact(array, i);
 917             assertEquals(x, (int)(0x01234567 & 0x89ABCDEF), "getAndBitwiseAndAcquire int value");
 918         }
 919 
 920         {
 921             hs.get(TestAccessMode.SET).invokeExact(array, i, 0x01234567);
 922 
 923             int o = (int) hs.get(TestAccessMode.GET_AND_BITWISE_AND_RELEASE).invokeExact(array, i, 0x89ABCDEF);
 924             assertEquals(o, 0x01234567, "getAndBitwiseAndRelease int");
 925             int x = (int) hs.get(TestAccessMode.GET).invokeExact(array, i);
 926             assertEquals(x, (int)(0x01234567 & 0x89ABCDEF), "getAndBitwiseAndRelease int value");
 927         }
 928 
 929         // get and bitwise xor
 930         {
 931             hs.get(TestAccessMode.SET).invokeExact(array, i, 0x01234567);
 932 
 933             int o = (int) hs.get(TestAccessMode.GET_AND_BITWISE_XOR).invokeExact(array, i, 0x89ABCDEF);
 934             assertEquals(o, 0x01234567, "getAndBitwiseXor int");
 935             int x = (int) hs.get(TestAccessMode.GET).invokeExact(array, i);
 936             assertEquals(x, (int)(0x01234567 ^ 0x89ABCDEF), "getAndBitwiseXor int value");
 937         }
 938 
 939         {
 940             hs.get(TestAccessMode.SET).invokeExact(array, i, 0x01234567);
 941 
 942             int o = (int) hs.get(TestAccessMode.GET_AND_BITWISE_XOR_ACQUIRE).invokeExact(array, i, 0x89ABCDEF);
 943             assertEquals(o, 0x01234567, "getAndBitwiseXorAcquire int");
 944             int x = (int) hs.get(TestAccessMode.GET).invokeExact(array, i);
 945             assertEquals(x, (int)(0x01234567 ^ 0x89ABCDEF), "getAndBitwiseXorAcquire int value");
 946         }
 947 
 948         {
 949             hs.get(TestAccessMode.SET).invokeExact(array, i, 0x01234567);
 950 
 951             int o = (int) hs.get(TestAccessMode.GET_AND_BITWISE_XOR_RELEASE).invokeExact(array, i, 0x89ABCDEF);
 952             assertEquals(o, 0x01234567, "getAndBitwiseXorRelease int");
 953             int x = (int) hs.get(TestAccessMode.GET).invokeExact(array, i);
 954             assertEquals(x, (int)(0x01234567 ^ 0x89ABCDEF), "getAndBitwiseXorRelease int value");
 955         }
 956         }
 957     }
 958 
 959     static void testArrayUnsupported(Handles hs) throws Throwable {
 960         int[] array = new int[10];
 961 
 962         final int i = 0;
 963 
 964 
 965     }
 966 
 967     static void testArrayIndexOutOfBounds(Handles hs) throws Throwable {
 968         int[] array = new int[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                     int x = (int) 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, 0x01234567);
 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, 0x01234567, 0x89ABCDEF);
 988                 });
 989             }
 990 
 991             for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_EXCHANGE)) {
 992                 checkIOOBE(am, () -> {
 993                     int r = (int) hs.get(am).invokeExact(array, ci, 0x89ABCDEF, 0x01234567);
 994                 });
 995             }
 996 
 997             for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_SET)) {
 998                 checkIOOBE(am, () -> {
 999                     int o = (int) hs.get(am).invokeExact(array, ci, 0x01234567);
1000                 });
1001             }
1002 
1003             for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_ADD)) {
1004                 checkIOOBE(am, () -> {
1005                     int o = (int) hs.get(am).invokeExact(array, ci, 0xCAFEBABE);
1006                 });
1007             }
1008 
1009             for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_BITWISE)) {
1010                 checkIOOBE(am, () -> {
1011                     int o = (int) hs.get(am).invokeExact(array, ci, 0xCAFEBABE);
1012                 });
1013             }
1014         }
1015     }
1016 }
1017