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                   VarHandleTestAccessLong
27 * @run testng/othervm -Diters=20000 -XX:TieredStopAtLevel=1 VarHandleTestAccessLong
28 * @run testng/othervm -Diters=20000                         VarHandleTestAccessLong
29 * @run testng/othervm -Diters=20000 -XX:-TieredCompilation  VarHandleTestAccessLong
30 */
31
32import org.testng.annotations.BeforeClass;
33import org.testng.annotations.DataProvider;
34import org.testng.annotations.Test;
35
36import java.lang.invoke.MethodHandles;
37import java.lang.invoke.VarHandle;
38import java.util.ArrayList;
39import java.util.Arrays;
40import java.util.List;
41
42import static org.testng.Assert.*;
43
44public class VarHandleTestAccessLong extends VarHandleBaseTest {
45    static final long static_final_v = 0x0123456789ABCDEFL;
46
47    static long static_v;
48
49    final long final_v = 0x0123456789ABCDEFL;
50
51    long 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                VarHandleTestAccessLong.class, "final_v", long.class);
67
68        vhField = MethodHandles.lookup().findVarHandle(
69                VarHandleTestAccessLong.class, "v", long.class);
70
71        vhStaticFinalField = MethodHandles.lookup().findStaticVarHandle(
72            VarHandleTestAccessLong.class, "static_final_v", long.class);
73
74        vhStaticField = MethodHandles.lookup().findStaticVarHandle(
75            VarHandleTestAccessLong.class, "static_v", long.class);
76
77        vhArray = MethodHandles.arrayElementVarHandle(long[].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(VarHandleTestAccessLong.class)});
134        types.add(new Object[] {vhStaticField, Arrays.asList()});
135        types.add(new Object[] {vhArray, Arrays.asList(long[].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(), long.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                    VarHandleTestAccessLong.class, "final_v", long.class);
155        });
156
157        checkIAE("Lookup of static field to instance field", () -> {
158            MethodHandles.lookup().findStaticVarHandle(
159                    VarHandleTestAccessLong.class, "v", long.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                VarHandleTestAccessLong.class, "static_final_v", long.class);
168        });
169
170        checkIAE("Lookup of instance field to static field", () -> {
171            vhStaticField = MethodHandles.lookup().findVarHandle(
172                VarHandleTestAccessLong.class, "static_v", long.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, VarHandleTestAccessLong::testStaticFinalField));
189        cases.add(new VarHandleAccessTestCase("Static final field unsupported",
190                                              vhStaticFinalField, VarHandleTestAccessLong::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, VarHandleTestAccessLong::testStaticField));
201        cases.add(new VarHandleAccessTestCase("Static field unsupported",
202                                              vhStaticField, VarHandleTestAccessLong::testStaticFieldUnsupported,
203                                              false));
204
205        cases.add(new VarHandleAccessTestCase("Array",
206                                              vhArray, VarHandleTestAccessLong::testArray));
207        cases.add(new VarHandleAccessTestCase("Array unsupported",
208                                              vhArray, VarHandleTestAccessLong::testArrayUnsupported,
209                                              false));
210        cases.add(new VarHandleAccessTestCase("Array index out of bounds",
211                                              vhArray, VarHandleTestAccessLong::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(VarHandleTestAccessLong recv, VarHandle vh) {
233        // Plain
234        {
235            long x = (long) vh.get(recv);
236            assertEquals(x, 0x0123456789ABCDEFL, "get long value");
237        }
238
239
240        // Volatile
241        {
242            long x = (long) vh.getVolatile(recv);
243            assertEquals(x, 0x0123456789ABCDEFL, "getVolatile long value");
244        }
245
246        // Lazy
247        {
248            long x = (long) vh.getAcquire(recv);
249            assertEquals(x, 0x0123456789ABCDEFL, "getRelease long value");
250        }
251
252        // Opaque
253        {
254            long x = (long) vh.getOpaque(recv);
255            assertEquals(x, 0x0123456789ABCDEFL, "getOpaque long value");
256        }
257    }
258
259    static void testInstanceFinalFieldUnsupported(VarHandleTestAccessLong recv, VarHandle vh) {
260        checkUOE(() -> {
261            vh.set(recv, 0xCAFEBABECAFEBABEL);
262        });
263
264        checkUOE(() -> {
265            vh.setVolatile(recv, 0xCAFEBABECAFEBABEL);
266        });
267
268        checkUOE(() -> {
269            vh.setRelease(recv, 0xCAFEBABECAFEBABEL);
270        });
271
272        checkUOE(() -> {
273            vh.setOpaque(recv, 0xCAFEBABECAFEBABEL);
274        });
275
276
277
278    }
279
280
281    static void testStaticFinalField(VarHandle vh) {
282        // Plain
283        {
284            long x = (long) vh.get();
285            assertEquals(x, 0x0123456789ABCDEFL, "get long value");
286        }
287
288
289        // Volatile
290        {
291            long x = (long) vh.getVolatile();
292            assertEquals(x, 0x0123456789ABCDEFL, "getVolatile long value");
293        }
294
295        // Lazy
296        {
297            long x = (long) vh.getAcquire();
298            assertEquals(x, 0x0123456789ABCDEFL, "getRelease long value");
299        }
300
301        // Opaque
302        {
303            long x = (long) vh.getOpaque();
304            assertEquals(x, 0x0123456789ABCDEFL, "getOpaque long value");
305        }
306    }
307
308    static void testStaticFinalFieldUnsupported(VarHandle vh) {
309        checkUOE(() -> {
310            vh.set(0xCAFEBABECAFEBABEL);
311        });
312
313        checkUOE(() -> {
314            vh.setVolatile(0xCAFEBABECAFEBABEL);
315        });
316
317        checkUOE(() -> {
318            vh.setRelease(0xCAFEBABECAFEBABEL);
319        });
320
321        checkUOE(() -> {
322            vh.setOpaque(0xCAFEBABECAFEBABEL);
323        });
324
325
326
327    }
328
329
330    static void testInstanceField(VarHandleTestAccessLong recv, VarHandle vh) {
331        // Plain
332        {
333            vh.set(recv, 0x0123456789ABCDEFL);
334            long x = (long) vh.get(recv);
335            assertEquals(x, 0x0123456789ABCDEFL, "set long value");
336        }
337
338
339        // Volatile
340        {
341            vh.setVolatile(recv, 0xCAFEBABECAFEBABEL);
342            long x = (long) vh.getVolatile(recv);
343            assertEquals(x, 0xCAFEBABECAFEBABEL, "setVolatile long value");
344        }
345
346        // Lazy
347        {
348            vh.setRelease(recv, 0x0123456789ABCDEFL);
349            long x = (long) vh.getAcquire(recv);
350            assertEquals(x, 0x0123456789ABCDEFL, "setRelease long value");
351        }
352
353        // Opaque
354        {
355            vh.setOpaque(recv, 0xCAFEBABECAFEBABEL);
356            long x = (long) vh.getOpaque(recv);
357            assertEquals(x, 0xCAFEBABECAFEBABEL, "setOpaque long value");
358        }
359
360        vh.set(recv, 0x0123456789ABCDEFL);
361
362        // Compare
363        {
364            boolean r = vh.compareAndSet(recv, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL);
365            assertEquals(r, true, "success compareAndSet long");
366            long x = (long) vh.get(recv);
367            assertEquals(x, 0xCAFEBABECAFEBABEL, "success compareAndSet long value");
368        }
369
370        {
371            boolean r = vh.compareAndSet(recv, 0x0123456789ABCDEFL, 0xDEADBEEFDEADBEEFL);
372            assertEquals(r, false, "failing compareAndSet long");
373            long x = (long) vh.get(recv);
374            assertEquals(x, 0xCAFEBABECAFEBABEL, "failing compareAndSet long value");
375        }
376
377        {
378            long r = (long) vh.compareAndExchange(recv, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL);
379            assertEquals(r, 0xCAFEBABECAFEBABEL, "success compareAndExchange long");
380            long x = (long) vh.get(recv);
381            assertEquals(x, 0x0123456789ABCDEFL, "success compareAndExchange long value");
382        }
383
384        {
385            long r = (long) vh.compareAndExchange(recv, 0xCAFEBABECAFEBABEL, 0xDEADBEEFDEADBEEFL);
386            assertEquals(r, 0x0123456789ABCDEFL, "failing compareAndExchange long");
387            long x = (long) vh.get(recv);
388            assertEquals(x, 0x0123456789ABCDEFL, "failing compareAndExchange long value");
389        }
390
391        {
392            long r = (long) vh.compareAndExchangeAcquire(recv, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL);
393            assertEquals(r, 0x0123456789ABCDEFL, "success compareAndExchangeAcquire long");
394            long x = (long) vh.get(recv);
395            assertEquals(x, 0xCAFEBABECAFEBABEL, "success compareAndExchangeAcquire long value");
396        }
397
398        {
399            long r = (long) vh.compareAndExchangeAcquire(recv, 0x0123456789ABCDEFL, 0xDEADBEEFDEADBEEFL);
400            assertEquals(r, 0xCAFEBABECAFEBABEL, "failing compareAndExchangeAcquire long");
401            long x = (long) vh.get(recv);
402            assertEquals(x, 0xCAFEBABECAFEBABEL, "failing compareAndExchangeAcquire long value");
403        }
404
405        {
406            long r = (long) vh.compareAndExchangeRelease(recv, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL);
407            assertEquals(r, 0xCAFEBABECAFEBABEL, "success compareAndExchangeRelease long");
408            long x = (long) vh.get(recv);
409            assertEquals(x, 0x0123456789ABCDEFL, "success compareAndExchangeRelease long value");
410        }
411
412        {
413            long r = (long) vh.compareAndExchangeRelease(recv, 0xCAFEBABECAFEBABEL, 0xDEADBEEFDEADBEEFL);
414            assertEquals(r, 0x0123456789ABCDEFL, "failing compareAndExchangeRelease long");
415            long x = (long) vh.get(recv);
416            assertEquals(x, 0x0123456789ABCDEFL, "failing compareAndExchangeRelease long value");
417        }
418
419        {
420            boolean success = false;
421            for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
422                success = vh.weakCompareAndSetPlain(recv, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL);
423            }
424            assertEquals(success, true, "weakCompareAndSetPlain long");
425            long x = (long) vh.get(recv);
426            assertEquals(x, 0xCAFEBABECAFEBABEL, "weakCompareAndSetPlain long value");
427        }
428
429        {
430            boolean success = false;
431            for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
432                success = vh.weakCompareAndSetAcquire(recv, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL);
433            }
434            assertEquals(success, true, "weakCompareAndSetAcquire long");
435            long x = (long) vh.get(recv);
436            assertEquals(x, 0x0123456789ABCDEFL, "weakCompareAndSetAcquire long");
437        }
438
439        {
440            boolean success = false;
441            for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
442                success = vh.weakCompareAndSetRelease(recv, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL);
443            }
444            assertEquals(success, true, "weakCompareAndSetRelease long");
445            long x = (long) vh.get(recv);
446            assertEquals(x, 0xCAFEBABECAFEBABEL, "weakCompareAndSetRelease long");
447        }
448
449        {
450            boolean success = false;
451            for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
452                success = vh.weakCompareAndSet(recv, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL);
453            }
454            assertEquals(success, true, "weakCompareAndSet long");
455            long x = (long) vh.get(recv);
456            assertEquals(x, 0x0123456789ABCDEFL, "weakCompareAndSet long value");
457        }
458
459        // Compare set and get
460        {
461            vh.set(recv, 0x0123456789ABCDEFL);
462
463            long o = (long) vh.getAndSet(recv, 0xCAFEBABECAFEBABEL);
464            assertEquals(o, 0x0123456789ABCDEFL, "getAndSet long");
465            long x = (long) vh.get(recv);
466            assertEquals(x, 0xCAFEBABECAFEBABEL, "getAndSet long value");
467        }
468
469        {
470            vh.set(recv, 0x0123456789ABCDEFL);
471
472            long o = (long) vh.getAndSetAcquire(recv, 0xCAFEBABECAFEBABEL);
473            assertEquals(o, 0x0123456789ABCDEFL, "getAndSetAcquire long");
474            long x = (long) vh.get(recv);
475            assertEquals(x, 0xCAFEBABECAFEBABEL, "getAndSetAcquire long value");
476        }
477
478        {
479            vh.set(recv, 0x0123456789ABCDEFL);
480
481            long o = (long) vh.getAndSetRelease(recv, 0xCAFEBABECAFEBABEL);
482            assertEquals(o, 0x0123456789ABCDEFL, "getAndSetRelease long");
483            long x = (long) vh.get(recv);
484            assertEquals(x, 0xCAFEBABECAFEBABEL, "getAndSetRelease long value");
485        }
486
487        // get and add, add and get
488        {
489            vh.set(recv, 0x0123456789ABCDEFL);
490
491            long o = (long) vh.getAndAdd(recv, 0xCAFEBABECAFEBABEL);
492            assertEquals(o, 0x0123456789ABCDEFL, "getAndAdd long");
493            long x = (long) vh.get(recv);
494            assertEquals(x, (long)(0x0123456789ABCDEFL + 0xCAFEBABECAFEBABEL), "getAndAdd long value");
495        }
496
497        {
498            vh.set(recv, 0x0123456789ABCDEFL);
499
500            long o = (long) vh.getAndAddAcquire(recv, 0xCAFEBABECAFEBABEL);
501            assertEquals(o, 0x0123456789ABCDEFL, "getAndAddAcquire long");
502            long x = (long) vh.get(recv);
503            assertEquals(x, (long)(0x0123456789ABCDEFL + 0xCAFEBABECAFEBABEL), "getAndAddAcquire long value");
504        }
505
506        {
507            vh.set(recv, 0x0123456789ABCDEFL);
508
509            long o = (long) vh.getAndAddRelease(recv, 0xCAFEBABECAFEBABEL);
510            assertEquals(o, 0x0123456789ABCDEFL, "getAndAddReleaselong");
511            long x = (long) vh.get(recv);
512            assertEquals(x, (long)(0x0123456789ABCDEFL + 0xCAFEBABECAFEBABEL), "getAndAddRelease long value");
513        }
514
515        // get and bitwise or
516        {
517            vh.set(recv, 0x0123456789ABCDEFL);
518
519            long o = (long) vh.getAndBitwiseOr(recv, 0xCAFEBABECAFEBABEL);
520            assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseOr long");
521            long x = (long) vh.get(recv);
522            assertEquals(x, (long)(0x0123456789ABCDEFL | 0xCAFEBABECAFEBABEL), "getAndBitwiseOr long value");
523        }
524
525        {
526            vh.set(recv, 0x0123456789ABCDEFL);
527
528            long o = (long) vh.getAndBitwiseOrAcquire(recv, 0xCAFEBABECAFEBABEL);
529            assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseOrAcquire long");
530            long x = (long) vh.get(recv);
531            assertEquals(x, (long)(0x0123456789ABCDEFL | 0xCAFEBABECAFEBABEL), "getAndBitwiseOrAcquire long value");
532        }
533
534        {
535            vh.set(recv, 0x0123456789ABCDEFL);
536
537            long o = (long) vh.getAndBitwiseOrRelease(recv, 0xCAFEBABECAFEBABEL);
538            assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseOrRelease long");
539            long x = (long) vh.get(recv);
540            assertEquals(x, (long)(0x0123456789ABCDEFL | 0xCAFEBABECAFEBABEL), "getAndBitwiseOrRelease long value");
541        }
542
543        // get and bitwise and
544        {
545            vh.set(recv, 0x0123456789ABCDEFL);
546
547            long o = (long) vh.getAndBitwiseAnd(recv, 0xCAFEBABECAFEBABEL);
548            assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseAnd long");
549            long x = (long) vh.get(recv);
550            assertEquals(x, (long)(0x0123456789ABCDEFL & 0xCAFEBABECAFEBABEL), "getAndBitwiseAnd long value");
551        }
552
553        {
554            vh.set(recv, 0x0123456789ABCDEFL);
555
556            long o = (long) vh.getAndBitwiseAndAcquire(recv, 0xCAFEBABECAFEBABEL);
557            assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseAndAcquire long");
558            long x = (long) vh.get(recv);
559            assertEquals(x, (long)(0x0123456789ABCDEFL & 0xCAFEBABECAFEBABEL), "getAndBitwiseAndAcquire long value");
560        }
561
562        {
563            vh.set(recv, 0x0123456789ABCDEFL);
564
565            long o = (long) vh.getAndBitwiseAndRelease(recv, 0xCAFEBABECAFEBABEL);
566            assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseAndRelease long");
567            long x = (long) vh.get(recv);
568            assertEquals(x, (long)(0x0123456789ABCDEFL & 0xCAFEBABECAFEBABEL), "getAndBitwiseAndRelease long value");
569        }
570
571        // get and bitwise xor
572        {
573            vh.set(recv, 0x0123456789ABCDEFL);
574
575            long o = (long) vh.getAndBitwiseXor(recv, 0xCAFEBABECAFEBABEL);
576            assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseXor long");
577            long x = (long) vh.get(recv);
578            assertEquals(x, (long)(0x0123456789ABCDEFL ^ 0xCAFEBABECAFEBABEL), "getAndBitwiseXor long value");
579        }
580
581        {
582            vh.set(recv, 0x0123456789ABCDEFL);
583
584            long o = (long) vh.getAndBitwiseXorAcquire(recv, 0xCAFEBABECAFEBABEL);
585            assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseXorAcquire long");
586            long x = (long) vh.get(recv);
587            assertEquals(x, (long)(0x0123456789ABCDEFL ^ 0xCAFEBABECAFEBABEL), "getAndBitwiseXorAcquire long value");
588        }
589
590        {
591            vh.set(recv, 0x0123456789ABCDEFL);
592
593            long o = (long) vh.getAndBitwiseXorRelease(recv, 0xCAFEBABECAFEBABEL);
594            assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseXorRelease long");
595            long x = (long) vh.get(recv);
596            assertEquals(x, (long)(0x0123456789ABCDEFL ^ 0xCAFEBABECAFEBABEL), "getAndBitwiseXorRelease long value");
597        }
598    }
599
600    static void testInstanceFieldUnsupported(VarHandleTestAccessLong recv, VarHandle vh) {
601
602
603    }
604
605
606    static void testStaticField(VarHandle vh) {
607        // Plain
608        {
609            vh.set(0x0123456789ABCDEFL);
610            long x = (long) vh.get();
611            assertEquals(x, 0x0123456789ABCDEFL, "set long value");
612        }
613
614
615        // Volatile
616        {
617            vh.setVolatile(0xCAFEBABECAFEBABEL);
618            long x = (long) vh.getVolatile();
619            assertEquals(x, 0xCAFEBABECAFEBABEL, "setVolatile long value");
620        }
621
622        // Lazy
623        {
624            vh.setRelease(0x0123456789ABCDEFL);
625            long x = (long) vh.getAcquire();
626            assertEquals(x, 0x0123456789ABCDEFL, "setRelease long value");
627        }
628
629        // Opaque
630        {
631            vh.setOpaque(0xCAFEBABECAFEBABEL);
632            long x = (long) vh.getOpaque();
633            assertEquals(x, 0xCAFEBABECAFEBABEL, "setOpaque long value");
634        }
635
636        vh.set(0x0123456789ABCDEFL);
637
638        // Compare
639        {
640            boolean r = vh.compareAndSet(0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL);
641            assertEquals(r, true, "success compareAndSet long");
642            long x = (long) vh.get();
643            assertEquals(x, 0xCAFEBABECAFEBABEL, "success compareAndSet long value");
644        }
645
646        {
647            boolean r = vh.compareAndSet(0x0123456789ABCDEFL, 0xDEADBEEFDEADBEEFL);
648            assertEquals(r, false, "failing compareAndSet long");
649            long x = (long) vh.get();
650            assertEquals(x, 0xCAFEBABECAFEBABEL, "failing compareAndSet long value");
651        }
652
653        {
654            long r = (long) vh.compareAndExchange(0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL);
655            assertEquals(r, 0xCAFEBABECAFEBABEL, "success compareAndExchange long");
656            long x = (long) vh.get();
657            assertEquals(x, 0x0123456789ABCDEFL, "success compareAndExchange long value");
658        }
659
660        {
661            long r = (long) vh.compareAndExchange(0xCAFEBABECAFEBABEL, 0xDEADBEEFDEADBEEFL);
662            assertEquals(r, 0x0123456789ABCDEFL, "failing compareAndExchange long");
663            long x = (long) vh.get();
664            assertEquals(x, 0x0123456789ABCDEFL, "failing compareAndExchange long value");
665        }
666
667        {
668            long r = (long) vh.compareAndExchangeAcquire(0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL);
669            assertEquals(r, 0x0123456789ABCDEFL, "success compareAndExchangeAcquire long");
670            long x = (long) vh.get();
671            assertEquals(x, 0xCAFEBABECAFEBABEL, "success compareAndExchangeAcquire long value");
672        }
673
674        {
675            long r = (long) vh.compareAndExchangeAcquire(0x0123456789ABCDEFL, 0xDEADBEEFDEADBEEFL);
676            assertEquals(r, 0xCAFEBABECAFEBABEL, "failing compareAndExchangeAcquire long");
677            long x = (long) vh.get();
678            assertEquals(x, 0xCAFEBABECAFEBABEL, "failing compareAndExchangeAcquire long value");
679        }
680
681        {
682            long r = (long) vh.compareAndExchangeRelease(0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL);
683            assertEquals(r, 0xCAFEBABECAFEBABEL, "success compareAndExchangeRelease long");
684            long x = (long) vh.get();
685            assertEquals(x, 0x0123456789ABCDEFL, "success compareAndExchangeRelease long value");
686        }
687
688        {
689            long r = (long) vh.compareAndExchangeRelease(0xCAFEBABECAFEBABEL, 0xDEADBEEFDEADBEEFL);
690            assertEquals(r, 0x0123456789ABCDEFL, "failing compareAndExchangeRelease long");
691            long x = (long) vh.get();
692            assertEquals(x, 0x0123456789ABCDEFL, "failing compareAndExchangeRelease long value");
693        }
694
695        {
696            boolean success = false;
697            for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
698                success = vh.weakCompareAndSetPlain(0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL);
699            }
700            assertEquals(success, true, "weakCompareAndSetPlain long");
701            long x = (long) vh.get();
702            assertEquals(x, 0xCAFEBABECAFEBABEL, "weakCompareAndSetPlain long value");
703        }
704
705        {
706            boolean success = false;
707            for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
708                success = vh.weakCompareAndSetAcquire(0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL);
709            }
710            assertEquals(success, true, "weakCompareAndSetAcquire long");
711            long x = (long) vh.get();
712            assertEquals(x, 0x0123456789ABCDEFL, "weakCompareAndSetAcquire long");
713        }
714
715        {
716            boolean success = false;
717            for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
718                success = vh.weakCompareAndSetRelease(0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL);
719            }
720            assertEquals(success, true, "weakCompareAndSetRelease long");
721            long x = (long) vh.get();
722            assertEquals(x, 0xCAFEBABECAFEBABEL, "weakCompareAndSetRelease long");
723        }
724
725        {
726            boolean success = false;
727            for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
728                success = vh.weakCompareAndSet(0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL);
729            }
730            assertEquals(success, true, "weakCompareAndSet long");
731            long x = (long) vh.get();
732            assertEquals(x, 0x0123456789ABCDEFL, "weakCompareAndSet long");
733        }
734
735        // Compare set and get
736        {
737            vh.set(0x0123456789ABCDEFL);
738
739            long o = (long) vh.getAndSet(0xCAFEBABECAFEBABEL);
740            assertEquals(o, 0x0123456789ABCDEFL, "getAndSet long");
741            long x = (long) vh.get();
742            assertEquals(x, 0xCAFEBABECAFEBABEL, "getAndSet long value");
743        }
744
745        {
746            vh.set(0x0123456789ABCDEFL);
747
748            long o = (long) vh.getAndSetAcquire(0xCAFEBABECAFEBABEL);
749            assertEquals(o, 0x0123456789ABCDEFL, "getAndSetAcquire long");
750            long x = (long) vh.get();
751            assertEquals(x, 0xCAFEBABECAFEBABEL, "getAndSetAcquire long value");
752        }
753
754        {
755            vh.set(0x0123456789ABCDEFL);
756
757            long o = (long) vh.getAndSetRelease(0xCAFEBABECAFEBABEL);
758            assertEquals(o, 0x0123456789ABCDEFL, "getAndSetRelease long");
759            long x = (long) vh.get();
760            assertEquals(x, 0xCAFEBABECAFEBABEL, "getAndSetRelease long value");
761        }
762
763        // get and add, add and get
764        {
765            vh.set(0x0123456789ABCDEFL);
766
767            long o = (long) vh.getAndAdd(0xCAFEBABECAFEBABEL);
768            assertEquals(o, 0x0123456789ABCDEFL, "getAndAdd long");
769            long x = (long) vh.get();
770            assertEquals(x, (long)(0x0123456789ABCDEFL + 0xCAFEBABECAFEBABEL), "getAndAdd long value");
771        }
772
773        {
774            vh.set(0x0123456789ABCDEFL);
775
776            long o = (long) vh.getAndAddAcquire(0xCAFEBABECAFEBABEL);
777            assertEquals(o, 0x0123456789ABCDEFL, "getAndAddAcquire long");
778            long x = (long) vh.get();
779            assertEquals(x, (long)(0x0123456789ABCDEFL + 0xCAFEBABECAFEBABEL), "getAndAddAcquire long value");
780        }
781
782        {
783            vh.set(0x0123456789ABCDEFL);
784
785            long o = (long) vh.getAndAddRelease(0xCAFEBABECAFEBABEL);
786            assertEquals(o, 0x0123456789ABCDEFL, "getAndAddReleaselong");
787            long x = (long) vh.get();
788            assertEquals(x, (long)(0x0123456789ABCDEFL + 0xCAFEBABECAFEBABEL), "getAndAddRelease long value");
789        }
790
791        // get and bitwise or
792        {
793            vh.set(0x0123456789ABCDEFL);
794
795            long o = (long) vh.getAndBitwiseOr(0xCAFEBABECAFEBABEL);
796            assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseOr long");
797            long x = (long) vh.get();
798            assertEquals(x, (long)(0x0123456789ABCDEFL | 0xCAFEBABECAFEBABEL), "getAndBitwiseOr long value");
799        }
800
801        {
802            vh.set(0x0123456789ABCDEFL);
803
804            long o = (long) vh.getAndBitwiseOrAcquire(0xCAFEBABECAFEBABEL);
805            assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseOrAcquire long");
806            long x = (long) vh.get();
807            assertEquals(x, (long)(0x0123456789ABCDEFL | 0xCAFEBABECAFEBABEL), "getAndBitwiseOrAcquire long value");
808        }
809
810        {
811            vh.set(0x0123456789ABCDEFL);
812
813            long o = (long) vh.getAndBitwiseOrRelease(0xCAFEBABECAFEBABEL);
814            assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseOrRelease long");
815            long x = (long) vh.get();
816            assertEquals(x, (long)(0x0123456789ABCDEFL | 0xCAFEBABECAFEBABEL), "getAndBitwiseOrRelease long value");
817        }
818
819        // get and bitwise and
820        {
821            vh.set(0x0123456789ABCDEFL);
822
823            long o = (long) vh.getAndBitwiseAnd(0xCAFEBABECAFEBABEL);
824            assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseAnd long");
825            long x = (long) vh.get();
826            assertEquals(x, (long)(0x0123456789ABCDEFL & 0xCAFEBABECAFEBABEL), "getAndBitwiseAnd long value");
827        }
828
829        {
830            vh.set(0x0123456789ABCDEFL);
831
832            long o = (long) vh.getAndBitwiseAndAcquire(0xCAFEBABECAFEBABEL);
833            assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseAndAcquire long");
834            long x = (long) vh.get();
835            assertEquals(x, (long)(0x0123456789ABCDEFL & 0xCAFEBABECAFEBABEL), "getAndBitwiseAndAcquire long value");
836        }
837
838        {
839            vh.set(0x0123456789ABCDEFL);
840
841            long o = (long) vh.getAndBitwiseAndRelease(0xCAFEBABECAFEBABEL);
842            assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseAndRelease long");
843            long x = (long) vh.get();
844            assertEquals(x, (long)(0x0123456789ABCDEFL & 0xCAFEBABECAFEBABEL), "getAndBitwiseAndRelease long value");
845        }
846
847        // get and bitwise xor
848        {
849            vh.set(0x0123456789ABCDEFL);
850
851            long o = (long) vh.getAndBitwiseXor(0xCAFEBABECAFEBABEL);
852            assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseXor long");
853            long x = (long) vh.get();
854            assertEquals(x, (long)(0x0123456789ABCDEFL ^ 0xCAFEBABECAFEBABEL), "getAndBitwiseXor long value");
855        }
856
857        {
858            vh.set(0x0123456789ABCDEFL);
859
860            long o = (long) vh.getAndBitwiseXorAcquire(0xCAFEBABECAFEBABEL);
861            assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseXorAcquire long");
862            long x = (long) vh.get();
863            assertEquals(x, (long)(0x0123456789ABCDEFL ^ 0xCAFEBABECAFEBABEL), "getAndBitwiseXorAcquire long value");
864        }
865
866        {
867            vh.set(0x0123456789ABCDEFL);
868
869            long o = (long) vh.getAndBitwiseXorRelease(0xCAFEBABECAFEBABEL);
870            assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseXorRelease long");
871            long x = (long) vh.get();
872            assertEquals(x, (long)(0x0123456789ABCDEFL ^ 0xCAFEBABECAFEBABEL), "getAndBitwiseXorRelease long value");
873        }
874    }
875
876    static void testStaticFieldUnsupported(VarHandle vh) {
877
878
879    }
880
881
882    static void testArray(VarHandle vh) {
883        long[] array = new long[10];
884
885        for (int i = 0; i < array.length; i++) {
886            // Plain
887            {
888                vh.set(array, i, 0x0123456789ABCDEFL);
889                long x = (long) vh.get(array, i);
890                assertEquals(x, 0x0123456789ABCDEFL, "get long value");
891            }
892
893
894            // Volatile
895            {
896                vh.setVolatile(array, i, 0xCAFEBABECAFEBABEL);
897                long x = (long) vh.getVolatile(array, i);
898                assertEquals(x, 0xCAFEBABECAFEBABEL, "setVolatile long value");
899            }
900
901            // Lazy
902            {
903                vh.setRelease(array, i, 0x0123456789ABCDEFL);
904                long x = (long) vh.getAcquire(array, i);
905                assertEquals(x, 0x0123456789ABCDEFL, "setRelease long value");
906            }
907
908            // Opaque
909            {
910                vh.setOpaque(array, i, 0xCAFEBABECAFEBABEL);
911                long x = (long) vh.getOpaque(array, i);
912                assertEquals(x, 0xCAFEBABECAFEBABEL, "setOpaque long value");
913            }
914
915            vh.set(array, i, 0x0123456789ABCDEFL);
916
917            // Compare
918            {
919                boolean r = vh.compareAndSet(array, i, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL);
920                assertEquals(r, true, "success compareAndSet long");
921                long x = (long) vh.get(array, i);
922                assertEquals(x, 0xCAFEBABECAFEBABEL, "success compareAndSet long value");
923            }
924
925            {
926                boolean r = vh.compareAndSet(array, i, 0x0123456789ABCDEFL, 0xDEADBEEFDEADBEEFL);
927                assertEquals(r, false, "failing compareAndSet long");
928                long x = (long) vh.get(array, i);
929                assertEquals(x, 0xCAFEBABECAFEBABEL, "failing compareAndSet long value");
930            }
931
932            {
933                long r = (long) vh.compareAndExchange(array, i, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL);
934                assertEquals(r, 0xCAFEBABECAFEBABEL, "success compareAndExchange long");
935                long x = (long) vh.get(array, i);
936                assertEquals(x, 0x0123456789ABCDEFL, "success compareAndExchange long value");
937            }
938
939            {
940                long r = (long) vh.compareAndExchange(array, i, 0xCAFEBABECAFEBABEL, 0xDEADBEEFDEADBEEFL);
941                assertEquals(r, 0x0123456789ABCDEFL, "failing compareAndExchange long");
942                long x = (long) vh.get(array, i);
943                assertEquals(x, 0x0123456789ABCDEFL, "failing compareAndExchange long value");
944            }
945
946            {
947                long r = (long) vh.compareAndExchangeAcquire(array, i, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL);
948                assertEquals(r, 0x0123456789ABCDEFL, "success compareAndExchangeAcquire long");
949                long x = (long) vh.get(array, i);
950                assertEquals(x, 0xCAFEBABECAFEBABEL, "success compareAndExchangeAcquire long value");
951            }
952
953            {
954                long r = (long) vh.compareAndExchangeAcquire(array, i, 0x0123456789ABCDEFL, 0xDEADBEEFDEADBEEFL);
955                assertEquals(r, 0xCAFEBABECAFEBABEL, "failing compareAndExchangeAcquire long");
956                long x = (long) vh.get(array, i);
957                assertEquals(x, 0xCAFEBABECAFEBABEL, "failing compareAndExchangeAcquire long value");
958            }
959
960            {
961                long r = (long) vh.compareAndExchangeRelease(array, i, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL);
962                assertEquals(r, 0xCAFEBABECAFEBABEL, "success compareAndExchangeRelease long");
963                long x = (long) vh.get(array, i);
964                assertEquals(x, 0x0123456789ABCDEFL, "success compareAndExchangeRelease long value");
965            }
966
967            {
968                long r = (long) vh.compareAndExchangeRelease(array, i, 0xCAFEBABECAFEBABEL, 0xDEADBEEFDEADBEEFL);
969                assertEquals(r, 0x0123456789ABCDEFL, "failing compareAndExchangeRelease long");
970                long x = (long) vh.get(array, i);
971                assertEquals(x, 0x0123456789ABCDEFL, "failing compareAndExchangeRelease long value");
972            }
973
974            {
975                boolean success = false;
976                for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
977                    success = vh.weakCompareAndSetPlain(array, i, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL);
978                }
979                assertEquals(success, true, "weakCompareAndSetPlain long");
980                long x = (long) vh.get(array, i);
981                assertEquals(x, 0xCAFEBABECAFEBABEL, "weakCompareAndSetPlain long value");
982            }
983
984            {
985                boolean success = false;
986                for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
987                    success = vh.weakCompareAndSetAcquire(array, i, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL);
988                }
989                assertEquals(success, true, "weakCompareAndSetAcquire long");
990                long x = (long) vh.get(array, i);
991                assertEquals(x, 0x0123456789ABCDEFL, "weakCompareAndSetAcquire long");
992            }
993
994            {
995                boolean success = false;
996                for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
997                    success = vh.weakCompareAndSetRelease(array, i, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL);
998                }
999                assertEquals(success, true, "weakCompareAndSetRelease long");
1000                long x = (long) vh.get(array, i);
1001                assertEquals(x, 0xCAFEBABECAFEBABEL, "weakCompareAndSetRelease long");
1002            }
1003
1004            {
1005                boolean success = false;
1006                for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
1007                    success = vh.weakCompareAndSet(array, i, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL);
1008                }
1009                assertEquals(success, true, "weakCompareAndSet long");
1010                long x = (long) vh.get(array, i);
1011                assertEquals(x, 0x0123456789ABCDEFL, "weakCompareAndSet long");
1012            }
1013
1014            // Compare set and get
1015            {
1016                vh.set(array, i, 0x0123456789ABCDEFL);
1017
1018                long o = (long) vh.getAndSet(array, i, 0xCAFEBABECAFEBABEL);
1019                assertEquals(o, 0x0123456789ABCDEFL, "getAndSet long");
1020                long x = (long) vh.get(array, i);
1021                assertEquals(x, 0xCAFEBABECAFEBABEL, "getAndSet long value");
1022            }
1023
1024            {
1025                vh.set(array, i, 0x0123456789ABCDEFL);
1026
1027                long o = (long) vh.getAndSetAcquire(array, i, 0xCAFEBABECAFEBABEL);
1028                assertEquals(o, 0x0123456789ABCDEFL, "getAndSetAcquire long");
1029                long x = (long) vh.get(array, i);
1030                assertEquals(x, 0xCAFEBABECAFEBABEL, "getAndSetAcquire long value");
1031            }
1032
1033            {
1034                vh.set(array, i, 0x0123456789ABCDEFL);
1035
1036                long o = (long) vh.getAndSetRelease(array, i, 0xCAFEBABECAFEBABEL);
1037                assertEquals(o, 0x0123456789ABCDEFL, "getAndSetRelease long");
1038                long x = (long) vh.get(array, i);
1039                assertEquals(x, 0xCAFEBABECAFEBABEL, "getAndSetRelease long value");
1040            }
1041
1042            // get and add, add and get
1043            {
1044                vh.set(array, i, 0x0123456789ABCDEFL);
1045
1046                long o = (long) vh.getAndAdd(array, i, 0xCAFEBABECAFEBABEL);
1047                assertEquals(o, 0x0123456789ABCDEFL, "getAndAdd long");
1048                long x = (long) vh.get(array, i);
1049                assertEquals(x, (long)(0x0123456789ABCDEFL + 0xCAFEBABECAFEBABEL), "getAndAdd long value");
1050            }
1051
1052            {
1053                vh.set(array, i, 0x0123456789ABCDEFL);
1054
1055                long o = (long) vh.getAndAddAcquire(array, i, 0xCAFEBABECAFEBABEL);
1056                assertEquals(o, 0x0123456789ABCDEFL, "getAndAddAcquire long");
1057                long x = (long) vh.get(array, i);
1058                assertEquals(x, (long)(0x0123456789ABCDEFL + 0xCAFEBABECAFEBABEL), "getAndAddAcquire long value");
1059            }
1060
1061            {
1062                vh.set(array, i, 0x0123456789ABCDEFL);
1063
1064                long o = (long) vh.getAndAddRelease(array, i, 0xCAFEBABECAFEBABEL);
1065                assertEquals(o, 0x0123456789ABCDEFL, "getAndAddReleaselong");
1066                long x = (long) vh.get(array, i);
1067                assertEquals(x, (long)(0x0123456789ABCDEFL + 0xCAFEBABECAFEBABEL), "getAndAddRelease long value");
1068            }
1069
1070            // get and bitwise or
1071            {
1072                vh.set(array, i, 0x0123456789ABCDEFL);
1073
1074                long o = (long) vh.getAndBitwiseOr(array, i, 0xCAFEBABECAFEBABEL);
1075                assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseOr long");
1076                long x = (long) vh.get(array, i);
1077                assertEquals(x, (long)(0x0123456789ABCDEFL | 0xCAFEBABECAFEBABEL), "getAndBitwiseOr long value");
1078            }
1079
1080            {
1081                vh.set(array, i, 0x0123456789ABCDEFL);
1082
1083                long o = (long) vh.getAndBitwiseOrAcquire(array, i, 0xCAFEBABECAFEBABEL);
1084                assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseOrAcquire long");
1085                long x = (long) vh.get(array, i);
1086                assertEquals(x, (long)(0x0123456789ABCDEFL | 0xCAFEBABECAFEBABEL), "getAndBitwiseOrAcquire long value");
1087            }
1088
1089            {
1090                vh.set(array, i, 0x0123456789ABCDEFL);
1091
1092                long o = (long) vh.getAndBitwiseOrRelease(array, i, 0xCAFEBABECAFEBABEL);
1093                assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseOrRelease long");
1094                long x = (long) vh.get(array, i);
1095                assertEquals(x, (long)(0x0123456789ABCDEFL | 0xCAFEBABECAFEBABEL), "getAndBitwiseOrRelease long value");
1096            }
1097
1098            // get and bitwise and
1099            {
1100                vh.set(array, i, 0x0123456789ABCDEFL);
1101
1102                long o = (long) vh.getAndBitwiseAnd(array, i, 0xCAFEBABECAFEBABEL);
1103                assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseAnd long");
1104                long x = (long) vh.get(array, i);
1105                assertEquals(x, (long)(0x0123456789ABCDEFL & 0xCAFEBABECAFEBABEL), "getAndBitwiseAnd long value");
1106            }
1107
1108            {
1109                vh.set(array, i, 0x0123456789ABCDEFL);
1110
1111                long o = (long) vh.getAndBitwiseAndAcquire(array, i, 0xCAFEBABECAFEBABEL);
1112                assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseAndAcquire long");
1113                long x = (long) vh.get(array, i);
1114                assertEquals(x, (long)(0x0123456789ABCDEFL & 0xCAFEBABECAFEBABEL), "getAndBitwiseAndAcquire long value");
1115            }
1116
1117            {
1118                vh.set(array, i, 0x0123456789ABCDEFL);
1119
1120                long o = (long) vh.getAndBitwiseAndRelease(array, i, 0xCAFEBABECAFEBABEL);
1121                assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseAndRelease long");
1122                long x = (long) vh.get(array, i);
1123                assertEquals(x, (long)(0x0123456789ABCDEFL & 0xCAFEBABECAFEBABEL), "getAndBitwiseAndRelease long value");
1124            }
1125
1126            // get and bitwise xor
1127            {
1128                vh.set(array, i, 0x0123456789ABCDEFL);
1129
1130                long o = (long) vh.getAndBitwiseXor(array, i, 0xCAFEBABECAFEBABEL);
1131                assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseXor long");
1132                long x = (long) vh.get(array, i);
1133                assertEquals(x, (long)(0x0123456789ABCDEFL ^ 0xCAFEBABECAFEBABEL), "getAndBitwiseXor long value");
1134            }
1135
1136            {
1137                vh.set(array, i, 0x0123456789ABCDEFL);
1138
1139                long o = (long) vh.getAndBitwiseXorAcquire(array, i, 0xCAFEBABECAFEBABEL);
1140                assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseXorAcquire long");
1141                long x = (long) vh.get(array, i);
1142                assertEquals(x, (long)(0x0123456789ABCDEFL ^ 0xCAFEBABECAFEBABEL), "getAndBitwiseXorAcquire long value");
1143            }
1144
1145            {
1146                vh.set(array, i, 0x0123456789ABCDEFL);
1147
1148                long o = (long) vh.getAndBitwiseXorRelease(array, i, 0xCAFEBABECAFEBABEL);
1149                assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseXorRelease long");
1150                long x = (long) vh.get(array, i);
1151                assertEquals(x, (long)(0x0123456789ABCDEFL ^ 0xCAFEBABECAFEBABEL), "getAndBitwiseXorRelease long value");
1152            }
1153        }
1154    }
1155
1156    static void testArrayUnsupported(VarHandle vh) {
1157        long[] array = new long[10];
1158
1159        int i = 0;
1160
1161
1162    }
1163
1164    static void testArrayIndexOutOfBounds(VarHandle vh) throws Throwable {
1165        long[] array = new long[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                long x = (long) vh.get(array, ci);
1172            });
1173
1174            checkIOOBE(() -> {
1175                vh.set(array, ci, 0x0123456789ABCDEFL);
1176            });
1177
1178            checkIOOBE(() -> {
1179                long x = (long) vh.getVolatile(array, ci);
1180            });
1181
1182            checkIOOBE(() -> {
1183                vh.setVolatile(array, ci, 0x0123456789ABCDEFL);
1184            });
1185
1186            checkIOOBE(() -> {
1187                long x = (long) vh.getAcquire(array, ci);
1188            });
1189
1190            checkIOOBE(() -> {
1191                vh.setRelease(array, ci, 0x0123456789ABCDEFL);
1192            });
1193
1194            checkIOOBE(() -> {
1195                long x = (long) vh.getOpaque(array, ci);
1196            });
1197
1198            checkIOOBE(() -> {
1199                vh.setOpaque(array, ci, 0x0123456789ABCDEFL);
1200            });
1201
1202            checkIOOBE(() -> {
1203                boolean r = vh.compareAndSet(array, ci, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL);
1204            });
1205
1206            checkIOOBE(() -> {
1207                long r = (long) vh.compareAndExchange(array, ci, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL);
1208            });
1209
1210            checkIOOBE(() -> {
1211                long r = (long) vh.compareAndExchangeAcquire(array, ci, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL);
1212            });
1213
1214            checkIOOBE(() -> {
1215                long r = (long) vh.compareAndExchangeRelease(array, ci, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL);
1216            });
1217
1218            checkIOOBE(() -> {
1219                boolean r = vh.weakCompareAndSetPlain(array, ci, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL);
1220            });
1221
1222            checkIOOBE(() -> {
1223                boolean r = vh.weakCompareAndSet(array, ci, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL);
1224            });
1225
1226            checkIOOBE(() -> {
1227                boolean r = vh.weakCompareAndSetAcquire(array, ci, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL);
1228            });
1229
1230            checkIOOBE(() -> {
1231                boolean r = vh.weakCompareAndSetRelease(array, ci, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL);
1232            });
1233
1234            checkIOOBE(() -> {
1235                long o = (long) vh.getAndSet(array, ci, 0x0123456789ABCDEFL);
1236            });
1237
1238            checkIOOBE(() -> {
1239                long o = (long) vh.getAndSetAcquire(array, ci, 0x0123456789ABCDEFL);
1240            });
1241
1242            checkIOOBE(() -> {
1243                long o = (long) vh.getAndSetRelease(array, ci, 0x0123456789ABCDEFL);
1244            });
1245
1246            checkIOOBE(() -> {
1247                long o = (long) vh.getAndAdd(array, ci, 0x0123456789ABCDEFL);
1248            });
1249
1250            checkIOOBE(() -> {
1251                long o = (long) vh.getAndAddAcquire(array, ci, 0x0123456789ABCDEFL);
1252            });
1253
1254            checkIOOBE(() -> {
1255                long o = (long) vh.getAndAddRelease(array, ci, 0x0123456789ABCDEFL);
1256            });
1257
1258            checkIOOBE(() -> {
1259                long o = (long) vh.getAndBitwiseOr(array, ci, 0x0123456789ABCDEFL);
1260            });
1261
1262            checkIOOBE(() -> {
1263                long o = (long) vh.getAndBitwiseOrAcquire(array, ci, 0x0123456789ABCDEFL);
1264            });
1265
1266            checkIOOBE(() -> {
1267                long o = (long) vh.getAndBitwiseOrRelease(array, ci, 0x0123456789ABCDEFL);
1268            });
1269
1270            checkIOOBE(() -> {
1271                long o = (long) vh.getAndBitwiseAnd(array, ci, 0x0123456789ABCDEFL);
1272            });
1273
1274            checkIOOBE(() -> {
1275                long o = (long) vh.getAndBitwiseAndAcquire(array, ci, 0x0123456789ABCDEFL);
1276            });
1277
1278            checkIOOBE(() -> {
1279                long o = (long) vh.getAndBitwiseAndRelease(array, ci, 0x0123456789ABCDEFL);
1280            });
1281
1282            checkIOOBE(() -> {
1283                long o = (long) vh.getAndBitwiseXor(array, ci, 0x0123456789ABCDEFL);
1284            });
1285
1286            checkIOOBE(() -> {
1287                long o = (long) vh.getAndBitwiseXorAcquire(array, ci, 0x0123456789ABCDEFL);
1288            });
1289
1290            checkIOOBE(() -> {
1291                long o = (long) vh.getAndBitwiseXorRelease(array, ci, 0x0123456789ABCDEFL);
1292            });
1293        }
1294    }
1295}
1296
1297