1 /*
   2  * Copyright (c) 2015, 2016, 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 -Diters=20000 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 = 1;
  43 
  44     static int static_v;
  45 
  46     final int final_v = 1;
  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     @BeforeClass
  61     public void setup() throws Exception {
  62         vhFinalField = MethodHandles.lookup().findVarHandle(
  63                 VarHandleTestMethodHandleAccessInt.class, "final_v", int.class);
  64 
  65         vhField = MethodHandles.lookup().findVarHandle(
  66                 VarHandleTestMethodHandleAccessInt.class, "v", int.class);
  67 
  68         vhStaticFinalField = MethodHandles.lookup().findStaticVarHandle(
  69             VarHandleTestMethodHandleAccessInt.class, "static_final_v", int.class);
  70 
  71         vhStaticField = MethodHandles.lookup().findStaticVarHandle(
  72             VarHandleTestMethodHandleAccessInt.class, "static_v", int.class);
  73 
  74         vhArray = MethodHandles.arrayElementVarHandle(int[].class);
  75     }
  76 
  77 
  78     @DataProvider
  79     public Object[][] accessTestCaseProvider() throws Exception {
  80         List<AccessTestCase<?>> cases = new ArrayList<>();
  81 
  82         for (VarHandleToMethodHandle f : VarHandleToMethodHandle.values()) {
  83             cases.add(new MethodHandleAccessTestCase("Instance field",
  84                                                      vhField, f, hs -> testInstanceField(this, hs)));
  85             cases.add(new MethodHandleAccessTestCase("Instance field unsupported",
  86                                                      vhField, f, hs -> testInstanceFieldUnsupported(this, hs),
  87                                                      false));
  88 
  89             cases.add(new MethodHandleAccessTestCase("Static field",
  90                                                      vhStaticField, f, VarHandleTestMethodHandleAccessInt::testStaticField));
  91             cases.add(new MethodHandleAccessTestCase("Static field unsupported",
  92                                                      vhStaticField, f, VarHandleTestMethodHandleAccessInt::testStaticFieldUnsupported,
  93                                                      false));
  94 
  95             cases.add(new MethodHandleAccessTestCase("Array",
  96                                                      vhArray, f, VarHandleTestMethodHandleAccessInt::testArray));
  97             cases.add(new MethodHandleAccessTestCase("Array unsupported",
  98                                                      vhArray, f, VarHandleTestMethodHandleAccessInt::testArrayUnsupported,
  99                                                      false));
 100             cases.add(new MethodHandleAccessTestCase("Array index out of bounds",
 101                                                      vhArray, f, VarHandleTestMethodHandleAccessInt::testArrayIndexOutOfBounds,
 102                                                      false));
 103         }
 104 
 105         // Work around issue with jtreg summary reporting which truncates
 106         // the String result of Object.toString to 30 characters, hence
 107         // the first dummy argument
 108         return cases.stream().map(tc -> new Object[]{tc.toString(), tc}).toArray(Object[][]::new);
 109     }
 110 
 111     @Test(dataProvider = "accessTestCaseProvider")
 112     public <T> void testAccess(String desc, AccessTestCase<T> atc) throws Throwable {
 113         T t = atc.get();
 114         int iters = atc.requiresLoop() ? ITERS : 1;
 115         for (int c = 0; c < iters; c++) {
 116             atc.testAccess(t);
 117         }
 118     }
 119 
 120 
 121     static void testInstanceField(VarHandleTestMethodHandleAccessInt recv, Handles hs) throws Throwable {
 122         // Plain
 123         {
 124             hs.get(TestAccessMode.SET).invokeExact(recv, 1);
 125             int x = (int) hs.get(TestAccessMode.GET).invokeExact(recv);
 126             assertEquals(x, 1, "set int value");
 127         }
 128 
 129 
 130         // Volatile
 131         {
 132             hs.get(TestAccessMode.SET_VOLATILE).invokeExact(recv, 2);
 133             int x = (int) hs.get(TestAccessMode.GET_VOLATILE).invokeExact(recv);
 134             assertEquals(x, 2, "setVolatile int value");
 135         }
 136 
 137         // Lazy
 138         {
 139             hs.get(TestAccessMode.SET_RELEASE).invokeExact(recv, 1);
 140             int x = (int) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact(recv);
 141             assertEquals(x, 1, "setRelease int value");
 142         }
 143 
 144         // Opaque
 145         {
 146             hs.get(TestAccessMode.SET_OPAQUE).invokeExact(recv, 2);
 147             int x = (int) hs.get(TestAccessMode.GET_OPAQUE).invokeExact(recv);
 148             assertEquals(x, 2, "setOpaque int value");
 149         }
 150 
 151         hs.get(TestAccessMode.SET).invokeExact(recv, 1);
 152 
 153         // Compare
 154         {
 155             boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(recv, 1, 2);
 156             assertEquals(r, true, "success compareAndSet int");
 157             int x = (int) hs.get(TestAccessMode.GET).invokeExact(recv);
 158             assertEquals(x, 2, "success compareAndSet int value");
 159         }
 160 
 161         {
 162             boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(recv, 1, 3);
 163             assertEquals(r, false, "failing compareAndSet int");
 164             int x = (int) hs.get(TestAccessMode.GET).invokeExact(recv);
 165             assertEquals(x, 2, "failing compareAndSet int value");
 166         }
 167 
 168         {
 169             int r = (int) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_VOLATILE).invokeExact(recv, 2, 1);
 170             assertEquals(r, 2, "success compareAndExchangeVolatile int");
 171             int x = (int) hs.get(TestAccessMode.GET).invokeExact(recv);
 172             assertEquals(x, 1, "success compareAndExchangeVolatile int value");
 173         }
 174 
 175         {
 176             int r = (int) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_VOLATILE).invokeExact(recv, 2, 3);
 177             assertEquals(r, 1, "failing compareAndExchangeVolatile int");
 178             int x = (int) hs.get(TestAccessMode.GET).invokeExact(recv);
 179             assertEquals(x, 1, "failing compareAndExchangeVolatile int value");
 180         }
 181 
 182         {
 183             int r = (int) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(recv, 1, 2);
 184             assertEquals(r, 1, "success compareAndExchangeAcquire int");
 185             int x = (int) hs.get(TestAccessMode.GET).invokeExact(recv);
 186             assertEquals(x, 2, "success compareAndExchangeAcquire int value");
 187         }
 188 
 189         {
 190             int r = (int) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(recv, 1, 3);
 191             assertEquals(r, 2, "failing compareAndExchangeAcquire int");
 192             int x = (int) hs.get(TestAccessMode.GET).invokeExact(recv);
 193             assertEquals(x, 2, "failing compareAndExchangeAcquire int value");
 194         }
 195 
 196         {
 197             int r = (int) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(recv, 2, 1);
 198             assertEquals(r, 2, "success compareAndExchangeRelease int");
 199             int x = (int) hs.get(TestAccessMode.GET).invokeExact(recv);
 200             assertEquals(x, 1, "success compareAndExchangeRelease int value");
 201         }
 202 
 203         {
 204             int r = (int) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(recv, 2, 3);
 205             assertEquals(r, 1, "failing compareAndExchangeRelease int");
 206             int x = (int) hs.get(TestAccessMode.GET).invokeExact(recv);
 207             assertEquals(x, 1, "failing compareAndExchangeRelease int value");
 208         }
 209 
 210         {
 211             boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(recv, 1, 2);
 212             assertEquals(r, true, "weakCompareAndSet int");
 213             int x = (int) hs.get(TestAccessMode.GET).invokeExact(recv);
 214             assertEquals(x, 2, "weakCompareAndSet int value");
 215         }
 216 
 217         {
 218             boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(recv, 2, 1);
 219             assertEquals(r, true, "weakCompareAndSetAcquire int");
 220             int x = (int) hs.get(TestAccessMode.GET).invokeExact(recv);
 221             assertEquals(x, 1, "weakCompareAndSetAcquire int");
 222         }
 223 
 224         {
 225             boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(recv, 1, 2);
 226             assertEquals(r, true, "weakCompareAndSetRelease int");
 227             int x = (int) hs.get(TestAccessMode.GET).invokeExact(recv);
 228             assertEquals(x, 2, "weakCompareAndSetRelease int");
 229         }
 230 
 231         // Compare set and get
 232         {
 233             int o = (int) hs.get(TestAccessMode.GET_AND_SET).invokeExact(recv, 1);
 234             assertEquals(o, 2, "getAndSet int");
 235             int x = (int) hs.get(TestAccessMode.GET).invokeExact(recv);
 236             assertEquals(x, 1, "getAndSet int value");
 237         }
 238 
 239         hs.get(TestAccessMode.SET).invokeExact(recv, 1);
 240 
 241         // get and add, add and get
 242         {
 243             int o = (int) hs.get(TestAccessMode.GET_AND_ADD).invokeExact(recv, 3);
 244             assertEquals(o, 1, "getAndAdd int");
 245             int c = (int) hs.get(TestAccessMode.ADD_AND_GET).invokeExact(recv, 3);
 246             assertEquals(c, 1 + 3 + 3, "getAndAdd int value");
 247         }
 248     }
 249 
 250     static void testInstanceFieldUnsupported(VarHandleTestMethodHandleAccessInt recv, Handles hs) throws Throwable {
 251 
 252     }
 253 
 254 
 255     static void testStaticField(Handles hs) throws Throwable {
 256         // Plain
 257         {
 258             hs.get(TestAccessMode.SET).invokeExact(1);
 259             int x = (int) hs.get(TestAccessMode.GET).invokeExact();
 260             assertEquals(x, 1, "set int value");
 261         }
 262 
 263 
 264         // Volatile
 265         {
 266             hs.get(TestAccessMode.SET_VOLATILE).invokeExact(2);
 267             int x = (int) hs.get(TestAccessMode.GET_VOLATILE).invokeExact();
 268             assertEquals(x, 2, "setVolatile int value");
 269         }
 270 
 271         // Lazy
 272         {
 273             hs.get(TestAccessMode.SET_RELEASE).invokeExact(1);
 274             int x = (int) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact();
 275             assertEquals(x, 1, "setRelease int value");
 276         }
 277 
 278         // Opaque
 279         {
 280             hs.get(TestAccessMode.SET_OPAQUE).invokeExact(2);
 281             int x = (int) hs.get(TestAccessMode.GET_OPAQUE).invokeExact();
 282             assertEquals(x, 2, "setOpaque int value");
 283         }
 284 
 285         hs.get(TestAccessMode.SET).invokeExact(1);
 286 
 287         // Compare
 288         {
 289             boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(1, 2);
 290             assertEquals(r, true, "success compareAndSet int");
 291             int x = (int) hs.get(TestAccessMode.GET).invokeExact();
 292             assertEquals(x, 2, "success compareAndSet int value");
 293         }
 294 
 295         {
 296             boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(1, 3);
 297             assertEquals(r, false, "failing compareAndSet int");
 298             int x = (int) hs.get(TestAccessMode.GET).invokeExact();
 299             assertEquals(x, 2, "failing compareAndSet int value");
 300         }
 301 
 302         {
 303             int r = (int) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_VOLATILE).invokeExact(2, 1);
 304             assertEquals(r, 2, "success compareAndExchangeVolatile int");
 305             int x = (int) hs.get(TestAccessMode.GET).invokeExact();
 306             assertEquals(x, 1, "success compareAndExchangeVolatile int value");
 307         }
 308 
 309         {
 310             int r = (int) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_VOLATILE).invokeExact(2, 3);
 311             assertEquals(r, 1, "failing compareAndExchangeVolatile int");
 312             int x = (int) hs.get(TestAccessMode.GET).invokeExact();
 313             assertEquals(x, 1, "failing compareAndExchangeVolatile int value");
 314         }
 315 
 316         {
 317             int r = (int) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(1, 2);
 318             assertEquals(r, 1, "success compareAndExchangeAcquire int");
 319             int x = (int) hs.get(TestAccessMode.GET).invokeExact();
 320             assertEquals(x, 2, "success compareAndExchangeAcquire int value");
 321         }
 322 
 323         {
 324             int r = (int) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(1, 3);
 325             assertEquals(r, 2, "failing compareAndExchangeAcquire int");
 326             int x = (int) hs.get(TestAccessMode.GET).invokeExact();
 327             assertEquals(x, 2, "failing compareAndExchangeAcquire int value");
 328         }
 329 
 330         {
 331             int r = (int) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(2, 1);
 332             assertEquals(r, 2, "success compareAndExchangeRelease int");
 333             int x = (int) hs.get(TestAccessMode.GET).invokeExact();
 334             assertEquals(x, 1, "success compareAndExchangeRelease int value");
 335         }
 336 
 337         {
 338             int r = (int) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(2, 3);
 339             assertEquals(r, 1, "failing compareAndExchangeRelease int");
 340             int x = (int) hs.get(TestAccessMode.GET).invokeExact();
 341             assertEquals(x, 1, "failing compareAndExchangeRelease int value");
 342         }
 343 
 344         {
 345             boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(1, 2);
 346             assertEquals(r, true, "weakCompareAndSet int");
 347             int x = (int) hs.get(TestAccessMode.GET).invokeExact();
 348             assertEquals(x, 2, "weakCompareAndSet int value");
 349         }
 350 
 351         {
 352             boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(2, 1);
 353             assertEquals(r, true, "weakCompareAndSetAcquire int");
 354             int x = (int) hs.get(TestAccessMode.GET).invokeExact();
 355             assertEquals(x, 1, "weakCompareAndSetAcquire int");
 356         }
 357 
 358         {
 359             boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact( 1, 2);
 360             assertEquals(r, true, "weakCompareAndSetRelease int");
 361             int x = (int) hs.get(TestAccessMode.GET).invokeExact();
 362             assertEquals(x, 2, "weakCompareAndSetRelease int");
 363         }
 364 
 365         // Compare set and get
 366         {
 367             int o = (int) hs.get(TestAccessMode.GET_AND_SET).invokeExact( 1);
 368             assertEquals(o, 2, "getAndSet int");
 369             int x = (int) hs.get(TestAccessMode.GET).invokeExact();
 370             assertEquals(x, 1, "getAndSet int value");
 371         }
 372 
 373         hs.get(TestAccessMode.SET).invokeExact(1);
 374 
 375         // get and add, add and get
 376         {
 377             int o = (int) hs.get(TestAccessMode.GET_AND_ADD).invokeExact( 3);
 378             assertEquals(o, 1, "getAndAdd int");
 379             int c = (int) hs.get(TestAccessMode.ADD_AND_GET).invokeExact(3);
 380             assertEquals(c, 1 + 3 + 3, "getAndAdd int value");
 381         }
 382     }
 383 
 384     static void testStaticFieldUnsupported(Handles hs) throws Throwable {
 385 
 386     }
 387 
 388 
 389     static void testArray(Handles hs) throws Throwable {
 390         int[] array = new int[10];
 391 
 392         for (int i = 0; i < array.length; i++) {
 393             // Plain
 394             {
 395                 hs.get(TestAccessMode.SET).invokeExact(array, i, 1);
 396                 int x = (int) hs.get(TestAccessMode.GET).invokeExact(array, i);
 397                 assertEquals(x, 1, "get int value");
 398             }
 399 
 400 
 401             // Volatile
 402             {
 403                 hs.get(TestAccessMode.SET_VOLATILE).invokeExact(array, i, 2);
 404                 int x = (int) hs.get(TestAccessMode.GET_VOLATILE).invokeExact(array, i);
 405                 assertEquals(x, 2, "setVolatile int value");
 406             }
 407 
 408             // Lazy
 409             {
 410                 hs.get(TestAccessMode.SET_RELEASE).invokeExact(array, i, 1);
 411                 int x = (int) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact(array, i);
 412                 assertEquals(x, 1, "setRelease int value");
 413             }
 414 
 415             // Opaque
 416             {
 417                 hs.get(TestAccessMode.SET_OPAQUE).invokeExact(array, i, 2);
 418                 int x = (int) hs.get(TestAccessMode.GET_OPAQUE).invokeExact(array, i);
 419                 assertEquals(x, 2, "setOpaque int value");
 420             }
 421 
 422             hs.get(TestAccessMode.SET).invokeExact(array, i, 1);
 423 
 424             // Compare
 425             {
 426                 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(array, i, 1, 2);
 427                 assertEquals(r, true, "success compareAndSet int");
 428                 int x = (int) hs.get(TestAccessMode.GET).invokeExact(array, i);
 429                 assertEquals(x, 2, "success compareAndSet int value");
 430             }
 431 
 432             {
 433                 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(array, i, 1, 3);
 434                 assertEquals(r, false, "failing compareAndSet int");
 435                 int x = (int) hs.get(TestAccessMode.GET).invokeExact(array, i);
 436                 assertEquals(x, 2, "failing compareAndSet int value");
 437             }
 438 
 439             {
 440                 int r = (int) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_VOLATILE).invokeExact(array, i, 2, 1);
 441                 assertEquals(r, 2, "success compareAndExchangeVolatile int");
 442                 int x = (int) hs.get(TestAccessMode.GET).invokeExact(array, i);
 443                 assertEquals(x, 1, "success compareAndExchangeVolatile int value");
 444             }
 445 
 446             {
 447                 int r = (int) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_VOLATILE).invokeExact(array, i, 2, 3);
 448                 assertEquals(r, 1, "failing compareAndExchangeVolatile int");
 449                 int x = (int) hs.get(TestAccessMode.GET).invokeExact(array, i);
 450                 assertEquals(x, 1, "failing compareAndExchangeVolatile int value");
 451             }
 452 
 453             {
 454                 int r = (int) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(array, i, 1, 2);
 455                 assertEquals(r, 1, "success compareAndExchangeAcquire int");
 456                 int x = (int) hs.get(TestAccessMode.GET).invokeExact(array, i);
 457                 assertEquals(x, 2, "success compareAndExchangeAcquire int value");
 458             }
 459 
 460             {
 461                 int r = (int) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(array, i, 1, 3);
 462                 assertEquals(r, 2, "failing compareAndExchangeAcquire int");
 463                 int x = (int) hs.get(TestAccessMode.GET).invokeExact(array, i);
 464                 assertEquals(x, 2, "failing compareAndExchangeAcquire int value");
 465             }
 466 
 467             {
 468                 int r = (int) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(array, i, 2, 1);
 469                 assertEquals(r, 2, "success compareAndExchangeRelease int");
 470                 int x = (int) hs.get(TestAccessMode.GET).invokeExact(array, i);
 471                 assertEquals(x, 1, "success compareAndExchangeRelease int value");
 472             }
 473 
 474             {
 475                 int r = (int) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(array, i, 2, 3);
 476                 assertEquals(r, 1, "failing compareAndExchangeRelease int");
 477                 int x = (int) hs.get(TestAccessMode.GET).invokeExact(array, i);
 478                 assertEquals(x, 1, "failing compareAndExchangeRelease int value");
 479             }
 480 
 481             {
 482                 boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(array, i, 1, 2);
 483                 assertEquals(r, true, "weakCompareAndSet int");
 484                 int x = (int) hs.get(TestAccessMode.GET).invokeExact(array, i);
 485                 assertEquals(x, 2, "weakCompareAndSet int value");
 486             }
 487 
 488             {
 489                 boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(array, i, 2, 1);
 490                 assertEquals(r, true, "weakCompareAndSetAcquire int");
 491                 int x = (int) hs.get(TestAccessMode.GET).invokeExact(array, i);
 492                 assertEquals(x, 1, "weakCompareAndSetAcquire int");
 493             }
 494 
 495             {
 496                 boolean r = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(array, i, 1, 2);
 497                 assertEquals(r, true, "weakCompareAndSetRelease int");
 498                 int x = (int) hs.get(TestAccessMode.GET).invokeExact(array, i);
 499                 assertEquals(x, 2, "weakCompareAndSetRelease int");
 500             }
 501 
 502             // Compare set and get
 503             {
 504                 int o = (int) hs.get(TestAccessMode.GET_AND_SET).invokeExact(array, i, 1);
 505                 assertEquals(o, 2, "getAndSet int");
 506                 int x = (int) hs.get(TestAccessMode.GET).invokeExact(array, i);
 507                 assertEquals(x, 1, "getAndSet int value");
 508             }
 509 
 510             hs.get(TestAccessMode.SET).invokeExact(array, i, 1);
 511 
 512             // get and add, add and get
 513             {
 514                 int o = (int) hs.get(TestAccessMode.GET_AND_ADD).invokeExact(array, i, 3);
 515                 assertEquals(o, 1, "getAndAdd int");
 516                 int c = (int) hs.get(TestAccessMode.ADD_AND_GET).invokeExact(array, i, 3);
 517                 assertEquals(c, 1 + 3 + 3, "getAndAdd int value");
 518             }
 519         }
 520     }
 521 
 522     static void testArrayUnsupported(Handles hs) throws Throwable {
 523         int[] array = new int[10];
 524 
 525         final int i = 0;
 526 
 527     }
 528 
 529     static void testArrayIndexOutOfBounds(Handles hs) throws Throwable {
 530         int[] array = new int[10];
 531 
 532         for (int i : new int[]{-1, Integer.MIN_VALUE, 10, 11, Integer.MAX_VALUE}) {
 533             final int ci = i;
 534 
 535             for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET)) {
 536                 checkIOOBE(am, () -> {
 537                     int x = (int) hs.get(am).invokeExact(array, ci);
 538                 });
 539             }
 540 
 541             for (TestAccessMode am : testAccessModesOfType(TestAccessType.SET)) {
 542                 checkIOOBE(am, () -> {
 543                     hs.get(am).invokeExact(array, ci, 1);
 544                 });
 545             }
 546 
 547             for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_SET)) {
 548                 checkIOOBE(am, () -> {
 549                     boolean r = (boolean) hs.get(am).invokeExact(array, ci, 1, 2);
 550                 });
 551             }
 552 
 553             for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_EXCHANGE)) {
 554                 checkIOOBE(am, () -> {
 555                     int r = (int) hs.get(am).invokeExact(array, ci, 2, 1);
 556                 });
 557             }
 558 
 559             for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_SET)) {
 560                 checkIOOBE(am, () -> {
 561                     int o = (int) hs.get(am).invokeExact(array, ci, 1);
 562                 });
 563             }
 564 
 565             for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_ADD)) {
 566                 checkIOOBE(am, () -> {
 567                     int o = (int) hs.get(am).invokeExact(array, ci, 3);
 568                 });
 569             }
 570         }
 571     }
 572 }
 573