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