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 VarHandleTestMethodHandleAccessBoolean
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 VarHandleTestMethodHandleAccessBoolean extends VarHandleBaseTest {
45 static final boolean static_final_v = true;
46
47 static boolean static_v;
48
49 final boolean final_v = true;
50
51 boolean 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 VarHandleTestMethodHandleAccessBoolean.class, "final_v", boolean.class);
67
68 vhField = MethodHandles.lookup().findVarHandle(
69 VarHandleTestMethodHandleAccessBoolean.class, "v", boolean.class);
70
71 vhStaticFinalField = MethodHandles.lookup().findStaticVarHandle(
72 VarHandleTestMethodHandleAccessBoolean.class, "static_final_v", boolean.class);
73
74 vhStaticField = MethodHandles.lookup().findStaticVarHandle(
75 VarHandleTestMethodHandleAccessBoolean.class, "static_v", boolean.class);
76
77 vhArray = MethodHandles.arrayElementVarHandle(boolean[].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, VarHandleTestMethodHandleAccessBoolean::testStaticField));
92 cases.add(new MethodHandleAccessTestCase("Static field unsupported",
93 vhStaticField, f, VarHandleTestMethodHandleAccessBoolean::testStaticFieldUnsupported,
94 false));
95
96 cases.add(new MethodHandleAccessTestCase("Array",
97 vhArray, f, VarHandleTestMethodHandleAccessBoolean::testArray));
98 cases.add(new MethodHandleAccessTestCase("Array unsupported",
99 vhArray, f, VarHandleTestMethodHandleAccessBoolean::testArrayUnsupported,
100 false));
101 cases.add(new MethodHandleAccessTestCase("Array index out of bounds",
102 vhArray, f, VarHandleTestMethodHandleAccessBoolean::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(VarHandleTestMethodHandleAccessBoolean recv, Handles hs) throws Throwable {
123 // Plain
124 {
125 hs.get(TestAccessMode.SET).invokeExact(recv, true);
126 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
127 assertEquals(true, x, "set boolean value");
128 }
129
130
131 // Volatile
132 {
133 hs.get(TestAccessMode.SET_VOLATILE).invokeExact(recv, false);
134 boolean x = (boolean) hs.get(TestAccessMode.GET_VOLATILE).invokeExact(recv);
135 assertEquals(false, x, "setVolatile boolean value");
136 }
137
138 // Lazy
139 {
140 hs.get(TestAccessMode.SET_RELEASE).invokeExact(recv, true);
141 boolean x = (boolean) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact(recv);
142 assertEquals(true, x, "setRelease boolean value");
143 }
144
145 // Opaque
146 {
147 hs.get(TestAccessMode.SET_OPAQUE).invokeExact(recv, false);
148 boolean x = (boolean) hs.get(TestAccessMode.GET_OPAQUE).invokeExact(recv);
149 assertEquals(false, x, "setOpaque boolean value");
150 }
151
152 hs.get(TestAccessMode.SET).invokeExact(recv, true);
153
154 // Compare
155 {
156 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(recv, true, false);
157 assertEquals(r, true, "success compareAndSet boolean");
158 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
159 assertEquals(false, x, "success compareAndSet boolean value");
160 }
161
162 {
163 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(recv, true, false);
164 assertEquals(r, false, "failing compareAndSet boolean");
165 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
166 assertEquals(false, x, "failing compareAndSet boolean value");
167 }
168
169 {
170 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(recv, false, true);
171 assertEquals(r, false, "success compareAndExchange boolean");
172 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
173 assertEquals(true, x, "success compareAndExchange boolean value");
174 }
175
176 {
177 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(recv, false, false);
178 assertEquals(r, true, "failing compareAndExchange boolean");
179 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
180 assertEquals(true, x, "failing compareAndExchange boolean value");
181 }
182
183 {
184 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(recv, true, false);
185 assertEquals(r, true, "success compareAndExchangeAcquire boolean");
186 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
187 assertEquals(false, x, "success compareAndExchangeAcquire boolean value");
188 }
189
190 {
191 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(recv, true, false);
192 assertEquals(r, false, "failing compareAndExchangeAcquire boolean");
193 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
194 assertEquals(false, x, "failing compareAndExchangeAcquire boolean value");
195 }
196
197 {
198 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(recv, false, true);
199 assertEquals(r, false, "success compareAndExchangeRelease boolean");
200 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
201 assertEquals(true, x, "success compareAndExchangeRelease boolean value");
202 }
203
204 {
205 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(recv, false, false);
206 assertEquals(r, true, "failing compareAndExchangeRelease boolean");
207 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
208 assertEquals(true, x, "failing compareAndExchangeRelease boolean 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, true, false);
216 if (!success) weakDelay();
217 }
218 assertEquals(success, true, "success weakCompareAndSetPlain boolean");
219 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
220 assertEquals(false, x, "success weakCompareAndSetPlain boolean value");
221 }
222
223 {
224 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN).invokeExact(recv, true, false);
225 assertEquals(success, false, "failing weakCompareAndSetPlain boolean");
226 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
227 assertEquals(false, x, "failing weakCompareAndSetPlain boolean 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, false, true);
235 if (!success) weakDelay();
236 }
237 assertEquals(success, true, "success weakCompareAndSetAcquire boolean");
238 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
239 assertEquals(true, x, "success weakCompareAndSetAcquire boolean");
240 }
241
242 {
243 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(recv, false, false);
244 assertEquals(success, false, "failing weakCompareAndSetAcquire boolean");
245 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
246 assertEquals(true, x, "failing weakCompareAndSetAcquire boolean 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, true, false);
254 if (!success) weakDelay();
255 }
256 assertEquals(success, true, "success weakCompareAndSetRelease boolean");
257 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
258 assertEquals(false, x, "success weakCompareAndSetRelease boolean");
259 }
260
261 {
262 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(recv, true, false);
263 assertEquals(success, false, "failing weakCompareAndSetRelease boolean");
264 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
265 assertEquals(false, x, "failing weakCompareAndSetRelease boolean 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, false, true);
273 if (!success) weakDelay();
274 }
275 assertEquals(success, true, "success weakCompareAndSet boolean");
276 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
277 assertEquals(true, x, "success weakCompareAndSet boolean");
278 }
279
280 {
281 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(recv, false, false);
282 assertEquals(success, false, "failing weakCompareAndSet boolean");
283 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
284 assertEquals(true, x, "failing weakCompareAndSet boolean value");
285 }
286
287 // Compare set and get
288 {
289 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_SET).invokeExact(recv, false);
290 assertEquals(true, o, "getAndSet boolean");
291 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
292 assertEquals(false, x, "getAndSet boolean value");
293 }
294
295
296 // get and bitwise or
297 {
298 hs.get(TestAccessMode.SET).invokeExact(recv, true);
299
300 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_OR).invokeExact(recv, false);
301 assertEquals(true, o, "getAndBitwiseOr boolean");
302 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
303 assertEquals((boolean)(true | false), x, "getAndBitwiseOr boolean value");
304 }
305
306 {
307 hs.get(TestAccessMode.SET).invokeExact(recv, true);
308
309 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_OR_ACQUIRE).invokeExact(recv, false);
310 assertEquals(true, o, "getAndBitwiseOrAcquire boolean");
311 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
312 assertEquals((boolean)(true | false), x, "getAndBitwiseOrAcquire boolean value");
313 }
314
315 {
316 hs.get(TestAccessMode.SET).invokeExact(recv, true);
317
318 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_OR_RELEASE).invokeExact(recv, false);
319 assertEquals(true, o, "getAndBitwiseOrRelease boolean");
320 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
321 assertEquals((boolean)(true | false), x, "getAndBitwiseOrRelease boolean value");
322 }
323
324 // get and bitwise and
325 {
326 hs.get(TestAccessMode.SET).invokeExact(recv, true);
327
328 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_AND).invokeExact(recv, false);
329 assertEquals(true, o, "getAndBitwiseAnd boolean");
330 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
331 assertEquals((boolean)(true & false), x, "getAndBitwiseAnd boolean value");
332 }
333
334 {
335 hs.get(TestAccessMode.SET).invokeExact(recv, true);
336
337 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_AND_ACQUIRE).invokeExact(recv, false);
338 assertEquals(true, o, "getAndBitwiseAndAcquire boolean");
339 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
340 assertEquals((boolean)(true & false), x, "getAndBitwiseAndAcquire boolean value");
341 }
342
343 {
344 hs.get(TestAccessMode.SET).invokeExact(recv, true);
345
346 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_AND_RELEASE).invokeExact(recv, false);
347 assertEquals(true, o, "getAndBitwiseAndRelease boolean");
348 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
349 assertEquals((boolean)(true & false), x, "getAndBitwiseAndRelease boolean value");
350 }
351
352 // get and bitwise xor
353 {
354 hs.get(TestAccessMode.SET).invokeExact(recv, true);
355
356 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_XOR).invokeExact(recv, false);
357 assertEquals(true, o, "getAndBitwiseXor boolean");
358 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
359 assertEquals((boolean)(true ^ false), x, "getAndBitwiseXor boolean value");
360 }
361
362 {
363 hs.get(TestAccessMode.SET).invokeExact(recv, true);
364
365 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_XOR_ACQUIRE).invokeExact(recv, false);
366 assertEquals(true, o, "getAndBitwiseXorAcquire boolean");
367 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
368 assertEquals((boolean)(true ^ false), x, "getAndBitwiseXorAcquire boolean value");
369 }
370
371 {
372 hs.get(TestAccessMode.SET).invokeExact(recv, true);
373
374 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_XOR_RELEASE).invokeExact(recv, false);
375 assertEquals(true, o, "getAndBitwiseXorRelease boolean");
376 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
377 assertEquals((boolean)(true ^ false), x, "getAndBitwiseXorRelease boolean value");
378 }
379 }
380
381 static void testInstanceFieldUnsupported(VarHandleTestMethodHandleAccessBoolean recv, Handles hs) throws Throwable {
382
383 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_ADD)) {
384 checkUOE(am, () -> {
385 boolean r = (boolean) hs.get(am).invokeExact(recv, true);
386 });
387 }
388
389 }
390
391
392 static void testStaticField(Handles hs) throws Throwable {
393 // Plain
394 {
395 hs.get(TestAccessMode.SET).invokeExact(true);
396 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
397 assertEquals(true, x, "set boolean value");
398 }
399
400
401 // Volatile
402 {
403 hs.get(TestAccessMode.SET_VOLATILE).invokeExact(false);
404 boolean x = (boolean) hs.get(TestAccessMode.GET_VOLATILE).invokeExact();
405 assertEquals(false, x, "setVolatile boolean value");
406 }
407
408 // Lazy
409 {
410 hs.get(TestAccessMode.SET_RELEASE).invokeExact(true);
411 boolean x = (boolean) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact();
412 assertEquals(true, x, "setRelease boolean value");
413 }
414
415 // Opaque
416 {
417 hs.get(TestAccessMode.SET_OPAQUE).invokeExact(false);
418 boolean x = (boolean) hs.get(TestAccessMode.GET_OPAQUE).invokeExact();
419 assertEquals(false, x, "setOpaque boolean value");
420 }
421
422 hs.get(TestAccessMode.SET).invokeExact(true);
423
424 // Compare
425 {
426 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(true, false);
427 assertEquals(r, true, "success compareAndSet boolean");
428 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
429 assertEquals(false, x, "success compareAndSet boolean value");
430 }
431
432 {
433 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(true, false);
434 assertEquals(r, false, "failing compareAndSet boolean");
435 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
436 assertEquals(false, x, "failing compareAndSet boolean value");
437 }
438
439 {
440 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(false, true);
441 assertEquals(r, false, "success compareAndExchange boolean");
442 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
443 assertEquals(true, x, "success compareAndExchange boolean value");
444 }
445
446 {
447 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(false, false);
448 assertEquals(r, true, "failing compareAndExchange boolean");
449 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
450 assertEquals(true, x, "failing compareAndExchange boolean value");
451 }
452
453 {
454 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(true, false);
455 assertEquals(r, true, "success compareAndExchangeAcquire boolean");
456 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
457 assertEquals(false, x, "success compareAndExchangeAcquire boolean value");
458 }
459
460 {
461 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(true, false);
462 assertEquals(r, false, "failing compareAndExchangeAcquire boolean");
463 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
464 assertEquals(false, x, "failing compareAndExchangeAcquire boolean value");
465 }
466
467 {
468 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(false, true);
469 assertEquals(r, false, "success compareAndExchangeRelease boolean");
470 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
471 assertEquals(true, x, "success compareAndExchangeRelease boolean value");
472 }
473
474 {
475 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(false, false);
476 assertEquals(r, true, "failing compareAndExchangeRelease boolean");
477 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
478 assertEquals(true, x, "failing compareAndExchangeRelease boolean value");
479 }
480
481 {
482 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN);
483 boolean success = false;
484 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
485 success = (boolean) mh.invokeExact(true, false);
486 if (!success) weakDelay();
487 }
488 assertEquals(success, true, "success weakCompareAndSetPlain boolean");
489 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
490 assertEquals(false, x, "success weakCompareAndSetPlain boolean value");
491 }
492
493 {
494 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN).invokeExact(true, false);
495 assertEquals(success, false, "failing weakCompareAndSetPlain boolean");
496 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
497 assertEquals(false, x, "failing weakCompareAndSetPlain boolean value");
498 }
499
500 {
501 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE);
502 boolean success = false;
503 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
504 success = (boolean) mh.invokeExact(false, true);
505 if (!success) weakDelay();
506 }
507 assertEquals(success, true, "success weakCompareAndSetAcquire boolean");
508 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
509 assertEquals(true, x, "success weakCompareAndSetAcquire boolean");
510 }
511
512 {
513 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE);
514 boolean success = (boolean) mh.invokeExact(false, false);
515 assertEquals(success, false, "failing weakCompareAndSetAcquire boolean");
516 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
517 assertEquals(true, x, "failing weakCompareAndSetAcquire boolean value");
518 }
519
520 {
521 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE);
522 boolean success = false;
523 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
524 success = (boolean) mh.invokeExact(true, false);
525 if (!success) weakDelay();
526 }
527 assertEquals(success, true, "success weakCompareAndSetRelease boolean");
528 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
529 assertEquals(false, x, "success weakCompareAndSetRelease boolean");
530 }
531
532 {
533 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(true, false);
534 assertEquals(success, false, "failing weakCompareAndSetRelease boolean");
535 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
536 assertEquals(false, x, "failing weakCompareAndSetRelease boolean value");
537 }
538
539 {
540 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET);
541 boolean success = false;
542 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
543 success = (boolean) mh.invokeExact(false, true);
544 if (!success) weakDelay();
545 }
546 assertEquals(success, true, "success weakCompareAndSet boolean");
547 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
548 assertEquals(true, x, "success weakCompareAndSet boolean");
549 }
550
551 {
552 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(false, false);
553 assertEquals(success, false, "failing weakCompareAndSet boolean");
554 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
555 assertEquals(true, x, "failing weakCompareAndSetRe boolean value");
556 }
557
558 // Compare set and get
559 {
560 hs.get(TestAccessMode.SET).invokeExact(true);
561
562 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_SET).invokeExact(false);
563 assertEquals(true, o, "getAndSet boolean");
564 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
565 assertEquals(false, x, "getAndSet boolean value");
566 }
567
568 // Compare set and get
569 {
570 hs.get(TestAccessMode.SET).invokeExact(true);
571
572 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_SET_ACQUIRE).invokeExact(false);
573 assertEquals(true, o, "getAndSetAcquire boolean");
574 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
575 assertEquals(false, x, "getAndSetAcquire boolean value");
576 }
577
578 // Compare set and get
579 {
580 hs.get(TestAccessMode.SET).invokeExact(true);
581
582 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_SET_RELEASE).invokeExact(false);
583 assertEquals(true, o, "getAndSetRelease boolean");
584 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
585 assertEquals(false, x, "getAndSetRelease boolean value");
586 }
587
588
589 // get and bitwise or
590 {
591 hs.get(TestAccessMode.SET).invokeExact(true);
592
593 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_OR).invokeExact(false);
594 assertEquals(true, o, "getAndBitwiseOr boolean");
595 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
596 assertEquals((boolean)(true | false), x, "getAndBitwiseOr boolean value");
597 }
598
599 {
600 hs.get(TestAccessMode.SET).invokeExact(true);
601
602 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_OR_ACQUIRE).invokeExact(false);
603 assertEquals(true, o, "getAndBitwiseOrAcquire boolean");
604 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
605 assertEquals((boolean)(true | false), x, "getAndBitwiseOrAcquire boolean value");
606 }
607
608 {
609 hs.get(TestAccessMode.SET).invokeExact(true);
610
611 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_OR_RELEASE).invokeExact(false);
612 assertEquals(true, o, "getAndBitwiseOrRelease boolean");
613 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
614 assertEquals((boolean)(true | false), x, "getAndBitwiseOrRelease boolean value");
615 }
616
617 // get and bitwise and
618 {
619 hs.get(TestAccessMode.SET).invokeExact(true);
620
621 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_AND).invokeExact(false);
622 assertEquals(true, o, "getAndBitwiseAnd boolean");
623 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
624 assertEquals((boolean)(true & false), x, "getAndBitwiseAnd boolean value");
625 }
626
627 {
628 hs.get(TestAccessMode.SET).invokeExact(true);
629
630 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_AND_ACQUIRE).invokeExact(false);
631 assertEquals(true, o, "getAndBitwiseAndAcquire boolean");
632 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
633 assertEquals((boolean)(true & false), x, "getAndBitwiseAndAcquire boolean value");
634 }
635
636 {
637 hs.get(TestAccessMode.SET).invokeExact(true);
638
639 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_AND_RELEASE).invokeExact(false);
640 assertEquals(true, o, "getAndBitwiseAndRelease boolean");
641 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
642 assertEquals((boolean)(true & false), x, "getAndBitwiseAndRelease boolean value");
643 }
644
645 // get and bitwise xor
646 {
647 hs.get(TestAccessMode.SET).invokeExact(true);
648
649 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_XOR).invokeExact(false);
650 assertEquals(true, o, "getAndBitwiseXor boolean");
651 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
652 assertEquals((boolean)(true ^ false), x, "getAndBitwiseXor boolean value");
653 }
654
655 {
656 hs.get(TestAccessMode.SET).invokeExact(true);
657
658 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_XOR_ACQUIRE).invokeExact(false);
659 assertEquals(true, o, "getAndBitwiseXorAcquire boolean");
660 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
661 assertEquals((boolean)(true ^ false), x, "getAndBitwiseXorAcquire boolean value");
662 }
663
664 {
665 hs.get(TestAccessMode.SET).invokeExact(true);
666
667 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_XOR_RELEASE).invokeExact(false);
668 assertEquals(true, o, "getAndBitwiseXorRelease boolean");
669 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
670 assertEquals((boolean)(true ^ false), x, "getAndBitwiseXorRelease boolean value");
671 }
672 }
673
674 static void testStaticFieldUnsupported(Handles hs) throws Throwable {
675
676 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_ADD)) {
677 checkUOE(am, () -> {
678 boolean r = (boolean) hs.get(am).invokeExact(true);
679 });
680 }
681
682 }
683
684
685 static void testArray(Handles hs) throws Throwable {
686 boolean[] array = new boolean[10];
687
688 for (int i = 0; i < array.length; i++) {
689 // Plain
690 {
691 hs.get(TestAccessMode.SET).invokeExact(array, i, true);
692 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
693 assertEquals(true, x, "get boolean value");
694 }
695
696
697 // Volatile
698 {
699 hs.get(TestAccessMode.SET_VOLATILE).invokeExact(array, i, false);
700 boolean x = (boolean) hs.get(TestAccessMode.GET_VOLATILE).invokeExact(array, i);
701 assertEquals(false, x, "setVolatile boolean value");
702 }
703
704 // Lazy
705 {
706 hs.get(TestAccessMode.SET_RELEASE).invokeExact(array, i, true);
707 boolean x = (boolean) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact(array, i);
708 assertEquals(true, x, "setRelease boolean value");
709 }
710
711 // Opaque
712 {
713 hs.get(TestAccessMode.SET_OPAQUE).invokeExact(array, i, false);
714 boolean x = (boolean) hs.get(TestAccessMode.GET_OPAQUE).invokeExact(array, i);
715 assertEquals(false, x, "setOpaque boolean value");
716 }
717
718 hs.get(TestAccessMode.SET).invokeExact(array, i, true);
719
720 // Compare
721 {
722 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(array, i, true, false);
723 assertEquals(r, true, "success compareAndSet boolean");
724 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
725 assertEquals(false, x, "success compareAndSet boolean value");
726 }
727
728 {
729 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(array, i, true, false);
730 assertEquals(r, false, "failing compareAndSet boolean");
731 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
732 assertEquals(false, x, "failing compareAndSet boolean value");
733 }
734
735 {
736 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(array, i, false, true);
737 assertEquals(r, false, "success compareAndExchange boolean");
738 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
739 assertEquals(true, x, "success compareAndExchange boolean value");
740 }
741
742 {
743 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(array, i, false, false);
744 assertEquals(r, true, "failing compareAndExchange boolean");
745 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
746 assertEquals(true, x, "failing compareAndExchange boolean value");
747 }
748
749 {
750 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(array, i, true, false);
751 assertEquals(r, true, "success compareAndExchangeAcquire boolean");
752 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
753 assertEquals(false, x, "success compareAndExchangeAcquire boolean value");
754 }
755
756 {
757 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(array, i, true, false);
758 assertEquals(r, false, "failing compareAndExchangeAcquire boolean");
759 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
760 assertEquals(false, x, "failing compareAndExchangeAcquire boolean value");
761 }
762
763 {
764 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(array, i, false, true);
765 assertEquals(r, false, "success compareAndExchangeRelease boolean");
766 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
767 assertEquals(true, x, "success compareAndExchangeRelease boolean value");
768 }
769
770 {
771 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(array, i, false, false);
772 assertEquals(r, true, "failing compareAndExchangeRelease boolean");
773 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
774 assertEquals(true, x, "failing compareAndExchangeRelease boolean value");
775 }
776
777 {
778 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN);
779 boolean success = false;
780 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
781 success = (boolean) mh.invokeExact(array, i, true, false);
782 if (!success) weakDelay();
783 }
784 assertEquals(success, true, "success weakCompareAndSetPlain boolean");
785 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
786 assertEquals(false, x, "success weakCompareAndSetPlain boolean value");
787 }
788
789 {
790 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN).invokeExact(array, i, true, false);
791 assertEquals(success, false, "failing weakCompareAndSetPlain boolean");
792 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
793 assertEquals(false, x, "failing weakCompareAndSetPlain boolean value");
794 }
795
796 {
797 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE);
798 boolean success = false;
799 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
800 success = (boolean) mh.invokeExact(array, i, false, true);
801 if (!success) weakDelay();
802 }
803 assertEquals(success, true, "success weakCompareAndSetAcquire boolean");
804 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
805 assertEquals(true, x, "success weakCompareAndSetAcquire boolean");
806 }
807
808 {
809 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(array, i, false, false);
810 assertEquals(success, false, "failing weakCompareAndSetAcquire boolean");
811 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
812 assertEquals(true, x, "failing weakCompareAndSetAcquire boolean value");
813 }
814
815 {
816 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE);
817 boolean success = false;
818 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
819 success = (boolean) mh.invokeExact(array, i, true, false);
820 if (!success) weakDelay();
821 }
822 assertEquals(success, true, "success weakCompareAndSetRelease boolean");
823 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
824 assertEquals(false, x, "success weakCompareAndSetRelease boolean");
825 }
826
827 {
828 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(array, i, true, false);
829 assertEquals(success, false, "failing weakCompareAndSetAcquire boolean");
830 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
831 assertEquals(false, x, "failing weakCompareAndSetAcquire boolean value");
832 }
833
834 {
835 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET);
836 boolean success = false;
837 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
838 success = (boolean) mh.invokeExact(array, i, false, true);
839 if (!success) weakDelay();
840 }
841 assertEquals(success, true, "success weakCompareAndSet boolean");
842 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
843 assertEquals(true, x, "success weakCompareAndSet boolean");
844 }
845
846 {
847 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(array, i, false, false);
848 assertEquals(success, false, "failing weakCompareAndSet boolean");
849 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
850 assertEquals(true, x, "failing weakCompareAndSet boolean value");
851 }
852
853 // Compare set and get
854 {
855 hs.get(TestAccessMode.SET).invokeExact(array, i, true);
856
857 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_SET).invokeExact(array, i, false);
858 assertEquals(true, o, "getAndSet boolean");
859 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
860 assertEquals(false, x, "getAndSet boolean value");
861 }
862
863 {
864 hs.get(TestAccessMode.SET).invokeExact(array, i, true);
865
866 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_SET_ACQUIRE).invokeExact(array, i, false);
867 assertEquals(true, o, "getAndSetAcquire boolean");
868 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
869 assertEquals(false, x, "getAndSetAcquire boolean value");
870 }
871
872 {
873 hs.get(TestAccessMode.SET).invokeExact(array, i, true);
874
875 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_SET_RELEASE).invokeExact(array, i, false);
876 assertEquals(true, o, "getAndSetRelease boolean");
877 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
878 assertEquals(false, x, "getAndSetRelease boolean value");
879 }
880
881
882 // get and bitwise or
883 {
884 hs.get(TestAccessMode.SET).invokeExact(array, i, true);
885
886 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_OR).invokeExact(array, i, false);
887 assertEquals(true, o, "getAndBitwiseOr boolean");
888 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
889 assertEquals((boolean)(true | false), x, "getAndBitwiseOr boolean value");
890 }
891
892 {
893 hs.get(TestAccessMode.SET).invokeExact(array, i, true);
894
895 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_OR_ACQUIRE).invokeExact(array, i, false);
896 assertEquals(true, o, "getAndBitwiseOrAcquire boolean");
897 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
898 assertEquals((boolean)(true | false), x, "getAndBitwiseOrAcquire boolean value");
899 }
900
901 {
902 hs.get(TestAccessMode.SET).invokeExact(array, i, true);
903
904 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_OR_RELEASE).invokeExact(array, i, false);
905 assertEquals(true, o, "getAndBitwiseOrRelease boolean");
906 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
907 assertEquals((boolean)(true | false), x, "getAndBitwiseOrRelease boolean value");
908 }
909
910 // get and bitwise and
911 {
912 hs.get(TestAccessMode.SET).invokeExact(array, i, true);
913
914 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_AND).invokeExact(array, i, false);
915 assertEquals(true, o, "getAndBitwiseAnd boolean");
916 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
917 assertEquals((boolean)(true & false), x, "getAndBitwiseAnd boolean value");
918 }
919
920 {
921 hs.get(TestAccessMode.SET).invokeExact(array, i, true);
922
923 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_AND_ACQUIRE).invokeExact(array, i, false);
924 assertEquals(true, o, "getAndBitwiseAndAcquire boolean");
925 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
926 assertEquals((boolean)(true & false), x, "getAndBitwiseAndAcquire boolean value");
927 }
928
929 {
930 hs.get(TestAccessMode.SET).invokeExact(array, i, true);
931
932 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_AND_RELEASE).invokeExact(array, i, false);
933 assertEquals(true, o, "getAndBitwiseAndRelease boolean");
934 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
935 assertEquals((boolean)(true & false), x, "getAndBitwiseAndRelease boolean value");
936 }
937
938 // get and bitwise xor
939 {
940 hs.get(TestAccessMode.SET).invokeExact(array, i, true);
941
942 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_XOR).invokeExact(array, i, false);
943 assertEquals(true, o, "getAndBitwiseXor boolean");
944 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
945 assertEquals((boolean)(true ^ false), x, "getAndBitwiseXor boolean value");
946 }
947
948 {
949 hs.get(TestAccessMode.SET).invokeExact(array, i, true);
950
951 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_XOR_ACQUIRE).invokeExact(array, i, false);
952 assertEquals(true, o, "getAndBitwiseXorAcquire boolean");
953 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
954 assertEquals((boolean)(true ^ false), x, "getAndBitwiseXorAcquire boolean value");
955 }
956
957 {
958 hs.get(TestAccessMode.SET).invokeExact(array, i, true);
959
960 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_XOR_RELEASE).invokeExact(array, i, false);
961 assertEquals(true, o, "getAndBitwiseXorRelease boolean");
962 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
963 assertEquals((boolean)(true ^ false), x, "getAndBitwiseXorRelease boolean value");
964 }
965 }
966 }
967
968 static void testArrayUnsupported(Handles hs) throws Throwable {
969 boolean[] array = new boolean[10];
970
971 final int i = 0;
972
973 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_ADD)) {
974 checkUOE(am, () -> {
975 boolean o = (boolean) hs.get(am).invokeExact(array, i, true);
976 });
977 }
978
979 }
980
981 static void testArrayIndexOutOfBounds(Handles hs) throws Throwable {
982 boolean[] array = new boolean[10];
983
984 for (int i : new int[]{-1, Integer.MIN_VALUE, 10, 11, Integer.MAX_VALUE}) {
985 final int ci = i;
986
987 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET)) {
988 checkAIOOBE(am, () -> {
989 boolean x = (boolean) hs.get(am).invokeExact(array, ci);
990 });
991 }
992
993 for (TestAccessMode am : testAccessModesOfType(TestAccessType.SET)) {
994 checkAIOOBE(am, () -> {
995 hs.get(am).invokeExact(array, ci, true);
996 });
997 }
998
999 for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_SET)) {
1000 checkAIOOBE(am, () -> {
1001 boolean r = (boolean) hs.get(am).invokeExact(array, ci, true, false);
1002 });
1003 }
1004
1005 for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_EXCHANGE)) {
1006 checkAIOOBE(am, () -> {
1007 boolean r = (boolean) hs.get(am).invokeExact(array, ci, false, true);
1008 });
1009 }
1010
1011 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_SET)) {
1012 checkAIOOBE(am, () -> {
1013 boolean o = (boolean) hs.get(am).invokeExact(array, ci, true);
1014 });
1015 }
1016
1017
1018 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_BITWISE)) {
1019 checkAIOOBE(am, () -> {
1020 boolean o = (boolean) hs.get(am).invokeExact(array, ci, false);
1021 });
1022 }
1023 }
1024 }
1025 }
1026