blob: 6e16e7c82da8e2c0785058e2034abffaa0cd3a9c [file] [log] [blame]
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001/*
2 * Copyright (c) 2015, 2016, 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=20000 VarHandleTestMethodHandleAccessLong
27 */
28
29import org.testng.annotations.BeforeClass;
30import org.testng.annotations.DataProvider;
31import org.testng.annotations.Test;
32
33import java.lang.invoke.MethodHandles;
34import java.lang.invoke.VarHandle;
35import java.util.ArrayList;
36import java.util.Arrays;
37import java.util.List;
38
39import static org.testng.Assert.*;
40
41public class VarHandleTestMethodHandleAccessLong extends VarHandleBaseTest {
Aleksey Shipileve6632062016-06-15 11:20:15 +030042 static final long static_final_v = 0x0123456789ABCDEFL;
Paul Sandoz9fb30a32016-03-24 11:21:21 +010043
44 static long static_v;
45
Aleksey Shipileve6632062016-06-15 11:20:15 +030046 final long final_v = 0x0123456789ABCDEFL;
Paul Sandoz9fb30a32016-03-24 11:21:21 +010047
48 long v;
49
50 VarHandle vhFinalField;
51
52 VarHandle vhField;
53
54 VarHandle vhStaticField;
55
56 VarHandle vhStaticFinalField;
57
58 VarHandle vhArray;
59
60 @BeforeClass
61 public void setup() throws Exception {
62 vhFinalField = MethodHandles.lookup().findVarHandle(
63 VarHandleTestMethodHandleAccessLong.class, "final_v", long.class);
64
65 vhField = MethodHandles.lookup().findVarHandle(
66 VarHandleTestMethodHandleAccessLong.class, "v", long.class);
67
68 vhStaticFinalField = MethodHandles.lookup().findStaticVarHandle(
69 VarHandleTestMethodHandleAccessLong.class, "static_final_v", long.class);
70
71 vhStaticField = MethodHandles.lookup().findStaticVarHandle(
72 VarHandleTestMethodHandleAccessLong.class, "static_v", long.class);
73
74 vhArray = MethodHandles.arrayElementVarHandle(long[].class);
75 }
76
77
78 @DataProvider
79 public Object[][] accessTestCaseProvider() throws Exception {
80 List<AccessTestCase<?>> cases = new ArrayList<>();
81
82 for (VarHandleToMethodHandle f : VarHandleToMethodHandle.values()) {
83 cases.add(new MethodHandleAccessTestCase("Instance field",
84 vhField, f, hs -> testInstanceField(this, hs)));
85 cases.add(new MethodHandleAccessTestCase("Instance field unsupported",
86 vhField, f, hs -> testInstanceFieldUnsupported(this, hs),
87 false));
88
89 cases.add(new MethodHandleAccessTestCase("Static field",
90 vhStaticField, f, VarHandleTestMethodHandleAccessLong::testStaticField));
91 cases.add(new MethodHandleAccessTestCase("Static field unsupported",
92 vhStaticField, f, VarHandleTestMethodHandleAccessLong::testStaticFieldUnsupported,
93 false));
94
95 cases.add(new MethodHandleAccessTestCase("Array",
96 vhArray, f, VarHandleTestMethodHandleAccessLong::testArray));
97 cases.add(new MethodHandleAccessTestCase("Array unsupported",
98 vhArray, f, VarHandleTestMethodHandleAccessLong::testArrayUnsupported,
99 false));
100 cases.add(new MethodHandleAccessTestCase("Array index out of bounds",
101 vhArray, f, VarHandleTestMethodHandleAccessLong::testArrayIndexOutOfBounds,
102 false));
103 }
104
105 // Work around issue with jtreg summary reporting which truncates
106 // the String result of Object.toString to 30 characters, hence
107 // the first dummy argument
108 return cases.stream().map(tc -> new Object[]{tc.toString(), tc}).toArray(Object[][]::new);
109 }
110
111 @Test(dataProvider = "accessTestCaseProvider")
112 public <T> void testAccess(String desc, AccessTestCase<T> atc) throws Throwable {
113 T t = atc.get();
114 int iters = atc.requiresLoop() ? ITERS : 1;
115 for (int c = 0; c < iters; c++) {
116 atc.testAccess(t);
117 }
118 }
119
120
121 static void testInstanceField(VarHandleTestMethodHandleAccessLong recv, Handles hs) throws Throwable {
122 // Plain
123 {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300124 hs.get(TestAccessMode.SET).invokeExact(recv, 0x0123456789ABCDEFL);
Paul Sandoza7aff442016-04-13 15:05:48 +0200125 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300126 assertEquals(x, 0x0123456789ABCDEFL, "set long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100127 }
128
129
130 // Volatile
131 {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300132 hs.get(TestAccessMode.SET_VOLATILE).invokeExact(recv, 0xCAFEBABECAFEBABEL);
Paul Sandoza7aff442016-04-13 15:05:48 +0200133 long x = (long) hs.get(TestAccessMode.GET_VOLATILE).invokeExact(recv);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300134 assertEquals(x, 0xCAFEBABECAFEBABEL, "setVolatile long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100135 }
136
137 // Lazy
138 {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300139 hs.get(TestAccessMode.SET_RELEASE).invokeExact(recv, 0x0123456789ABCDEFL);
Paul Sandoza7aff442016-04-13 15:05:48 +0200140 long x = (long) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact(recv);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300141 assertEquals(x, 0x0123456789ABCDEFL, "setRelease long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100142 }
143
144 // Opaque
145 {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300146 hs.get(TestAccessMode.SET_OPAQUE).invokeExact(recv, 0xCAFEBABECAFEBABEL);
Paul Sandoza7aff442016-04-13 15:05:48 +0200147 long x = (long) hs.get(TestAccessMode.GET_OPAQUE).invokeExact(recv);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300148 assertEquals(x, 0xCAFEBABECAFEBABEL, "setOpaque long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100149 }
150
Aleksey Shipileve6632062016-06-15 11:20:15 +0300151 hs.get(TestAccessMode.SET).invokeExact(recv, 0x0123456789ABCDEFL);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100152
153 // Compare
154 {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300155 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(recv, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100156 assertEquals(r, true, "success compareAndSet long");
Paul Sandoza7aff442016-04-13 15:05:48 +0200157 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300158 assertEquals(x, 0xCAFEBABECAFEBABEL, "success compareAndSet long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100159 }
160
161 {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300162 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(recv, 0x0123456789ABCDEFL, 0xDEADBEEFDEADBEEFL);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100163 assertEquals(r, false, "failing compareAndSet long");
Paul Sandoza7aff442016-04-13 15:05:48 +0200164 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300165 assertEquals(x, 0xCAFEBABECAFEBABEL, "failing compareAndSet long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100166 }
167
168 {
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200169 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(recv, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL);
170 assertEquals(r, 0xCAFEBABECAFEBABEL, "success compareAndExchange long");
Paul Sandoza7aff442016-04-13 15:05:48 +0200171 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200172 assertEquals(x, 0x0123456789ABCDEFL, "success compareAndExchange long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100173 }
174
175 {
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200176 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(recv, 0xCAFEBABECAFEBABEL, 0xDEADBEEFDEADBEEFL);
177 assertEquals(r, 0x0123456789ABCDEFL, "failing compareAndExchange long");
Paul Sandoza7aff442016-04-13 15:05:48 +0200178 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200179 assertEquals(x, 0x0123456789ABCDEFL, "failing compareAndExchange long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100180 }
181
182 {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300183 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(recv, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL);
184 assertEquals(r, 0x0123456789ABCDEFL, "success compareAndExchangeAcquire long");
Paul Sandoza7aff442016-04-13 15:05:48 +0200185 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300186 assertEquals(x, 0xCAFEBABECAFEBABEL, "success compareAndExchangeAcquire long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100187 }
188
189 {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300190 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(recv, 0x0123456789ABCDEFL, 0xDEADBEEFDEADBEEFL);
191 assertEquals(r, 0xCAFEBABECAFEBABEL, "failing compareAndExchangeAcquire long");
Paul Sandoza7aff442016-04-13 15:05:48 +0200192 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300193 assertEquals(x, 0xCAFEBABECAFEBABEL, "failing compareAndExchangeAcquire long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100194 }
195
196 {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300197 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(recv, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL);
198 assertEquals(r, 0xCAFEBABECAFEBABEL, "success compareAndExchangeRelease long");
Paul Sandoza7aff442016-04-13 15:05:48 +0200199 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300200 assertEquals(x, 0x0123456789ABCDEFL, "success compareAndExchangeRelease long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100201 }
202
203 {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300204 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(recv, 0xCAFEBABECAFEBABEL, 0xDEADBEEFDEADBEEFL);
205 assertEquals(r, 0x0123456789ABCDEFL, "failing compareAndExchangeRelease long");
Paul Sandoza7aff442016-04-13 15:05:48 +0200206 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300207 assertEquals(x, 0x0123456789ABCDEFL, "failing compareAndExchangeRelease long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100208 }
209
210 {
Aleksey Shipilev4f538852016-05-04 17:17:28 +0300211 boolean success = false;
212 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700213 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN).invokeExact(recv, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL);
Aleksey Shipilev4f538852016-05-04 17:17:28 +0300214 }
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700215 assertEquals(success, true, "weakCompareAndSetPlain long");
Paul Sandoza7aff442016-04-13 15:05:48 +0200216 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700217 assertEquals(x, 0xCAFEBABECAFEBABEL, "weakCompareAndSetPlain long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100218 }
219
220 {
Aleksey Shipilev4f538852016-05-04 17:17:28 +0300221 boolean success = false;
222 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300223 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(recv, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL);
Aleksey Shipilev4f538852016-05-04 17:17:28 +0300224 }
225 assertEquals(success, true, "weakCompareAndSetAcquire long");
Paul Sandoza7aff442016-04-13 15:05:48 +0200226 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300227 assertEquals(x, 0x0123456789ABCDEFL, "weakCompareAndSetAcquire long");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100228 }
229
230 {
Aleksey Shipilev4f538852016-05-04 17:17:28 +0300231 boolean success = false;
232 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300233 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(recv, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL);
Aleksey Shipilev4f538852016-05-04 17:17:28 +0300234 }
235 assertEquals(success, true, "weakCompareAndSetRelease long");
Paul Sandoza7aff442016-04-13 15:05:48 +0200236 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300237 assertEquals(x, 0xCAFEBABECAFEBABEL, "weakCompareAndSetRelease long");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100238 }
239
Aleksey Shipilev33bb9222016-05-17 22:28:00 +0300240 {
241 boolean success = false;
242 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700243 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(recv, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL);
Aleksey Shipilev33bb9222016-05-17 22:28:00 +0300244 }
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700245 assertEquals(success, true, "weakCompareAndSet long");
Aleksey Shipilev33bb9222016-05-17 22:28:00 +0300246 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700247 assertEquals(x, 0x0123456789ABCDEFL, "weakCompareAndSet long");
Aleksey Shipilev33bb9222016-05-17 22:28:00 +0300248 }
249
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100250 // Compare set and get
251 {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300252 long o = (long) hs.get(TestAccessMode.GET_AND_SET).invokeExact(recv, 0xCAFEBABECAFEBABEL);
253 assertEquals(o, 0x0123456789ABCDEFL, "getAndSet long");
Paul Sandoza7aff442016-04-13 15:05:48 +0200254 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300255 assertEquals(x, 0xCAFEBABECAFEBABEL, "getAndSet long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100256 }
257
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100258 // get and add, add and get
259 {
Paul Sandoz82d48912016-09-01 10:16:57 -0700260 hs.get(TestAccessMode.SET).invokeExact(recv, 0x0123456789ABCDEFL);
261
Paul Sandozc073edc2016-09-01 10:17:01 -0700262 long o = (long) hs.get(TestAccessMode.GET_AND_ADD).invokeExact(recv, 0xCAFEBABECAFEBABEL);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300263 assertEquals(o, 0x0123456789ABCDEFL, "getAndAdd long");
Paul Sandozc073edc2016-09-01 10:17:01 -0700264 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
265 assertEquals(x, (long)(0x0123456789ABCDEFL + 0xCAFEBABECAFEBABEL), "getAndAdd long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100266 }
Paul Sandoz82d48912016-09-01 10:16:57 -0700267
268 {
269 hs.get(TestAccessMode.SET).invokeExact(recv, 0x0123456789ABCDEFL);
270
271 long o = (long) hs.get(TestAccessMode.GET_AND_ADD_ACQUIRE).invokeExact(recv, 0xCAFEBABECAFEBABEL);
272 assertEquals(o, 0x0123456789ABCDEFL, "getAndAddAcquire long");
273 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
274 assertEquals(x, (long)(0x0123456789ABCDEFL + 0xCAFEBABECAFEBABEL), "getAndAddAcquire long value");
275 }
276
277 {
278 hs.get(TestAccessMode.SET).invokeExact(recv, 0x0123456789ABCDEFL);
279
280 long o = (long) hs.get(TestAccessMode.GET_AND_ADD_RELEASE).invokeExact(recv, 0xCAFEBABECAFEBABEL);
281 assertEquals(o, 0x0123456789ABCDEFL, "getAndAddRelease long");
282 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
283 assertEquals(x, (long)(0x0123456789ABCDEFL + 0xCAFEBABECAFEBABEL), "getAndAddRelease long value");
284 }
285
286 // get and bitwise or
287 {
288 hs.get(TestAccessMode.SET).invokeExact(recv, 0x0123456789ABCDEFL);
289
290 long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_OR).invokeExact(recv, 0xCAFEBABECAFEBABEL);
291 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseOr long");
292 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
293 assertEquals(x, (long)(0x0123456789ABCDEFL | 0xCAFEBABECAFEBABEL), "getAndBitwiseOr long value");
294 }
295
296 {
297 hs.get(TestAccessMode.SET).invokeExact(recv, 0x0123456789ABCDEFL);
298
299 long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_OR_ACQUIRE).invokeExact(recv, 0xCAFEBABECAFEBABEL);
300 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseOrAcquire long");
301 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
302 assertEquals(x, (long)(0x0123456789ABCDEFL | 0xCAFEBABECAFEBABEL), "getAndBitwiseOrAcquire long value");
303 }
304
305 {
306 hs.get(TestAccessMode.SET).invokeExact(recv, 0x0123456789ABCDEFL);
307
308 long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_OR_RELEASE).invokeExact(recv, 0xCAFEBABECAFEBABEL);
309 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseOrRelease long");
310 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
311 assertEquals(x, (long)(0x0123456789ABCDEFL | 0xCAFEBABECAFEBABEL), "getAndBitwiseOrRelease long value");
312 }
313
314 // get and bitwise and
315 {
316 hs.get(TestAccessMode.SET).invokeExact(recv, 0x0123456789ABCDEFL);
317
318 long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_AND).invokeExact(recv, 0xCAFEBABECAFEBABEL);
319 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseAnd long");
320 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
321 assertEquals(x, (long)(0x0123456789ABCDEFL & 0xCAFEBABECAFEBABEL), "getAndBitwiseAnd long value");
322 }
323
324 {
325 hs.get(TestAccessMode.SET).invokeExact(recv, 0x0123456789ABCDEFL);
326
327 long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_AND_ACQUIRE).invokeExact(recv, 0xCAFEBABECAFEBABEL);
328 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseAndAcquire long");
329 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
330 assertEquals(x, (long)(0x0123456789ABCDEFL & 0xCAFEBABECAFEBABEL), "getAndBitwiseAndAcquire long value");
331 }
332
333 {
334 hs.get(TestAccessMode.SET).invokeExact(recv, 0x0123456789ABCDEFL);
335
336 long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_AND_RELEASE).invokeExact(recv, 0xCAFEBABECAFEBABEL);
337 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseAndRelease long");
338 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
339 assertEquals(x, (long)(0x0123456789ABCDEFL & 0xCAFEBABECAFEBABEL), "getAndBitwiseAndRelease long value");
340 }
341
342 // get and bitwise xor
343 {
344 hs.get(TestAccessMode.SET).invokeExact(recv, 0x0123456789ABCDEFL);
345
346 long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_XOR).invokeExact(recv, 0xCAFEBABECAFEBABEL);
347 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseXor long");
348 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
349 assertEquals(x, (long)(0x0123456789ABCDEFL ^ 0xCAFEBABECAFEBABEL), "getAndBitwiseXor long value");
350 }
351
352 {
353 hs.get(TestAccessMode.SET).invokeExact(recv, 0x0123456789ABCDEFL);
354
355 long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_XOR_ACQUIRE).invokeExact(recv, 0xCAFEBABECAFEBABEL);
356 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseXorAcquire long");
357 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
358 assertEquals(x, (long)(0x0123456789ABCDEFL ^ 0xCAFEBABECAFEBABEL), "getAndBitwiseXorAcquire long value");
359 }
360
361 {
362 hs.get(TestAccessMode.SET).invokeExact(recv, 0x0123456789ABCDEFL);
363
364 long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_XOR_RELEASE).invokeExact(recv, 0xCAFEBABECAFEBABEL);
365 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseXorRelease long");
366 long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
367 assertEquals(x, (long)(0x0123456789ABCDEFL ^ 0xCAFEBABECAFEBABEL), "getAndBitwiseXorRelease long value");
368 }
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100369 }
370
371 static void testInstanceFieldUnsupported(VarHandleTestMethodHandleAccessLong recv, Handles hs) throws Throwable {
372
Paul Sandoz82d48912016-09-01 10:16:57 -0700373
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100374 }
375
376
377 static void testStaticField(Handles hs) throws Throwable {
378 // Plain
379 {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300380 hs.get(TestAccessMode.SET).invokeExact(0x0123456789ABCDEFL);
Paul Sandoza7aff442016-04-13 15:05:48 +0200381 long x = (long) hs.get(TestAccessMode.GET).invokeExact();
Aleksey Shipileve6632062016-06-15 11:20:15 +0300382 assertEquals(x, 0x0123456789ABCDEFL, "set long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100383 }
384
385
386 // Volatile
387 {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300388 hs.get(TestAccessMode.SET_VOLATILE).invokeExact(0xCAFEBABECAFEBABEL);
Paul Sandoza7aff442016-04-13 15:05:48 +0200389 long x = (long) hs.get(TestAccessMode.GET_VOLATILE).invokeExact();
Aleksey Shipileve6632062016-06-15 11:20:15 +0300390 assertEquals(x, 0xCAFEBABECAFEBABEL, "setVolatile long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100391 }
392
393 // Lazy
394 {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300395 hs.get(TestAccessMode.SET_RELEASE).invokeExact(0x0123456789ABCDEFL);
Paul Sandoza7aff442016-04-13 15:05:48 +0200396 long x = (long) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact();
Aleksey Shipileve6632062016-06-15 11:20:15 +0300397 assertEquals(x, 0x0123456789ABCDEFL, "setRelease long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100398 }
399
400 // Opaque
401 {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300402 hs.get(TestAccessMode.SET_OPAQUE).invokeExact(0xCAFEBABECAFEBABEL);
Paul Sandoza7aff442016-04-13 15:05:48 +0200403 long x = (long) hs.get(TestAccessMode.GET_OPAQUE).invokeExact();
Aleksey Shipileve6632062016-06-15 11:20:15 +0300404 assertEquals(x, 0xCAFEBABECAFEBABEL, "setOpaque long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100405 }
406
Aleksey Shipileve6632062016-06-15 11:20:15 +0300407 hs.get(TestAccessMode.SET).invokeExact(0x0123456789ABCDEFL);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100408
409 // Compare
410 {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300411 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100412 assertEquals(r, true, "success compareAndSet long");
Paul Sandoza7aff442016-04-13 15:05:48 +0200413 long x = (long) hs.get(TestAccessMode.GET).invokeExact();
Aleksey Shipileve6632062016-06-15 11:20:15 +0300414 assertEquals(x, 0xCAFEBABECAFEBABEL, "success compareAndSet long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100415 }
416
417 {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300418 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(0x0123456789ABCDEFL, 0xDEADBEEFDEADBEEFL);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100419 assertEquals(r, false, "failing compareAndSet long");
Paul Sandoza7aff442016-04-13 15:05:48 +0200420 long x = (long) hs.get(TestAccessMode.GET).invokeExact();
Aleksey Shipileve6632062016-06-15 11:20:15 +0300421 assertEquals(x, 0xCAFEBABECAFEBABEL, "failing compareAndSet long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100422 }
423
424 {
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200425 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL);
426 assertEquals(r, 0xCAFEBABECAFEBABEL, "success compareAndExchange long");
Paul Sandoza7aff442016-04-13 15:05:48 +0200427 long x = (long) hs.get(TestAccessMode.GET).invokeExact();
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200428 assertEquals(x, 0x0123456789ABCDEFL, "success compareAndExchange long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100429 }
430
431 {
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200432 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(0xCAFEBABECAFEBABEL, 0xDEADBEEFDEADBEEFL);
433 assertEquals(r, 0x0123456789ABCDEFL, "failing compareAndExchange long");
Paul Sandoza7aff442016-04-13 15:05:48 +0200434 long x = (long) hs.get(TestAccessMode.GET).invokeExact();
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200435 assertEquals(x, 0x0123456789ABCDEFL, "failing compareAndExchange long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100436 }
437
438 {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300439 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL);
440 assertEquals(r, 0x0123456789ABCDEFL, "success compareAndExchangeAcquire long");
Paul Sandoza7aff442016-04-13 15:05:48 +0200441 long x = (long) hs.get(TestAccessMode.GET).invokeExact();
Aleksey Shipileve6632062016-06-15 11:20:15 +0300442 assertEquals(x, 0xCAFEBABECAFEBABEL, "success compareAndExchangeAcquire long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100443 }
444
445 {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300446 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(0x0123456789ABCDEFL, 0xDEADBEEFDEADBEEFL);
447 assertEquals(r, 0xCAFEBABECAFEBABEL, "failing compareAndExchangeAcquire long");
Paul Sandoza7aff442016-04-13 15:05:48 +0200448 long x = (long) hs.get(TestAccessMode.GET).invokeExact();
Aleksey Shipileve6632062016-06-15 11:20:15 +0300449 assertEquals(x, 0xCAFEBABECAFEBABEL, "failing compareAndExchangeAcquire long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100450 }
451
452 {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300453 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL);
454 assertEquals(r, 0xCAFEBABECAFEBABEL, "success compareAndExchangeRelease long");
Paul Sandoza7aff442016-04-13 15:05:48 +0200455 long x = (long) hs.get(TestAccessMode.GET).invokeExact();
Aleksey Shipileve6632062016-06-15 11:20:15 +0300456 assertEquals(x, 0x0123456789ABCDEFL, "success compareAndExchangeRelease long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100457 }
458
459 {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300460 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(0xCAFEBABECAFEBABEL, 0xDEADBEEFDEADBEEFL);
461 assertEquals(r, 0x0123456789ABCDEFL, "failing compareAndExchangeRelease long");
Paul Sandoza7aff442016-04-13 15:05:48 +0200462 long x = (long) hs.get(TestAccessMode.GET).invokeExact();
Aleksey Shipileve6632062016-06-15 11:20:15 +0300463 assertEquals(x, 0x0123456789ABCDEFL, "failing compareAndExchangeRelease long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100464 }
465
466 {
Aleksey Shipilev4f538852016-05-04 17:17:28 +0300467 boolean success = false;
468 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700469 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN).invokeExact(0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL);
Aleksey Shipilev4f538852016-05-04 17:17:28 +0300470 }
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700471 assertEquals(success, true, "weakCompareAndSetPlain long");
Paul Sandoza7aff442016-04-13 15:05:48 +0200472 long x = (long) hs.get(TestAccessMode.GET).invokeExact();
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700473 assertEquals(x, 0xCAFEBABECAFEBABEL, "weakCompareAndSetPlain long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100474 }
475
476 {
Aleksey Shipilev4f538852016-05-04 17:17:28 +0300477 boolean success = false;
478 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300479 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL);
Aleksey Shipilev4f538852016-05-04 17:17:28 +0300480 }
481 assertEquals(success, true, "weakCompareAndSetAcquire long");
Paul Sandoza7aff442016-04-13 15:05:48 +0200482 long x = (long) hs.get(TestAccessMode.GET).invokeExact();
Aleksey Shipileve6632062016-06-15 11:20:15 +0300483 assertEquals(x, 0x0123456789ABCDEFL, "weakCompareAndSetAcquire long");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100484 }
485
486 {
Aleksey Shipilev4f538852016-05-04 17:17:28 +0300487 boolean success = false;
488 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300489 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL);
Aleksey Shipilev4f538852016-05-04 17:17:28 +0300490 }
491 assertEquals(success, true, "weakCompareAndSetRelease long");
Paul Sandoza7aff442016-04-13 15:05:48 +0200492 long x = (long) hs.get(TestAccessMode.GET).invokeExact();
Aleksey Shipileve6632062016-06-15 11:20:15 +0300493 assertEquals(x, 0xCAFEBABECAFEBABEL, "weakCompareAndSetRelease long");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100494 }
495
Aleksey Shipilev33bb9222016-05-17 22:28:00 +0300496 {
497 boolean success = false;
498 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700499 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL);
Aleksey Shipilev33bb9222016-05-17 22:28:00 +0300500 }
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700501 assertEquals(success, true, "weakCompareAndSet long");
Aleksey Shipilev33bb9222016-05-17 22:28:00 +0300502 long x = (long) hs.get(TestAccessMode.GET).invokeExact();
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700503 assertEquals(x, 0x0123456789ABCDEFL, "weakCompareAndSet long");
Aleksey Shipilev33bb9222016-05-17 22:28:00 +0300504 }
505
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100506 // Compare set and get
507 {
Paul Sandoz82d48912016-09-01 10:16:57 -0700508 hs.get(TestAccessMode.SET).invokeExact(0x0123456789ABCDEFL);
509
510 long o = (long) hs.get(TestAccessMode.GET_AND_SET).invokeExact(0xCAFEBABECAFEBABEL);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300511 assertEquals(o, 0x0123456789ABCDEFL, "getAndSet long");
Paul Sandoza7aff442016-04-13 15:05:48 +0200512 long x = (long) hs.get(TestAccessMode.GET).invokeExact();
Aleksey Shipileve6632062016-06-15 11:20:15 +0300513 assertEquals(x, 0xCAFEBABECAFEBABEL, "getAndSet long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100514 }
515
Paul Sandoz82d48912016-09-01 10:16:57 -0700516 // Compare set and get
517 {
518 hs.get(TestAccessMode.SET).invokeExact(0x0123456789ABCDEFL);
519
520 long o = (long) hs.get(TestAccessMode.GET_AND_SET_ACQUIRE).invokeExact(0xCAFEBABECAFEBABEL);
521 assertEquals(o, 0x0123456789ABCDEFL, "getAndSetAcquire long");
522 long x = (long) hs.get(TestAccessMode.GET).invokeExact();
523 assertEquals(x, 0xCAFEBABECAFEBABEL, "getAndSetAcquire long value");
524 }
525
526 // Compare set and get
527 {
528 hs.get(TestAccessMode.SET).invokeExact(0x0123456789ABCDEFL);
529
530 long o = (long) hs.get(TestAccessMode.GET_AND_SET_RELEASE).invokeExact(0xCAFEBABECAFEBABEL);
531 assertEquals(o, 0x0123456789ABCDEFL, "getAndSetRelease long");
532 long x = (long) hs.get(TestAccessMode.GET).invokeExact();
533 assertEquals(x, 0xCAFEBABECAFEBABEL, "getAndSetRelease long value");
534 }
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100535
536 // get and add, add and get
537 {
Paul Sandoz82d48912016-09-01 10:16:57 -0700538 hs.get(TestAccessMode.SET).invokeExact(0x0123456789ABCDEFL);
539
Paul Sandozc073edc2016-09-01 10:17:01 -0700540 long o = (long) hs.get(TestAccessMode.GET_AND_ADD).invokeExact(0xCAFEBABECAFEBABEL);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300541 assertEquals(o, 0x0123456789ABCDEFL, "getAndAdd long");
Paul Sandozc073edc2016-09-01 10:17:01 -0700542 long x = (long) hs.get(TestAccessMode.GET).invokeExact();
543 assertEquals(x, (long)(0x0123456789ABCDEFL + 0xCAFEBABECAFEBABEL), "getAndAdd long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100544 }
Paul Sandoz82d48912016-09-01 10:16:57 -0700545
546 {
547 hs.get(TestAccessMode.SET).invokeExact(0x0123456789ABCDEFL);
548
549 long o = (long) hs.get(TestAccessMode.GET_AND_ADD_ACQUIRE).invokeExact(0xCAFEBABECAFEBABEL);
550 assertEquals(o, 0x0123456789ABCDEFL, "getAndAddAcquire long");
551 long x = (long) hs.get(TestAccessMode.GET).invokeExact();
552 assertEquals(x, (long)(0x0123456789ABCDEFL + 0xCAFEBABECAFEBABEL), "getAndAddAcquire long value");
553 }
554
555 {
556 hs.get(TestAccessMode.SET).invokeExact(0x0123456789ABCDEFL);
557
558 long o = (long) hs.get(TestAccessMode.GET_AND_ADD_RELEASE).invokeExact(0xCAFEBABECAFEBABEL);
559 assertEquals(o, 0x0123456789ABCDEFL, "getAndAddRelease long");
560 long x = (long) hs.get(TestAccessMode.GET).invokeExact();
561 assertEquals(x, (long)(0x0123456789ABCDEFL + 0xCAFEBABECAFEBABEL), "getAndAddRelease long value");
562 }
563
564 // get and bitwise or
565 {
566 hs.get(TestAccessMode.SET).invokeExact(0x0123456789ABCDEFL);
567
568 long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_OR).invokeExact(0xCAFEBABECAFEBABEL);
569 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseOr long");
570 long x = (long) hs.get(TestAccessMode.GET).invokeExact();
571 assertEquals(x, (long)(0x0123456789ABCDEFL | 0xCAFEBABECAFEBABEL), "getAndBitwiseOr long value");
572 }
573
574 {
575 hs.get(TestAccessMode.SET).invokeExact(0x0123456789ABCDEFL);
576
577 long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_OR_ACQUIRE).invokeExact(0xCAFEBABECAFEBABEL);
578 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseOrAcquire long");
579 long x = (long) hs.get(TestAccessMode.GET).invokeExact();
580 assertEquals(x, (long)(0x0123456789ABCDEFL | 0xCAFEBABECAFEBABEL), "getAndBitwiseOrAcquire long value");
581 }
582
583 {
584 hs.get(TestAccessMode.SET).invokeExact(0x0123456789ABCDEFL);
585
586 long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_OR_RELEASE).invokeExact(0xCAFEBABECAFEBABEL);
587 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseOrRelease long");
588 long x = (long) hs.get(TestAccessMode.GET).invokeExact();
589 assertEquals(x, (long)(0x0123456789ABCDEFL | 0xCAFEBABECAFEBABEL), "getAndBitwiseOrRelease long value");
590 }
591
592 // get and bitwise and
593 {
594 hs.get(TestAccessMode.SET).invokeExact(0x0123456789ABCDEFL);
595
596 long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_AND).invokeExact(0xCAFEBABECAFEBABEL);
597 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseAnd long");
598 long x = (long) hs.get(TestAccessMode.GET).invokeExact();
599 assertEquals(x, (long)(0x0123456789ABCDEFL & 0xCAFEBABECAFEBABEL), "getAndBitwiseAnd long value");
600 }
601
602 {
603 hs.get(TestAccessMode.SET).invokeExact(0x0123456789ABCDEFL);
604
605 long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_AND_ACQUIRE).invokeExact(0xCAFEBABECAFEBABEL);
606 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseAndAcquire long");
607 long x = (long) hs.get(TestAccessMode.GET).invokeExact();
608 assertEquals(x, (long)(0x0123456789ABCDEFL & 0xCAFEBABECAFEBABEL), "getAndBitwiseAndAcquire long value");
609 }
610
611 {
612 hs.get(TestAccessMode.SET).invokeExact(0x0123456789ABCDEFL);
613
614 long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_AND_RELEASE).invokeExact(0xCAFEBABECAFEBABEL);
615 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseAndRelease long");
616 long x = (long) hs.get(TestAccessMode.GET).invokeExact();
617 assertEquals(x, (long)(0x0123456789ABCDEFL & 0xCAFEBABECAFEBABEL), "getAndBitwiseAndRelease long value");
618 }
619
620 // get and bitwise xor
621 {
622 hs.get(TestAccessMode.SET).invokeExact(0x0123456789ABCDEFL);
623
624 long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_XOR).invokeExact(0xCAFEBABECAFEBABEL);
625 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseXor long");
626 long x = (long) hs.get(TestAccessMode.GET).invokeExact();
627 assertEquals(x, (long)(0x0123456789ABCDEFL ^ 0xCAFEBABECAFEBABEL), "getAndBitwiseXor long value");
628 }
629
630 {
631 hs.get(TestAccessMode.SET).invokeExact(0x0123456789ABCDEFL);
632
633 long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_XOR_ACQUIRE).invokeExact(0xCAFEBABECAFEBABEL);
634 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseXorAcquire long");
635 long x = (long) hs.get(TestAccessMode.GET).invokeExact();
636 assertEquals(x, (long)(0x0123456789ABCDEFL ^ 0xCAFEBABECAFEBABEL), "getAndBitwiseXorAcquire long value");
637 }
638
639 {
640 hs.get(TestAccessMode.SET).invokeExact(0x0123456789ABCDEFL);
641
642 long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_XOR_RELEASE).invokeExact(0xCAFEBABECAFEBABEL);
643 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseXorRelease long");
644 long x = (long) hs.get(TestAccessMode.GET).invokeExact();
645 assertEquals(x, (long)(0x0123456789ABCDEFL ^ 0xCAFEBABECAFEBABEL), "getAndBitwiseXorRelease long value");
646 }
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100647 }
648
649 static void testStaticFieldUnsupported(Handles hs) throws Throwable {
650
Paul Sandoz82d48912016-09-01 10:16:57 -0700651
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100652 }
653
654
655 static void testArray(Handles hs) throws Throwable {
656 long[] array = new long[10];
657
658 for (int i = 0; i < array.length; i++) {
659 // Plain
660 {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300661 hs.get(TestAccessMode.SET).invokeExact(array, i, 0x0123456789ABCDEFL);
Paul Sandoza7aff442016-04-13 15:05:48 +0200662 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300663 assertEquals(x, 0x0123456789ABCDEFL, "get long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100664 }
665
666
667 // Volatile
668 {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300669 hs.get(TestAccessMode.SET_VOLATILE).invokeExact(array, i, 0xCAFEBABECAFEBABEL);
Paul Sandoza7aff442016-04-13 15:05:48 +0200670 long x = (long) hs.get(TestAccessMode.GET_VOLATILE).invokeExact(array, i);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300671 assertEquals(x, 0xCAFEBABECAFEBABEL, "setVolatile long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100672 }
673
674 // Lazy
675 {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300676 hs.get(TestAccessMode.SET_RELEASE).invokeExact(array, i, 0x0123456789ABCDEFL);
Paul Sandoza7aff442016-04-13 15:05:48 +0200677 long x = (long) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact(array, i);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300678 assertEquals(x, 0x0123456789ABCDEFL, "setRelease long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100679 }
680
681 // Opaque
682 {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300683 hs.get(TestAccessMode.SET_OPAQUE).invokeExact(array, i, 0xCAFEBABECAFEBABEL);
Paul Sandoza7aff442016-04-13 15:05:48 +0200684 long x = (long) hs.get(TestAccessMode.GET_OPAQUE).invokeExact(array, i);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300685 assertEquals(x, 0xCAFEBABECAFEBABEL, "setOpaque long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100686 }
687
Aleksey Shipileve6632062016-06-15 11:20:15 +0300688 hs.get(TestAccessMode.SET).invokeExact(array, i, 0x0123456789ABCDEFL);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100689
690 // Compare
691 {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300692 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(array, i, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100693 assertEquals(r, true, "success compareAndSet long");
Paul Sandoza7aff442016-04-13 15:05:48 +0200694 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300695 assertEquals(x, 0xCAFEBABECAFEBABEL, "success compareAndSet long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100696 }
697
698 {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300699 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(array, i, 0x0123456789ABCDEFL, 0xDEADBEEFDEADBEEFL);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100700 assertEquals(r, false, "failing compareAndSet long");
Paul Sandoza7aff442016-04-13 15:05:48 +0200701 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300702 assertEquals(x, 0xCAFEBABECAFEBABEL, "failing compareAndSet long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100703 }
704
705 {
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200706 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(array, i, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL);
707 assertEquals(r, 0xCAFEBABECAFEBABEL, "success compareAndExchange long");
Paul Sandoza7aff442016-04-13 15:05:48 +0200708 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200709 assertEquals(x, 0x0123456789ABCDEFL, "success compareAndExchange long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100710 }
711
712 {
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200713 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(array, i, 0xCAFEBABECAFEBABEL, 0xDEADBEEFDEADBEEFL);
714 assertEquals(r, 0x0123456789ABCDEFL, "failing compareAndExchange long");
Paul Sandoza7aff442016-04-13 15:05:48 +0200715 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200716 assertEquals(x, 0x0123456789ABCDEFL, "failing compareAndExchange long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100717 }
718
719 {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300720 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(array, i, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL);
721 assertEquals(r, 0x0123456789ABCDEFL, "success compareAndExchangeAcquire long");
Paul Sandoza7aff442016-04-13 15:05:48 +0200722 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300723 assertEquals(x, 0xCAFEBABECAFEBABEL, "success compareAndExchangeAcquire long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100724 }
725
726 {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300727 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(array, i, 0x0123456789ABCDEFL, 0xDEADBEEFDEADBEEFL);
728 assertEquals(r, 0xCAFEBABECAFEBABEL, "failing compareAndExchangeAcquire long");
Paul Sandoza7aff442016-04-13 15:05:48 +0200729 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300730 assertEquals(x, 0xCAFEBABECAFEBABEL, "failing compareAndExchangeAcquire long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100731 }
732
733 {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300734 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(array, i, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL);
735 assertEquals(r, 0xCAFEBABECAFEBABEL, "success compareAndExchangeRelease long");
Paul Sandoza7aff442016-04-13 15:05:48 +0200736 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300737 assertEquals(x, 0x0123456789ABCDEFL, "success compareAndExchangeRelease long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100738 }
739
740 {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300741 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(array, i, 0xCAFEBABECAFEBABEL, 0xDEADBEEFDEADBEEFL);
742 assertEquals(r, 0x0123456789ABCDEFL, "failing compareAndExchangeRelease long");
Paul Sandoza7aff442016-04-13 15:05:48 +0200743 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300744 assertEquals(x, 0x0123456789ABCDEFL, "failing compareAndExchangeRelease long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100745 }
746
747 {
Aleksey Shipilev4f538852016-05-04 17:17:28 +0300748 boolean success = false;
749 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700750 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN).invokeExact(array, i, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL);
Aleksey Shipilev4f538852016-05-04 17:17:28 +0300751 }
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700752 assertEquals(success, true, "weakCompareAndSetPlain long");
Paul Sandoza7aff442016-04-13 15:05:48 +0200753 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700754 assertEquals(x, 0xCAFEBABECAFEBABEL, "weakCompareAndSetPlain long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100755 }
756
757 {
Aleksey Shipilev4f538852016-05-04 17:17:28 +0300758 boolean success = false;
759 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300760 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(array, i, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL);
Aleksey Shipilev4f538852016-05-04 17:17:28 +0300761 }
762 assertEquals(success, true, "weakCompareAndSetAcquire long");
Paul Sandoza7aff442016-04-13 15:05:48 +0200763 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300764 assertEquals(x, 0x0123456789ABCDEFL, "weakCompareAndSetAcquire long");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100765 }
766
767 {
Aleksey Shipilev4f538852016-05-04 17:17:28 +0300768 boolean success = false;
769 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300770 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(array, i, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL);
Aleksey Shipilev4f538852016-05-04 17:17:28 +0300771 }
772 assertEquals(success, true, "weakCompareAndSetRelease long");
Paul Sandoza7aff442016-04-13 15:05:48 +0200773 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300774 assertEquals(x, 0xCAFEBABECAFEBABEL, "weakCompareAndSetRelease long");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100775 }
776
Aleksey Shipilev33bb9222016-05-17 22:28:00 +0300777 {
778 boolean success = false;
779 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700780 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(array, i, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL);
Aleksey Shipilev33bb9222016-05-17 22:28:00 +0300781 }
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700782 assertEquals(success, true, "weakCompareAndSet long");
Aleksey Shipilev33bb9222016-05-17 22:28:00 +0300783 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700784 assertEquals(x, 0x0123456789ABCDEFL, "weakCompareAndSet long");
Aleksey Shipilev33bb9222016-05-17 22:28:00 +0300785 }
786
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100787 // Compare set and get
788 {
Paul Sandoz82d48912016-09-01 10:16:57 -0700789 hs.get(TestAccessMode.SET).invokeExact(array, i, 0x0123456789ABCDEFL);
790
Aleksey Shipileve6632062016-06-15 11:20:15 +0300791 long o = (long) hs.get(TestAccessMode.GET_AND_SET).invokeExact(array, i, 0xCAFEBABECAFEBABEL);
792 assertEquals(o, 0x0123456789ABCDEFL, "getAndSet long");
Paul Sandoza7aff442016-04-13 15:05:48 +0200793 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300794 assertEquals(x, 0xCAFEBABECAFEBABEL, "getAndSet long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100795 }
796
Paul Sandoz82d48912016-09-01 10:16:57 -0700797 {
798 hs.get(TestAccessMode.SET).invokeExact(array, i, 0x0123456789ABCDEFL);
799
800 long o = (long) hs.get(TestAccessMode.GET_AND_SET_ACQUIRE).invokeExact(array, i, 0xCAFEBABECAFEBABEL);
801 assertEquals(o, 0x0123456789ABCDEFL, "getAndSetAcquire long");
802 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
803 assertEquals(x, 0xCAFEBABECAFEBABEL, "getAndSetAcquire long value");
804 }
805
806 {
807 hs.get(TestAccessMode.SET).invokeExact(array, i, 0x0123456789ABCDEFL);
808
809 long o = (long) hs.get(TestAccessMode.GET_AND_SET_RELEASE).invokeExact(array, i, 0xCAFEBABECAFEBABEL);
810 assertEquals(o, 0x0123456789ABCDEFL, "getAndSetRelease long");
811 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
812 assertEquals(x, 0xCAFEBABECAFEBABEL, "getAndSetRelease long value");
813 }
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100814
815 // get and add, add and get
816 {
Paul Sandoz82d48912016-09-01 10:16:57 -0700817 hs.get(TestAccessMode.SET).invokeExact(array, i, 0x0123456789ABCDEFL);
818
Paul Sandozc073edc2016-09-01 10:17:01 -0700819 long o = (long) hs.get(TestAccessMode.GET_AND_ADD).invokeExact(array, i, 0xCAFEBABECAFEBABEL);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300820 assertEquals(o, 0x0123456789ABCDEFL, "getAndAdd long");
Paul Sandozc073edc2016-09-01 10:17:01 -0700821 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
822 assertEquals(x, (long)(0x0123456789ABCDEFL + 0xCAFEBABECAFEBABEL), "getAndAdd long value");
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100823 }
Paul Sandoz82d48912016-09-01 10:16:57 -0700824
825 {
826 hs.get(TestAccessMode.SET).invokeExact(array, i, 0x0123456789ABCDEFL);
827
828 long o = (long) hs.get(TestAccessMode.GET_AND_ADD_ACQUIRE).invokeExact(array, i, 0xCAFEBABECAFEBABEL);
829 assertEquals(o, 0x0123456789ABCDEFL, "getAndAddAcquire long");
830 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
831 assertEquals(x, (long)(0x0123456789ABCDEFL + 0xCAFEBABECAFEBABEL), "getAndAddAcquire long value");
832 }
833
834 {
835 hs.get(TestAccessMode.SET).invokeExact(array, i, 0x0123456789ABCDEFL);
836
837 long o = (long) hs.get(TestAccessMode.GET_AND_ADD_RELEASE).invokeExact(array, i, 0xCAFEBABECAFEBABEL);
838 assertEquals(o, 0x0123456789ABCDEFL, "getAndAddRelease long");
839 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
840 assertEquals(x, (long)(0x0123456789ABCDEFL + 0xCAFEBABECAFEBABEL), "getAndAddRelease long value");
841 }
842
843 // get and bitwise or
844 {
845 hs.get(TestAccessMode.SET).invokeExact(array, i, 0x0123456789ABCDEFL);
846
847 long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_OR).invokeExact(array, i, 0xCAFEBABECAFEBABEL);
848 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseOr long");
849 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
850 assertEquals(x, (long)(0x0123456789ABCDEFL | 0xCAFEBABECAFEBABEL), "getAndBitwiseOr long value");
851 }
852
853 {
854 hs.get(TestAccessMode.SET).invokeExact(array, i, 0x0123456789ABCDEFL);
855
856 long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_OR_ACQUIRE).invokeExact(array, i, 0xCAFEBABECAFEBABEL);
857 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseOrAcquire long");
858 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
859 assertEquals(x, (long)(0x0123456789ABCDEFL | 0xCAFEBABECAFEBABEL), "getAndBitwiseOrAcquire long value");
860 }
861
862 {
863 hs.get(TestAccessMode.SET).invokeExact(array, i, 0x0123456789ABCDEFL);
864
865 long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_OR_RELEASE).invokeExact(array, i, 0xCAFEBABECAFEBABEL);
866 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseOrRelease long");
867 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
868 assertEquals(x, (long)(0x0123456789ABCDEFL | 0xCAFEBABECAFEBABEL), "getAndBitwiseOrRelease long value");
869 }
870
871 // get and bitwise and
872 {
873 hs.get(TestAccessMode.SET).invokeExact(array, i, 0x0123456789ABCDEFL);
874
875 long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_AND).invokeExact(array, i, 0xCAFEBABECAFEBABEL);
876 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseAnd long");
877 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
878 assertEquals(x, (long)(0x0123456789ABCDEFL & 0xCAFEBABECAFEBABEL), "getAndBitwiseAnd long value");
879 }
880
881 {
882 hs.get(TestAccessMode.SET).invokeExact(array, i, 0x0123456789ABCDEFL);
883
884 long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_AND_ACQUIRE).invokeExact(array, i, 0xCAFEBABECAFEBABEL);
885 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseAndAcquire long");
886 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
887 assertEquals(x, (long)(0x0123456789ABCDEFL & 0xCAFEBABECAFEBABEL), "getAndBitwiseAndAcquire long value");
888 }
889
890 {
891 hs.get(TestAccessMode.SET).invokeExact(array, i, 0x0123456789ABCDEFL);
892
893 long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_AND_RELEASE).invokeExact(array, i, 0xCAFEBABECAFEBABEL);
894 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseAndRelease long");
895 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
896 assertEquals(x, (long)(0x0123456789ABCDEFL & 0xCAFEBABECAFEBABEL), "getAndBitwiseAndRelease long value");
897 }
898
899 // get and bitwise xor
900 {
901 hs.get(TestAccessMode.SET).invokeExact(array, i, 0x0123456789ABCDEFL);
902
903 long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_XOR).invokeExact(array, i, 0xCAFEBABECAFEBABEL);
904 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseXor long");
905 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
906 assertEquals(x, (long)(0x0123456789ABCDEFL ^ 0xCAFEBABECAFEBABEL), "getAndBitwiseXor long value");
907 }
908
909 {
910 hs.get(TestAccessMode.SET).invokeExact(array, i, 0x0123456789ABCDEFL);
911
912 long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_XOR_ACQUIRE).invokeExact(array, i, 0xCAFEBABECAFEBABEL);
913 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseXorAcquire long");
914 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
915 assertEquals(x, (long)(0x0123456789ABCDEFL ^ 0xCAFEBABECAFEBABEL), "getAndBitwiseXorAcquire long value");
916 }
917
918 {
919 hs.get(TestAccessMode.SET).invokeExact(array, i, 0x0123456789ABCDEFL);
920
921 long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_XOR_RELEASE).invokeExact(array, i, 0xCAFEBABECAFEBABEL);
922 assertEquals(o, 0x0123456789ABCDEFL, "getAndBitwiseXorRelease long");
923 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
924 assertEquals(x, (long)(0x0123456789ABCDEFL ^ 0xCAFEBABECAFEBABEL), "getAndBitwiseXorRelease long value");
925 }
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100926 }
927 }
928
929 static void testArrayUnsupported(Handles hs) throws Throwable {
930 long[] array = new long[10];
931
932 final int i = 0;
933
Paul Sandoz82d48912016-09-01 10:16:57 -0700934
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100935 }
936
937 static void testArrayIndexOutOfBounds(Handles hs) throws Throwable {
938 long[] array = new long[10];
939
940 for (int i : new int[]{-1, Integer.MIN_VALUE, 10, 11, Integer.MAX_VALUE}) {
941 final int ci = i;
942
Paul Sandoza7aff442016-04-13 15:05:48 +0200943 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET)) {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100944 checkIOOBE(am, () -> {
945 long x = (long) hs.get(am).invokeExact(array, ci);
946 });
947 }
948
Paul Sandoza7aff442016-04-13 15:05:48 +0200949 for (TestAccessMode am : testAccessModesOfType(TestAccessType.SET)) {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100950 checkIOOBE(am, () -> {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300951 hs.get(am).invokeExact(array, ci, 0x0123456789ABCDEFL);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100952 });
953 }
954
Paul Sandoza7aff442016-04-13 15:05:48 +0200955 for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_SET)) {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100956 checkIOOBE(am, () -> {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300957 boolean r = (boolean) hs.get(am).invokeExact(array, ci, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100958 });
959 }
960
Paul Sandoza7aff442016-04-13 15:05:48 +0200961 for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_EXCHANGE)) {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100962 checkIOOBE(am, () -> {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300963 long r = (long) hs.get(am).invokeExact(array, ci, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100964 });
965 }
966
Paul Sandoza7aff442016-04-13 15:05:48 +0200967 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_SET)) {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100968 checkIOOBE(am, () -> {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300969 long o = (long) hs.get(am).invokeExact(array, ci, 0x0123456789ABCDEFL);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100970 });
971 }
972
Paul Sandoza7aff442016-04-13 15:05:48 +0200973 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_ADD)) {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100974 checkIOOBE(am, () -> {
Aleksey Shipileve6632062016-06-15 11:20:15 +0300975 long o = (long) hs.get(am).invokeExact(array, ci, 0xDEADBEEFDEADBEEFL);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100976 });
977 }
Paul Sandoz82d48912016-09-01 10:16:57 -0700978
979 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_BITWISE)) {
980 checkIOOBE(am, () -> {
981 long o = (long) hs.get(am).invokeExact(array, ci, 0xDEADBEEFDEADBEEFL);
982 });
983 }
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100984 }
985 }
986}
987