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