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