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