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