1 /*
   2  * Copyright (c) 2015, 2025, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 // -- This file was mechanically generated: Do not edit! -- //
  25 
  26 /*
  27  * @test
  28  * @enablePreview
  29  * @modules java.base/jdk.internal.vm.annotation
  30  * @run junit/othervm -Diters=10   -Xint                                                   VarHandleTestAccessValue
  31  *
  32  * @comment Set CompileThresholdScaling to 0.1 so that the warmup loop sets to 2000 iterations
  33  *          to hit compilation thresholds
  34  *
  35  * @run junit/othervm -Diters=2000 -XX:CompileThresholdScaling=0.1 -XX:TieredStopAtLevel=1 VarHandleTestAccessValue
  36  * @run junit/othervm -Diters=2000 -XX:CompileThresholdScaling=0.1                         VarHandleTestAccessValue
  37  * @run junit/othervm -Diters=2000 -XX:CompileThresholdScaling=0.1 -XX:-TieredCompilation  VarHandleTestAccessValue
  38  */
  39 
  40 import java.lang.invoke.MethodHandles;
  41 import java.lang.invoke.VarHandle;
  42 import java.util.ArrayList;
  43 import java.util.Arrays;
  44 import java.util.List;
  45 
  46 import static org.junit.jupiter.api.Assertions.*;
  47 import org.junit.jupiter.api.BeforeAll;
  48 import org.junit.jupiter.api.Test;
  49 import org.junit.jupiter.api.TestInstance;
  50 import org.junit.jupiter.params.ParameterizedTest;
  51 import org.junit.jupiter.params.provider.MethodSource;
  52 
  53 @TestInstance(TestInstance.Lifecycle.PER_CLASS)
  54 public class VarHandleTestAccessValue extends VarHandleBaseTest {
  55     static final Value static_final_v = Value.getInstance(10);
  56 
  57     static Value static_v;
  58 
  59     final Value final_v = Value.getInstance(10);
  60 
  61     Value v;
  62 
  63     static final Value static_final_v2 = Value.getInstance(10);
  64 
  65     static Value static_v2;
  66 
  67     final Value final_v2 = Value.getInstance(10);
  68 
  69     Value v2;
  70 
  71     VarHandle vhFinalField;
  72 
  73     VarHandle vhField;
  74 
  75     VarHandle vhStaticField;
  76 
  77     VarHandle vhStaticFinalField;
  78 
  79     VarHandle vhArray;
  80 
  81     VarHandle vhArrayObject;
  82 
  83     VarHandle[] allocate(boolean same) {
  84         List<VarHandle> vhs = new ArrayList<>();
  85 
  86         String postfix = same ? "" : "2";
  87         VarHandle vh;
  88         try {
  89             vh = MethodHandles.lookup().findVarHandle(
  90                     VarHandleTestAccessValue.class, "final_v" + postfix, Value.class);
  91             vhs.add(vh);
  92 
  93             vh = MethodHandles.lookup().findVarHandle(
  94                     VarHandleTestAccessValue.class, "v" + postfix, Value.class);
  95             vhs.add(vh);
  96 
  97             vh = MethodHandles.lookup().findStaticVarHandle(
  98                 VarHandleTestAccessValue.class, "static_final_v" + postfix, Value.class);
  99             vhs.add(vh);
 100 
 101             vh = MethodHandles.lookup().findStaticVarHandle(
 102                 VarHandleTestAccessValue.class, "static_v" + postfix, Value.class);
 103             vhs.add(vh);
 104 
 105             if (same) {
 106                 vh = MethodHandles.arrayElementVarHandle(Value[].class);
 107             }
 108             else {
 109                 vh = MethodHandles.arrayElementVarHandle(String[].class);
 110             }
 111             vhs.add(vh);
 112         } catch (Exception e) {
 113             throw new InternalError(e);
 114         }
 115         return vhs.toArray(new VarHandle[0]);
 116     }
 117 
 118     @BeforeAll
 119     public void setup() throws Exception {
 120         vhFinalField = MethodHandles.lookup().findVarHandle(
 121                 VarHandleTestAccessValue.class, "final_v", Value.class);
 122 
 123         vhField = MethodHandles.lookup().findVarHandle(
 124                 VarHandleTestAccessValue.class, "v", Value.class);
 125 
 126         vhStaticFinalField = MethodHandles.lookup().findStaticVarHandle(
 127             VarHandleTestAccessValue.class, "static_final_v", Value.class);
 128 
 129         vhStaticField = MethodHandles.lookup().findStaticVarHandle(
 130             VarHandleTestAccessValue.class, "static_v", Value.class);
 131 
 132         vhArray = MethodHandles.arrayElementVarHandle(Value[].class);
 133         vhArrayObject = MethodHandles.arrayElementVarHandle(Object[].class);
 134     }
 135 
 136     public Object[][] varHandlesProvider() throws Exception {
 137         List<VarHandle> vhs = new ArrayList<>();
 138         vhs.add(vhField);
 139         vhs.add(vhStaticField);
 140         vhs.add(vhArray);
 141 
 142         return vhs.stream().map(tc -> new Object[]{tc}).toArray(Object[][]::new);
 143     }
 144 
 145     @Test
 146     public void testEquals() {
 147         VarHandle[] vhs1 = allocate(true);
 148         VarHandle[] vhs2 = allocate(true);
 149 
 150         for (int i = 0; i < vhs1.length; i++) {
 151             for (int j = 0; j < vhs1.length; j++) {
 152                 if (i != j) {
 153                     assertNotEquals(vhs1[i], vhs1[j]);
 154                     assertNotEquals(vhs1[i], vhs2[j]);
 155                 }
 156             }
 157         }
 158 
 159         VarHandle[] vhs3 = allocate(false);
 160         for (int i = 0; i < vhs1.length; i++) {
 161             assertNotEquals(vhs1[i], vhs3[i]);
 162         }
 163     }
 164 
 165     @ParameterizedTest
 166     @MethodSource("varHandlesProvider")
 167     public void testIsAccessModeSupported(VarHandle vh) {
 168         assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET));
 169         assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET));
 170         assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_VOLATILE));
 171         assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET_VOLATILE));
 172         assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_ACQUIRE));
 173         assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET_RELEASE));
 174         assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_OPAQUE));
 175         assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET_OPAQUE));
 176 
 177         assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_SET));
 178         assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE));
 179         assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_ACQUIRE));
 180         assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_RELEASE));
 181         assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_PLAIN));
 182         assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET));
 183         assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE));
 184         assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE));
 185         assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET));
 186         assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET_ACQUIRE));
 187         assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET_RELEASE));
 188 
 189         assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD));
 190         assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD_ACQUIRE));
 191         assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD_RELEASE));
 192 
 193         assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_OR));
 194         assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_OR_ACQUIRE));
 195         assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_OR_RELEASE));
 196         assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_AND));
 197         assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_AND_ACQUIRE));
 198         assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_AND_RELEASE));
 199         assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_XOR));
 200         assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_XOR_ACQUIRE));
 201         assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_XOR_RELEASE));
 202     }
 203 
 204     public Object[][] typesProvider() throws Exception {
 205         List<Object[]> types = new ArrayList<>();
 206         types.add(new Object[] {vhField, Arrays.asList(VarHandleTestAccessValue.class)});
 207         types.add(new Object[] {vhStaticField, Arrays.asList()});
 208         types.add(new Object[] {vhArray, Arrays.asList(Value[].class, int.class)});
 209 
 210         return types.stream().toArray(Object[][]::new);
 211     }
 212 
 213     @ParameterizedTest
 214     @MethodSource("typesProvider")
 215     public void testTypes(VarHandle vh, List<Class<?>> pts) {
 216         assertEquals(Value.class, vh.varType());
 217 
 218         assertEquals(pts, vh.coordinateTypes());
 219 
 220         testTypes(vh);
 221     }
 222 
 223     @Test
 224     public void testLookupInstanceToStatic() {
 225         checkIAE("Lookup of static final field to instance final field", () -> {
 226             MethodHandles.lookup().findStaticVarHandle(
 227                     VarHandleTestAccessValue.class, "final_v", Value.class);
 228         });
 229 
 230         checkIAE("Lookup of static field to instance field", () -> {
 231             MethodHandles.lookup().findStaticVarHandle(
 232                     VarHandleTestAccessValue.class, "v", Value.class);
 233         });
 234     }
 235 
 236     @Test
 237     public void testLookupStaticToInstance() {
 238         checkIAE("Lookup of instance final field to static final field", () -> {
 239             MethodHandles.lookup().findVarHandle(
 240                 VarHandleTestAccessValue.class, "static_final_v", Value.class);
 241         });
 242 
 243         checkIAE("Lookup of instance field to static field", () -> {
 244             vhStaticField = MethodHandles.lookup().findVarHandle(
 245                 VarHandleTestAccessValue.class, "static_v", Value.class);
 246         });
 247     }
 248 
 249     public Object[][] accessTestCaseProvider() throws Exception {
 250         List<AccessTestCase<?>> cases = new ArrayList<>();
 251 
 252         cases.add(new VarHandleAccessTestCase("Instance final field",
 253                                               vhFinalField, vh -> testInstanceFinalField(this, vh)));
 254         cases.add(new VarHandleAccessTestCase("Instance final field unsupported",
 255                                               vhFinalField, vh -> testInstanceFinalFieldUnsupported(this, vh),
 256                                               false));
 257 
 258         cases.add(new VarHandleAccessTestCase("Static final field",
 259                                               vhStaticFinalField, VarHandleTestAccessValue::testStaticFinalField));
 260         cases.add(new VarHandleAccessTestCase("Static final field unsupported",
 261                                               vhStaticFinalField, VarHandleTestAccessValue::testStaticFinalFieldUnsupported,
 262                                               false));
 263 
 264         cases.add(new VarHandleAccessTestCase("Instance field",
 265                                               vhField, vh -> testInstanceField(this, vh)));
 266         cases.add(new VarHandleAccessTestCase("Instance field unsupported",
 267                                               vhField, vh -> testInstanceFieldUnsupported(this, vh),
 268                                               false));
 269 
 270         cases.add(new VarHandleAccessTestCase("Static field",
 271                                               vhStaticField, VarHandleTestAccessValue::testStaticField));
 272         cases.add(new VarHandleAccessTestCase("Static field unsupported",
 273                                               vhStaticField, VarHandleTestAccessValue::testStaticFieldUnsupported,
 274                                               false));
 275 
 276         cases.add(new VarHandleAccessTestCase("Array",
 277                                               vhArray, VarHandleTestAccessValue::testArray));
 278         cases.add(new VarHandleAccessTestCase("Array Object[]",
 279                                               vhArrayObject, VarHandleTestAccessValue::testArray));
 280         cases.add(new VarHandleAccessTestCase("Array unsupported",
 281                                               vhArray, VarHandleTestAccessValue::testArrayUnsupported,
 282                                               false));
 283         cases.add(new VarHandleAccessTestCase("Array index out of bounds",
 284                                               vhArray, VarHandleTestAccessValue::testArrayIndexOutOfBounds,
 285                                               false));
 286         cases.add(new VarHandleAccessTestCase("Array store exception",
 287                                               vhArrayObject, VarHandleTestAccessValue::testArrayStoreException,
 288                                               false));
 289         // Work around issue with jtreg summary reporting which truncates
 290         // the String result of Object.toString to 30 characters, hence
 291         // the first dummy argument
 292         return cases.stream().map(tc -> new Object[]{tc.toString(), tc}).toArray(Object[][]::new);
 293     }
 294 
 295     @ParameterizedTest
 296     @MethodSource("accessTestCaseProvider")
 297     public <T> void testAccess(String desc, AccessTestCase<T> atc) throws Throwable {
 298         T t = atc.get();
 299         int iters = atc.requiresLoop() ? ITERS : 1;
 300         for (int c = 0; c < iters; c++) {
 301             atc.testAccess(t);
 302         }
 303     }
 304 
 305     static void testInstanceFinalField(VarHandleTestAccessValue recv, VarHandle vh) {
 306         // Plain
 307         {
 308             Value x = (Value) vh.get(recv);
 309             assertEquals(Value.getInstance(10), x, "get Value value");
 310         }
 311 
 312 
 313         // Volatile
 314         {
 315             Value x = (Value) vh.getVolatile(recv);
 316             assertEquals(Value.getInstance(10), x, "getVolatile Value value");
 317         }
 318 
 319         // Lazy
 320         {
 321             Value x = (Value) vh.getAcquire(recv);
 322             assertEquals(Value.getInstance(10), x, "getRelease Value value");
 323         }
 324 
 325         // Opaque
 326         {
 327             Value x = (Value) vh.getOpaque(recv);
 328             assertEquals(Value.getInstance(10), x, "getOpaque Value value");
 329         }
 330     }
 331 
 332     static void testInstanceFinalFieldUnsupported(VarHandleTestAccessValue recv, VarHandle vh) {
 333         checkUOE(() -> {
 334             vh.set(recv, Value.getInstance(20));
 335         });
 336 
 337         checkUOE(() -> {
 338             vh.setVolatile(recv, Value.getInstance(20));
 339         });
 340 
 341         checkUOE(() -> {
 342             vh.setRelease(recv, Value.getInstance(20));
 343         });
 344 
 345         checkUOE(() -> {
 346             vh.setOpaque(recv, Value.getInstance(20));
 347         });
 348 
 349 
 350         checkUOE(() -> {
 351             Value o = (Value) vh.getAndAdd(recv, Value.getInstance(10));
 352         });
 353 
 354         checkUOE(() -> {
 355             Value o = (Value) vh.getAndAddAcquire(recv, Value.getInstance(10));
 356         });
 357 
 358         checkUOE(() -> {
 359             Value o = (Value) vh.getAndAddRelease(recv, Value.getInstance(10));
 360         });
 361 
 362         checkUOE(() -> {
 363             Value o = (Value) vh.getAndBitwiseOr(recv, Value.getInstance(10));
 364         });
 365 
 366         checkUOE(() -> {
 367             Value o = (Value) vh.getAndBitwiseOrAcquire(recv, Value.getInstance(10));
 368         });
 369 
 370         checkUOE(() -> {
 371             Value o = (Value) vh.getAndBitwiseOrRelease(recv, Value.getInstance(10));
 372         });
 373 
 374         checkUOE(() -> {
 375             Value o = (Value) vh.getAndBitwiseAnd(recv, Value.getInstance(10));
 376         });
 377 
 378         checkUOE(() -> {
 379             Value o = (Value) vh.getAndBitwiseAndAcquire(recv, Value.getInstance(10));
 380         });
 381 
 382         checkUOE(() -> {
 383             Value o = (Value) vh.getAndBitwiseAndRelease(recv, Value.getInstance(10));
 384         });
 385 
 386         checkUOE(() -> {
 387             Value o = (Value) vh.getAndBitwiseXor(recv, Value.getInstance(10));
 388         });
 389 
 390         checkUOE(() -> {
 391             Value o = (Value) vh.getAndBitwiseXorAcquire(recv, Value.getInstance(10));
 392         });
 393 
 394         checkUOE(() -> {
 395             Value o = (Value) vh.getAndBitwiseXorRelease(recv, Value.getInstance(10));
 396         });
 397     }
 398 
 399 
 400     static void testStaticFinalField(VarHandle vh) {
 401         // Plain
 402         {
 403             Value x = (Value) vh.get();
 404             assertEquals(Value.getInstance(10), x, "get Value value");
 405         }
 406 
 407 
 408         // Volatile
 409         {
 410             Value x = (Value) vh.getVolatile();
 411             assertEquals(Value.getInstance(10), x, "getVolatile Value value");
 412         }
 413 
 414         // Lazy
 415         {
 416             Value x = (Value) vh.getAcquire();
 417             assertEquals(Value.getInstance(10), x, "getRelease Value value");
 418         }
 419 
 420         // Opaque
 421         {
 422             Value x = (Value) vh.getOpaque();
 423             assertEquals(Value.getInstance(10), x, "getOpaque Value value");
 424         }
 425     }
 426 
 427     static void testStaticFinalFieldUnsupported(VarHandle vh) {
 428         checkUOE(() -> {
 429             vh.set(Value.getInstance(20));
 430         });
 431 
 432         checkUOE(() -> {
 433             vh.setVolatile(Value.getInstance(20));
 434         });
 435 
 436         checkUOE(() -> {
 437             vh.setRelease(Value.getInstance(20));
 438         });
 439 
 440         checkUOE(() -> {
 441             vh.setOpaque(Value.getInstance(20));
 442         });
 443 
 444 
 445         checkUOE(() -> {
 446             Value o = (Value) vh.getAndAdd(Value.getInstance(10));
 447         });
 448 
 449         checkUOE(() -> {
 450             Value o = (Value) vh.getAndAddAcquire(Value.getInstance(10));
 451         });
 452 
 453         checkUOE(() -> {
 454             Value o = (Value) vh.getAndAddRelease(Value.getInstance(10));
 455         });
 456 
 457         checkUOE(() -> {
 458             Value o = (Value) vh.getAndBitwiseOr(Value.getInstance(10));
 459         });
 460 
 461         checkUOE(() -> {
 462             Value o = (Value) vh.getAndBitwiseOrAcquire(Value.getInstance(10));
 463         });
 464 
 465         checkUOE(() -> {
 466             Value o = (Value) vh.getAndBitwiseOrRelease(Value.getInstance(10));
 467         });
 468 
 469         checkUOE(() -> {
 470             Value o = (Value) vh.getAndBitwiseAnd(Value.getInstance(10));
 471         });
 472 
 473         checkUOE(() -> {
 474             Value o = (Value) vh.getAndBitwiseAndAcquire(Value.getInstance(10));
 475         });
 476 
 477         checkUOE(() -> {
 478             Value o = (Value) vh.getAndBitwiseAndRelease(Value.getInstance(10));
 479         });
 480 
 481         checkUOE(() -> {
 482             Value o = (Value) vh.getAndBitwiseXor(Value.getInstance(10));
 483         });
 484 
 485         checkUOE(() -> {
 486             Value o = (Value) vh.getAndBitwiseXorAcquire(Value.getInstance(10));
 487         });
 488 
 489         checkUOE(() -> {
 490             Value o = (Value) vh.getAndBitwiseXorRelease(Value.getInstance(10));
 491         });
 492     }
 493 
 494 
 495     static void testInstanceField(VarHandleTestAccessValue recv, VarHandle vh) {
 496         // Plain
 497         {
 498             vh.set(recv, Value.getInstance(10));
 499             Value x = (Value) vh.get(recv);
 500             assertEquals(Value.getInstance(10), x, "set Value value");
 501         }
 502 
 503 
 504         // Volatile
 505         {
 506             vh.setVolatile(recv, Value.getInstance(20));
 507             Value x = (Value) vh.getVolatile(recv);
 508             assertEquals(Value.getInstance(20), x, "setVolatile Value value");
 509         }
 510 
 511         // Lazy
 512         {
 513             vh.setRelease(recv, Value.getInstance(10));
 514             Value x = (Value) vh.getAcquire(recv);
 515             assertEquals(Value.getInstance(10), x, "setRelease Value value");
 516         }
 517 
 518         // Opaque
 519         {
 520             vh.setOpaque(recv, Value.getInstance(20));
 521             Value x = (Value) vh.getOpaque(recv);
 522             assertEquals(Value.getInstance(20), x, "setOpaque Value value");
 523         }
 524 
 525         vh.set(recv, Value.getInstance(10));
 526 
 527         // Compare
 528         {
 529             boolean r = vh.compareAndSet(recv, Value.getInstance(10), Value.getInstance(20));
 530             assertEquals(r, true, "success compareAndSet Value");
 531             Value x = (Value) vh.get(recv);
 532             assertEquals(Value.getInstance(20), x, "success compareAndSet Value value");
 533         }
 534 
 535         {
 536             boolean r = vh.compareAndSet(recv, Value.getInstance(10), Value.getInstance(30));
 537             assertEquals(r, false, "failing compareAndSet Value");
 538             Value x = (Value) vh.get(recv);
 539             assertEquals(Value.getInstance(20), x, "failing compareAndSet Value value");
 540         }
 541 
 542         {
 543             Value r = (Value) vh.compareAndExchange(recv, Value.getInstance(20), Value.getInstance(10));
 544             assertEquals(r, Value.getInstance(20), "success compareAndExchange Value");
 545             Value x = (Value) vh.get(recv);
 546             assertEquals(Value.getInstance(10), x, "success compareAndExchange Value value");
 547         }
 548 
 549         {
 550             Value r = (Value) vh.compareAndExchange(recv, Value.getInstance(20), Value.getInstance(30));
 551             assertEquals(r, Value.getInstance(10), "failing compareAndExchange Value");
 552             Value x = (Value) vh.get(recv);
 553             assertEquals(Value.getInstance(10), x, "failing compareAndExchange Value value");
 554         }
 555 
 556         {
 557             Value r = (Value) vh.compareAndExchangeAcquire(recv, Value.getInstance(10), Value.getInstance(20));
 558             assertEquals(r, Value.getInstance(10), "success compareAndExchangeAcquire Value");
 559             Value x = (Value) vh.get(recv);
 560             assertEquals(Value.getInstance(20), x, "success compareAndExchangeAcquire Value value");
 561         }
 562 
 563         {
 564             Value r = (Value) vh.compareAndExchangeAcquire(recv, Value.getInstance(10), Value.getInstance(30));
 565             assertEquals(r, Value.getInstance(20), "failing compareAndExchangeAcquire Value");
 566             Value x = (Value) vh.get(recv);
 567             assertEquals(Value.getInstance(20), x, "failing compareAndExchangeAcquire Value value");
 568         }
 569 
 570         {
 571             Value r = (Value) vh.compareAndExchangeRelease(recv, Value.getInstance(20), Value.getInstance(10));
 572             assertEquals(r, Value.getInstance(20), "success compareAndExchangeRelease Value");
 573             Value x = (Value) vh.get(recv);
 574             assertEquals(Value.getInstance(10), x, "success compareAndExchangeRelease Value value");
 575         }
 576 
 577         {
 578             Value r = (Value) vh.compareAndExchangeRelease(recv, Value.getInstance(20), Value.getInstance(30));
 579             assertEquals(r, Value.getInstance(10), "failing compareAndExchangeRelease Value");
 580             Value x = (Value) vh.get(recv);
 581             assertEquals(Value.getInstance(10), x, "failing compareAndExchangeRelease Value value");
 582         }
 583 
 584         {
 585             boolean success = false;
 586             for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
 587                 success = vh.weakCompareAndSetPlain(recv, Value.getInstance(10), Value.getInstance(20));
 588                 if (!success) weakDelay();
 589             }
 590             assertEquals(success, true, "success weakCompareAndSetPlain Value");
 591             Value x = (Value) vh.get(recv);
 592             assertEquals(Value.getInstance(20), x, "success weakCompareAndSetPlain Value value");
 593         }
 594 
 595         {
 596             boolean success = vh.weakCompareAndSetPlain(recv, Value.getInstance(10), Value.getInstance(30));
 597             assertEquals(success, false, "failing weakCompareAndSetPlain Value");
 598             Value x = (Value) vh.get(recv);
 599             assertEquals(Value.getInstance(20), x, "failing weakCompareAndSetPlain Value value");
 600         }
 601 
 602         {
 603             boolean success = false;
 604             for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
 605                 success = vh.weakCompareAndSetAcquire(recv, Value.getInstance(20), Value.getInstance(10));
 606                 if (!success) weakDelay();
 607             }
 608             assertEquals(success, true, "success weakCompareAndSetAcquire Value");
 609             Value x = (Value) vh.get(recv);
 610             assertEquals(Value.getInstance(10), x, "success weakCompareAndSetAcquire Value");
 611         }
 612 
 613         {
 614             boolean success = vh.weakCompareAndSetAcquire(recv, Value.getInstance(20), Value.getInstance(30));
 615             assertEquals(success, false, "failing weakCompareAndSetAcquire Value");
 616             Value x = (Value) vh.get(recv);
 617             assertEquals(Value.getInstance(10), x, "failing weakCompareAndSetAcquire Value value");
 618         }
 619 
 620         {
 621             boolean success = false;
 622             for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
 623                 success = vh.weakCompareAndSetRelease(recv, Value.getInstance(10), Value.getInstance(20));
 624                 if (!success) weakDelay();
 625             }
 626             assertEquals(success, true, "success weakCompareAndSetRelease Value");
 627             Value x = (Value) vh.get(recv);
 628             assertEquals(Value.getInstance(20), x, "success weakCompareAndSetRelease Value");
 629         }
 630 
 631         {
 632             boolean success = vh.weakCompareAndSetRelease(recv, Value.getInstance(10), Value.getInstance(30));
 633             assertEquals(success, false, "failing weakCompareAndSetRelease Value");
 634             Value x = (Value) vh.get(recv);
 635             assertEquals(Value.getInstance(20), x, "failing weakCompareAndSetRelease Value value");
 636         }
 637 
 638         {
 639             boolean success = false;
 640             for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
 641                 success = vh.weakCompareAndSet(recv, Value.getInstance(20), Value.getInstance(10));
 642                 if (!success) weakDelay();
 643             }
 644             assertEquals(success, true, "success weakCompareAndSet Value");
 645             Value x = (Value) vh.get(recv);
 646             assertEquals(Value.getInstance(10), x, "success weakCompareAndSet Value value");
 647         }
 648 
 649         {
 650             boolean success = vh.weakCompareAndSet(recv, Value.getInstance(20), Value.getInstance(30));
 651             assertEquals(success, false, "failing weakCompareAndSet Value");
 652             Value x = (Value) vh.get(recv);
 653             assertEquals(Value.getInstance(10), x, "failing weakCompareAndSet Value value");
 654         }
 655 
 656         // Compare set and get
 657         {
 658             vh.set(recv, Value.getInstance(10));
 659 
 660             Value o = (Value) vh.getAndSet(recv, Value.getInstance(20));
 661             assertEquals(Value.getInstance(10), o, "getAndSet Value");
 662             Value x = (Value) vh.get(recv);
 663             assertEquals(Value.getInstance(20), x, "getAndSet Value value");
 664         }
 665 
 666         {
 667             vh.set(recv, Value.getInstance(10));
 668 
 669             Value o = (Value) vh.getAndSetAcquire(recv, Value.getInstance(20));
 670             assertEquals(Value.getInstance(10), o, "getAndSetAcquire Value");
 671             Value x = (Value) vh.get(recv);
 672             assertEquals(Value.getInstance(20), x, "getAndSetAcquire Value value");
 673         }
 674 
 675         {
 676             vh.set(recv, Value.getInstance(10));
 677 
 678             Value o = (Value) vh.getAndSetRelease(recv, Value.getInstance(20));
 679             assertEquals(Value.getInstance(10), o, "getAndSetRelease Value");
 680             Value x = (Value) vh.get(recv);
 681             assertEquals(Value.getInstance(20), x, "getAndSetRelease Value value");
 682         }
 683 
 684 
 685     }
 686 
 687     static void testInstanceFieldUnsupported(VarHandleTestAccessValue recv, VarHandle vh) {
 688 
 689         checkUOE(() -> {
 690             Value o = (Value) vh.getAndAdd(recv, Value.getInstance(10));
 691         });
 692 
 693         checkUOE(() -> {
 694             Value o = (Value) vh.getAndAddAcquire(recv, Value.getInstance(10));
 695         });
 696 
 697         checkUOE(() -> {
 698             Value o = (Value) vh.getAndAddRelease(recv, Value.getInstance(10));
 699         });
 700 
 701         checkUOE(() -> {
 702             Value o = (Value) vh.getAndBitwiseOr(recv, Value.getInstance(10));
 703         });
 704 
 705         checkUOE(() -> {
 706             Value o = (Value) vh.getAndBitwiseOrAcquire(recv, Value.getInstance(10));
 707         });
 708 
 709         checkUOE(() -> {
 710             Value o = (Value) vh.getAndBitwiseOrRelease(recv, Value.getInstance(10));
 711         });
 712 
 713         checkUOE(() -> {
 714             Value o = (Value) vh.getAndBitwiseAnd(recv, Value.getInstance(10));
 715         });
 716 
 717         checkUOE(() -> {
 718             Value o = (Value) vh.getAndBitwiseAndAcquire(recv, Value.getInstance(10));
 719         });
 720 
 721         checkUOE(() -> {
 722             Value o = (Value) vh.getAndBitwiseAndRelease(recv, Value.getInstance(10));
 723         });
 724 
 725         checkUOE(() -> {
 726             Value o = (Value) vh.getAndBitwiseXor(recv, Value.getInstance(10));
 727         });
 728 
 729         checkUOE(() -> {
 730             Value o = (Value) vh.getAndBitwiseXorAcquire(recv, Value.getInstance(10));
 731         });
 732 
 733         checkUOE(() -> {
 734             Value o = (Value) vh.getAndBitwiseXorRelease(recv, Value.getInstance(10));
 735         });
 736     }
 737 
 738 
 739     static void testStaticField(VarHandle vh) {
 740         // Plain
 741         {
 742             vh.set(Value.getInstance(10));
 743             Value x = (Value) vh.get();
 744             assertEquals(Value.getInstance(10), x, "set Value value");
 745         }
 746 
 747 
 748         // Volatile
 749         {
 750             vh.setVolatile(Value.getInstance(20));
 751             Value x = (Value) vh.getVolatile();
 752             assertEquals(Value.getInstance(20), x, "setVolatile Value value");
 753         }
 754 
 755         // Lazy
 756         {
 757             vh.setRelease(Value.getInstance(10));
 758             Value x = (Value) vh.getAcquire();
 759             assertEquals(Value.getInstance(10), x, "setRelease Value value");
 760         }
 761 
 762         // Opaque
 763         {
 764             vh.setOpaque(Value.getInstance(20));
 765             Value x = (Value) vh.getOpaque();
 766             assertEquals(Value.getInstance(20), x, "setOpaque Value value");
 767         }
 768 
 769         vh.set(Value.getInstance(10));
 770 
 771         // Compare
 772         {
 773             boolean r = vh.compareAndSet(Value.getInstance(10), Value.getInstance(20));
 774             assertEquals(r, true, "success compareAndSet Value");
 775             Value x = (Value) vh.get();
 776             assertEquals(Value.getInstance(20), x, "success compareAndSet Value value");
 777         }
 778 
 779         {
 780             boolean r = vh.compareAndSet(Value.getInstance(10), Value.getInstance(30));
 781             assertEquals(r, false, "failing compareAndSet Value");
 782             Value x = (Value) vh.get();
 783             assertEquals(Value.getInstance(20), x, "failing compareAndSet Value value");
 784         }
 785 
 786         {
 787             Value r = (Value) vh.compareAndExchange(Value.getInstance(20), Value.getInstance(10));
 788             assertEquals(r, Value.getInstance(20), "success compareAndExchange Value");
 789             Value x = (Value) vh.get();
 790             assertEquals(Value.getInstance(10), x, "success compareAndExchange Value value");
 791         }
 792 
 793         {
 794             Value r = (Value) vh.compareAndExchange(Value.getInstance(20), Value.getInstance(30));
 795             assertEquals(r, Value.getInstance(10), "failing compareAndExchange Value");
 796             Value x = (Value) vh.get();
 797             assertEquals(Value.getInstance(10), x, "failing compareAndExchange Value value");
 798         }
 799 
 800         {
 801             Value r = (Value) vh.compareAndExchangeAcquire(Value.getInstance(10), Value.getInstance(20));
 802             assertEquals(r, Value.getInstance(10), "success compareAndExchangeAcquire Value");
 803             Value x = (Value) vh.get();
 804             assertEquals(Value.getInstance(20), x, "success compareAndExchangeAcquire Value value");
 805         }
 806 
 807         {
 808             Value r = (Value) vh.compareAndExchangeAcquire(Value.getInstance(10), Value.getInstance(30));
 809             assertEquals(r, Value.getInstance(20), "failing compareAndExchangeAcquire Value");
 810             Value x = (Value) vh.get();
 811             assertEquals(Value.getInstance(20), x, "failing compareAndExchangeAcquire Value value");
 812         }
 813 
 814         {
 815             Value r = (Value) vh.compareAndExchangeRelease(Value.getInstance(20), Value.getInstance(10));
 816             assertEquals(r, Value.getInstance(20), "success compareAndExchangeRelease Value");
 817             Value x = (Value) vh.get();
 818             assertEquals(Value.getInstance(10), x, "success compareAndExchangeRelease Value value");
 819         }
 820 
 821         {
 822             Value r = (Value) vh.compareAndExchangeRelease(Value.getInstance(20), Value.getInstance(30));
 823             assertEquals(r, Value.getInstance(10), "failing compareAndExchangeRelease Value");
 824             Value x = (Value) vh.get();
 825             assertEquals(Value.getInstance(10), x, "failing compareAndExchangeRelease Value value");
 826         }
 827 
 828         {
 829             boolean success = false;
 830             for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
 831                 success = vh.weakCompareAndSetPlain(Value.getInstance(10), Value.getInstance(20));
 832                 if (!success) weakDelay();
 833             }
 834             assertEquals(success, true, "success weakCompareAndSetPlain Value");
 835             Value x = (Value) vh.get();
 836             assertEquals(Value.getInstance(20), x, "success weakCompareAndSetPlain Value value");
 837         }
 838 
 839         {
 840             boolean success = vh.weakCompareAndSetPlain(Value.getInstance(10), Value.getInstance(30));
 841             assertEquals(success, false, "failing weakCompareAndSetPlain Value");
 842             Value x = (Value) vh.get();
 843             assertEquals(Value.getInstance(20), x, "failing weakCompareAndSetPlain Value value");
 844         }
 845 
 846         {
 847             boolean success = false;
 848             for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
 849                 success = vh.weakCompareAndSetAcquire(Value.getInstance(20), Value.getInstance(10));
 850                 if (!success) weakDelay();
 851             }
 852             assertEquals(success, true, "success weakCompareAndSetAcquire Value");
 853             Value x = (Value) vh.get();
 854             assertEquals(Value.getInstance(10), x, "success weakCompareAndSetAcquire Value");
 855         }
 856 
 857         {
 858             boolean success = vh.weakCompareAndSetAcquire(Value.getInstance(20), Value.getInstance(30));
 859             assertEquals(success, false, "failing weakCompareAndSetAcquire Value");
 860             Value x = (Value) vh.get();
 861             assertEquals(Value.getInstance(10), x, "failing weakCompareAndSetAcquire Value value");
 862         }
 863 
 864         {
 865             boolean success = false;
 866             for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
 867                 success = vh.weakCompareAndSetRelease(Value.getInstance(10), Value.getInstance(20));
 868                 if (!success) weakDelay();
 869             }
 870             assertEquals(success, true, "success weakCompareAndSetRelease Value");
 871             Value x = (Value) vh.get();
 872             assertEquals(Value.getInstance(20), x, "success weakCompareAndSetRelease Value");
 873         }
 874 
 875         {
 876             boolean success = vh.weakCompareAndSetRelease(Value.getInstance(10), Value.getInstance(30));
 877             assertEquals(success, false, "failing weakCompareAndSetRelease Value");
 878             Value x = (Value) vh.get();
 879             assertEquals(Value.getInstance(20), x, "failing weakCompareAndSetRelease Value value");
 880         }
 881 
 882         {
 883             boolean success = false;
 884             for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
 885                 success = vh.weakCompareAndSet(Value.getInstance(20), Value.getInstance(10));
 886                 if (!success) weakDelay();
 887             }
 888             assertEquals(success, true, "success weakCompareAndSet Value");
 889             Value x = (Value) vh.get();
 890             assertEquals(Value.getInstance(10), x, "success weakCompareAndSet Value");
 891         }
 892 
 893         {
 894             boolean success = vh.weakCompareAndSet(Value.getInstance(20), Value.getInstance(30));
 895             assertEquals(success, false, "failing weakCompareAndSet Value");
 896             Value x = (Value) vh.get();
 897             assertEquals(Value.getInstance(10), x, "failing weakCompareAndSet Value value");
 898         }
 899 
 900         // Compare set and get
 901         {
 902             vh.set(Value.getInstance(10));
 903 
 904             Value o = (Value) vh.getAndSet(Value.getInstance(20));
 905             assertEquals(Value.getInstance(10), o, "getAndSet Value");
 906             Value x = (Value) vh.get();
 907             assertEquals(Value.getInstance(20), x, "getAndSet Value value");
 908         }
 909 
 910         {
 911             vh.set(Value.getInstance(10));
 912 
 913             Value o = (Value) vh.getAndSetAcquire(Value.getInstance(20));
 914             assertEquals(Value.getInstance(10), o, "getAndSetAcquire Value");
 915             Value x = (Value) vh.get();
 916             assertEquals(Value.getInstance(20), x, "getAndSetAcquire Value value");
 917         }
 918 
 919         {
 920             vh.set(Value.getInstance(10));
 921 
 922             Value o = (Value) vh.getAndSetRelease(Value.getInstance(20));
 923             assertEquals(Value.getInstance(10), o, "getAndSetRelease Value");
 924             Value x = (Value) vh.get();
 925             assertEquals(Value.getInstance(20), x, "getAndSetRelease Value value");
 926         }
 927 
 928 
 929     }
 930 
 931     static void testStaticFieldUnsupported(VarHandle vh) {
 932 
 933         checkUOE(() -> {
 934             Value o = (Value) vh.getAndAdd(Value.getInstance(10));
 935         });
 936 
 937         checkUOE(() -> {
 938             Value o = (Value) vh.getAndAddAcquire(Value.getInstance(10));
 939         });
 940 
 941         checkUOE(() -> {
 942             Value o = (Value) vh.getAndAddRelease(Value.getInstance(10));
 943         });
 944 
 945         checkUOE(() -> {
 946             Value o = (Value) vh.getAndBitwiseOr(Value.getInstance(10));
 947         });
 948 
 949         checkUOE(() -> {
 950             Value o = (Value) vh.getAndBitwiseOrAcquire(Value.getInstance(10));
 951         });
 952 
 953         checkUOE(() -> {
 954             Value o = (Value) vh.getAndBitwiseOrRelease(Value.getInstance(10));
 955         });
 956 
 957         checkUOE(() -> {
 958             Value o = (Value) vh.getAndBitwiseAnd(Value.getInstance(10));
 959         });
 960 
 961         checkUOE(() -> {
 962             Value o = (Value) vh.getAndBitwiseAndAcquire(Value.getInstance(10));
 963         });
 964 
 965         checkUOE(() -> {
 966             Value o = (Value) vh.getAndBitwiseAndRelease(Value.getInstance(10));
 967         });
 968 
 969         checkUOE(() -> {
 970             Value o = (Value) vh.getAndBitwiseXor(Value.getInstance(10));
 971         });
 972 
 973         checkUOE(() -> {
 974             Value o = (Value) vh.getAndBitwiseXorAcquire(Value.getInstance(10));
 975         });
 976 
 977         checkUOE(() -> {
 978             Value o = (Value) vh.getAndBitwiseXorRelease(Value.getInstance(10));
 979         });
 980     }
 981 
 982 
 983     static void testArray(VarHandle vh) {
 984         Value[] array = new Value[10];
 985 
 986         for (int i = 0; i < array.length; i++) {
 987             // Plain
 988             {
 989                 vh.set(array, i, Value.getInstance(10));
 990                 Value x = (Value) vh.get(array, i);
 991                 assertEquals(Value.getInstance(10), x, "get Value value");
 992             }
 993 
 994 
 995             // Volatile
 996             {
 997                 vh.setVolatile(array, i, Value.getInstance(20));
 998                 Value x = (Value) vh.getVolatile(array, i);
 999                 assertEquals(Value.getInstance(20), x, "setVolatile Value value");
1000             }
1001 
1002             // Lazy
1003             {
1004                 vh.setRelease(array, i, Value.getInstance(10));
1005                 Value x = (Value) vh.getAcquire(array, i);
1006                 assertEquals(Value.getInstance(10), x, "setRelease Value value");
1007             }
1008 
1009             // Opaque
1010             {
1011                 vh.setOpaque(array, i, Value.getInstance(20));
1012                 Value x = (Value) vh.getOpaque(array, i);
1013                 assertEquals(Value.getInstance(20), x, "setOpaque Value value");
1014             }
1015 
1016             vh.set(array, i, Value.getInstance(10));
1017 
1018             // Compare
1019             {
1020                 boolean r = vh.compareAndSet(array, i, Value.getInstance(10), Value.getInstance(20));
1021                 assertEquals(r, true, "success compareAndSet Value");
1022                 Value x = (Value) vh.get(array, i);
1023                 assertEquals(Value.getInstance(20), x, "success compareAndSet Value value");
1024             }
1025 
1026             {
1027                 boolean r = vh.compareAndSet(array, i, Value.getInstance(10), Value.getInstance(30));
1028                 assertEquals(r, false, "failing compareAndSet Value");
1029                 Value x = (Value) vh.get(array, i);
1030                 assertEquals(Value.getInstance(20), x, "failing compareAndSet Value value");
1031             }
1032 
1033             {
1034                 Value r = (Value) vh.compareAndExchange(array, i, Value.getInstance(20), Value.getInstance(10));
1035                 assertEquals(r, Value.getInstance(20), "success compareAndExchange Value");
1036                 Value x = (Value) vh.get(array, i);
1037                 assertEquals(Value.getInstance(10), x, "success compareAndExchange Value value");
1038             }
1039 
1040             {
1041                 Value r = (Value) vh.compareAndExchange(array, i, Value.getInstance(20), Value.getInstance(30));
1042                 assertEquals(r, Value.getInstance(10), "failing compareAndExchange Value");
1043                 Value x = (Value) vh.get(array, i);
1044                 assertEquals(Value.getInstance(10), x, "failing compareAndExchange Value value");
1045             }
1046 
1047             {
1048                 Value r = (Value) vh.compareAndExchangeAcquire(array, i, Value.getInstance(10), Value.getInstance(20));
1049                 assertEquals(r, Value.getInstance(10), "success compareAndExchangeAcquire Value");
1050                 Value x = (Value) vh.get(array, i);
1051                 assertEquals(Value.getInstance(20), x, "success compareAndExchangeAcquire Value value");
1052             }
1053 
1054             {
1055                 Value r = (Value) vh.compareAndExchangeAcquire(array, i, Value.getInstance(10), Value.getInstance(30));
1056                 assertEquals(r, Value.getInstance(20), "failing compareAndExchangeAcquire Value");
1057                 Value x = (Value) vh.get(array, i);
1058                 assertEquals(Value.getInstance(20), x, "failing compareAndExchangeAcquire Value value");
1059             }
1060 
1061             {
1062                 Value r = (Value) vh.compareAndExchangeRelease(array, i, Value.getInstance(20), Value.getInstance(10));
1063                 assertEquals(r, Value.getInstance(20), "success compareAndExchangeRelease Value");
1064                 Value x = (Value) vh.get(array, i);
1065                 assertEquals(Value.getInstance(10), x, "success compareAndExchangeRelease Value value");
1066             }
1067 
1068             {
1069                 Value r = (Value) vh.compareAndExchangeRelease(array, i, Value.getInstance(20), Value.getInstance(30));
1070                 assertEquals(r, Value.getInstance(10), "failing compareAndExchangeRelease Value");
1071                 Value x = (Value) vh.get(array, i);
1072                 assertEquals(Value.getInstance(10), x, "failing compareAndExchangeRelease Value value");
1073             }
1074 
1075             {
1076                 boolean success = false;
1077                 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
1078                     success = vh.weakCompareAndSetPlain(array, i, Value.getInstance(10), Value.getInstance(20));
1079                     if (!success) weakDelay();
1080                 }
1081                 assertEquals(success, true, "success weakCompareAndSetPlain Value");
1082                 Value x = (Value) vh.get(array, i);
1083                 assertEquals(Value.getInstance(20), x, "success weakCompareAndSetPlain Value value");
1084             }
1085 
1086             {
1087                 boolean success = vh.weakCompareAndSetPlain(array, i, Value.getInstance(10), Value.getInstance(30));
1088                 assertEquals(success, false, "failing weakCompareAndSetPlain Value");
1089                 Value x = (Value) vh.get(array, i);
1090                 assertEquals(Value.getInstance(20), x, "failing weakCompareAndSetPlain Value value");
1091             }
1092 
1093             {
1094                 boolean success = false;
1095                 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
1096                     success = vh.weakCompareAndSetAcquire(array, i, Value.getInstance(20), Value.getInstance(10));
1097                     if (!success) weakDelay();
1098                 }
1099                 assertEquals(success, true, "success weakCompareAndSetAcquire Value");
1100                 Value x = (Value) vh.get(array, i);
1101                 assertEquals(Value.getInstance(10), x, "success weakCompareAndSetAcquire Value");
1102             }
1103 
1104             {
1105                 boolean success = vh.weakCompareAndSetAcquire(array, i, Value.getInstance(20), Value.getInstance(30));
1106                 assertEquals(success, false, "failing weakCompareAndSetAcquire Value");
1107                 Value x = (Value) vh.get(array, i);
1108                 assertEquals(Value.getInstance(10), x, "failing weakCompareAndSetAcquire Value value");
1109             }
1110 
1111             {
1112                 boolean success = false;
1113                 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
1114                     success = vh.weakCompareAndSetRelease(array, i, Value.getInstance(10), Value.getInstance(20));
1115                     if (!success) weakDelay();
1116                 }
1117                 assertEquals(success, true, "success weakCompareAndSetRelease Value");
1118                 Value x = (Value) vh.get(array, i);
1119                 assertEquals(Value.getInstance(20), x, "success weakCompareAndSetRelease Value");
1120             }
1121 
1122             {
1123                 boolean success = vh.weakCompareAndSetRelease(array, i, Value.getInstance(10), Value.getInstance(30));
1124                 assertEquals(success, false, "failing weakCompareAndSetRelease Value");
1125                 Value x = (Value) vh.get(array, i);
1126                 assertEquals(Value.getInstance(20), x, "failing weakCompareAndSetRelease Value value");
1127             }
1128 
1129             {
1130                 boolean success = false;
1131                 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
1132                     success = vh.weakCompareAndSet(array, i, Value.getInstance(20), Value.getInstance(10));
1133                     if (!success) weakDelay();
1134                 }
1135                 assertEquals(success, true, "success weakCompareAndSet Value");
1136                 Value x = (Value) vh.get(array, i);
1137                 assertEquals(Value.getInstance(10), x, "success weakCompareAndSet Value");
1138             }
1139 
1140             {
1141                 boolean success = vh.weakCompareAndSet(array, i, Value.getInstance(20), Value.getInstance(30));
1142                 assertEquals(success, false, "failing weakCompareAndSet Value");
1143                 Value x = (Value) vh.get(array, i);
1144                 assertEquals(Value.getInstance(10), x, "failing weakCompareAndSet Value value");
1145             }
1146 
1147             // Compare set and get
1148             {
1149                 vh.set(array, i, Value.getInstance(10));
1150 
1151                 Value o = (Value) vh.getAndSet(array, i, Value.getInstance(20));
1152                 assertEquals(Value.getInstance(10), o, "getAndSet Value");
1153                 Value x = (Value) vh.get(array, i);
1154                 assertEquals(Value.getInstance(20), x, "getAndSet Value value");
1155             }
1156 
1157             {
1158                 vh.set(array, i, Value.getInstance(10));
1159 
1160                 Value o = (Value) vh.getAndSetAcquire(array, i, Value.getInstance(20));
1161                 assertEquals(Value.getInstance(10), o, "getAndSetAcquire Value");
1162                 Value x = (Value) vh.get(array, i);
1163                 assertEquals(Value.getInstance(20), x, "getAndSetAcquire Value value");
1164             }
1165 
1166             {
1167                 vh.set(array, i, Value.getInstance(10));
1168 
1169                 Value o = (Value) vh.getAndSetRelease(array, i, Value.getInstance(20));
1170                 assertEquals(Value.getInstance(10), o, "getAndSetRelease Value");
1171                 Value x = (Value) vh.get(array, i);
1172                 assertEquals(Value.getInstance(20), x, "getAndSetRelease Value value");
1173             }
1174 
1175 
1176         }
1177     }
1178 
1179     static void testArrayUnsupported(VarHandle vh) {
1180         Value[] array = new Value[10];
1181 
1182         int i = 0;
1183 
1184         checkUOE(() -> {
1185             Value o = (Value) vh.getAndAdd(array, i, Value.getInstance(10));
1186         });
1187 
1188         checkUOE(() -> {
1189             Value o = (Value) vh.getAndAddAcquire(array, i, Value.getInstance(10));
1190         });
1191 
1192         checkUOE(() -> {
1193             Value o = (Value) vh.getAndAddRelease(array, i, Value.getInstance(10));
1194         });
1195 
1196         checkUOE(() -> {
1197             Value o = (Value) vh.getAndBitwiseOr(array, i, Value.getInstance(10));
1198         });
1199 
1200         checkUOE(() -> {
1201             Value o = (Value) vh.getAndBitwiseOrAcquire(array, i, Value.getInstance(10));
1202         });
1203 
1204         checkUOE(() -> {
1205             Value o = (Value) vh.getAndBitwiseOrRelease(array, i, Value.getInstance(10));
1206         });
1207 
1208         checkUOE(() -> {
1209             Value o = (Value) vh.getAndBitwiseAnd(array, i, Value.getInstance(10));
1210         });
1211 
1212         checkUOE(() -> {
1213             Value o = (Value) vh.getAndBitwiseAndAcquire(array, i, Value.getInstance(10));
1214         });
1215 
1216         checkUOE(() -> {
1217             Value o = (Value) vh.getAndBitwiseAndRelease(array, i, Value.getInstance(10));
1218         });
1219 
1220         checkUOE(() -> {
1221             Value o = (Value) vh.getAndBitwiseXor(array, i, Value.getInstance(10));
1222         });
1223 
1224         checkUOE(() -> {
1225             Value o = (Value) vh.getAndBitwiseXorAcquire(array, i, Value.getInstance(10));
1226         });
1227 
1228         checkUOE(() -> {
1229             Value o = (Value) vh.getAndBitwiseXorRelease(array, i, Value.getInstance(10));
1230         });
1231     }
1232 
1233     static void testArrayIndexOutOfBounds(VarHandle vh) throws Throwable {
1234         Value[] array = new Value[10];
1235 
1236         for (int i : new int[]{-1, Integer.MIN_VALUE, 10, 11, Integer.MAX_VALUE}) {
1237             final int ci = i;
1238 
1239             checkAIOOBE(() -> {
1240                 Value x = (Value) vh.get(array, ci);
1241             });
1242 
1243             checkAIOOBE(() -> {
1244                 vh.set(array, ci, Value.getInstance(10));
1245             });
1246 
1247             checkAIOOBE(() -> {
1248                 Value x = (Value) vh.getVolatile(array, ci);
1249             });
1250 
1251             checkAIOOBE(() -> {
1252                 vh.setVolatile(array, ci, Value.getInstance(10));
1253             });
1254 
1255             checkAIOOBE(() -> {
1256                 Value x = (Value) vh.getAcquire(array, ci);
1257             });
1258 
1259             checkAIOOBE(() -> {
1260                 vh.setRelease(array, ci, Value.getInstance(10));
1261             });
1262 
1263             checkAIOOBE(() -> {
1264                 Value x = (Value) vh.getOpaque(array, ci);
1265             });
1266 
1267             checkAIOOBE(() -> {
1268                 vh.setOpaque(array, ci, Value.getInstance(10));
1269             });
1270 
1271             checkAIOOBE(() -> {
1272                 boolean r = vh.compareAndSet(array, ci, Value.getInstance(10), Value.getInstance(20));
1273             });
1274 
1275             checkAIOOBE(() -> {
1276                 Value r = (Value) vh.compareAndExchange(array, ci, Value.getInstance(20), Value.getInstance(10));
1277             });
1278 
1279             checkAIOOBE(() -> {
1280                 Value r = (Value) vh.compareAndExchangeAcquire(array, ci, Value.getInstance(20), Value.getInstance(10));
1281             });
1282 
1283             checkAIOOBE(() -> {
1284                 Value r = (Value) vh.compareAndExchangeRelease(array, ci, Value.getInstance(20), Value.getInstance(10));
1285             });
1286 
1287             checkAIOOBE(() -> {
1288                 boolean r = vh.weakCompareAndSetPlain(array, ci, Value.getInstance(10), Value.getInstance(20));
1289             });
1290 
1291             checkAIOOBE(() -> {
1292                 boolean r = vh.weakCompareAndSet(array, ci, Value.getInstance(10), Value.getInstance(20));
1293             });
1294 
1295             checkAIOOBE(() -> {
1296                 boolean r = vh.weakCompareAndSetAcquire(array, ci, Value.getInstance(10), Value.getInstance(20));
1297             });
1298 
1299             checkAIOOBE(() -> {
1300                 boolean r = vh.weakCompareAndSetRelease(array, ci, Value.getInstance(10), Value.getInstance(20));
1301             });
1302 
1303             checkAIOOBE(() -> {
1304                 Value o = (Value) vh.getAndSet(array, ci, Value.getInstance(10));
1305             });
1306 
1307             checkAIOOBE(() -> {
1308                 Value o = (Value) vh.getAndSetAcquire(array, ci, Value.getInstance(10));
1309             });
1310 
1311             checkAIOOBE(() -> {
1312                 Value o = (Value) vh.getAndSetRelease(array, ci, Value.getInstance(10));
1313             });
1314 
1315 
1316         }
1317     }
1318 
1319     static void testArrayStoreException(VarHandle vh) throws Throwable {
1320         Object[] array = new Value[10];
1321         Arrays.fill(array, Value.getInstance(10));
1322         Object value = new Object();
1323 
1324         // Set
1325         checkASE(() -> {
1326             vh.set(array, 0, value);
1327         });
1328 
1329         // SetVolatile
1330         checkASE(() -> {
1331             vh.setVolatile(array, 0, value);
1332         });
1333 
1334         // SetOpaque
1335         checkASE(() -> {
1336             vh.setOpaque(array, 0, value);
1337         });
1338 
1339         // SetRelease
1340         checkASE(() -> {
1341             vh.setRelease(array, 0, value);
1342         });
1343 
1344         // CompareAndSet
1345         checkASE(() -> { // receiver reference class
1346             boolean r = vh.compareAndSet(array, 0, Value.getInstance(10), value);
1347         });
1348 
1349         // WeakCompareAndSet
1350         checkASE(() -> { // receiver reference class
1351             boolean r = vh.weakCompareAndSetPlain(array, 0, Value.getInstance(10), value);
1352         });
1353 
1354         // WeakCompareAndSetVolatile
1355         checkASE(() -> { // receiver reference class
1356             boolean r = vh.weakCompareAndSet(array, 0, Value.getInstance(10), value);
1357         });
1358 
1359         // WeakCompareAndSetAcquire
1360         checkASE(() -> { // receiver reference class
1361             boolean r = vh.weakCompareAndSetAcquire(array, 0, Value.getInstance(10), value);
1362         });
1363 
1364         // WeakCompareAndSetRelease
1365         checkASE(() -> { // receiver reference class
1366             boolean r = vh.weakCompareAndSetRelease(array, 0, Value.getInstance(10), value);
1367         });
1368 
1369         // CompareAndExchange
1370         checkASE(() -> { // receiver reference class
1371             Value x = (Value) vh.compareAndExchange(array, 0, Value.getInstance(10), value);
1372         });
1373 
1374         // CompareAndExchangeAcquire
1375         checkASE(() -> { // receiver reference class
1376             Value x = (Value) vh.compareAndExchangeAcquire(array, 0, Value.getInstance(10), value);
1377         });
1378 
1379         // CompareAndExchangeRelease
1380         checkASE(() -> { // receiver reference class
1381             Value x = (Value) vh.compareAndExchangeRelease(array, 0, Value.getInstance(10), value);
1382         });
1383 
1384         // GetAndSet
1385         checkASE(() -> { // receiver reference class
1386             Value x = (Value) vh.getAndSet(array, 0, value);
1387         });
1388 
1389         // GetAndSetAcquire
1390         checkASE(() -> { // receiver reference class
1391             Value x = (Value) vh.getAndSetAcquire(array, 0, value);
1392         });
1393 
1394         // GetAndSetRelease
1395         checkASE(() -> { // receiver reference class
1396             Value x = (Value) vh.getAndSetRelease(array, 0, value);
1397         });
1398     }
1399 }
1400