blob: 99904d32c02b5722edda5550cb33e1bb4f276c40 [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 VarHandleTestMethodHandleAccessBoolean
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 VarHandleTestMethodHandleAccessBoolean extends VarHandleBaseTest {
42 static final boolean static_final_v = true;
43
44 static boolean static_v;
45
46 final boolean final_v = true;
47
48 boolean 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 VarHandleTestMethodHandleAccessBoolean.class, "final_v", boolean.class);
64
65 vhField = MethodHandles.lookup().findVarHandle(
66 VarHandleTestMethodHandleAccessBoolean.class, "v", boolean.class);
67
68 vhStaticFinalField = MethodHandles.lookup().findStaticVarHandle(
69 VarHandleTestMethodHandleAccessBoolean.class, "static_final_v", boolean.class);
70
71 vhStaticField = MethodHandles.lookup().findStaticVarHandle(
72 VarHandleTestMethodHandleAccessBoolean.class, "static_v", boolean.class);
73
74 vhArray = MethodHandles.arrayElementVarHandle(boolean[].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, VarHandleTestMethodHandleAccessBoolean::testStaticField));
91 cases.add(new MethodHandleAccessTestCase("Static field unsupported",
92 vhStaticField, f, VarHandleTestMethodHandleAccessBoolean::testStaticFieldUnsupported,
93 false));
94
95 cases.add(new MethodHandleAccessTestCase("Array",
96 vhArray, f, VarHandleTestMethodHandleAccessBoolean::testArray));
97 cases.add(new MethodHandleAccessTestCase("Array unsupported",
98 vhArray, f, VarHandleTestMethodHandleAccessBoolean::testArrayUnsupported,
99 false));
100 cases.add(new MethodHandleAccessTestCase("Array index out of bounds",
101 vhArray, f, VarHandleTestMethodHandleAccessBoolean::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(VarHandleTestMethodHandleAccessBoolean recv, Handles hs) throws Throwable {
122 // Plain
123 {
Paul Sandoza7aff442016-04-13 15:05:48 +0200124 hs.get(TestAccessMode.SET).invokeExact(recv, true);
125 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100126 assertEquals(x, true, "set boolean value");
127 }
128
129
130 // Volatile
131 {
Paul Sandoza7aff442016-04-13 15:05:48 +0200132 hs.get(TestAccessMode.SET_VOLATILE).invokeExact(recv, false);
133 boolean x = (boolean) hs.get(TestAccessMode.GET_VOLATILE).invokeExact(recv);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100134 assertEquals(x, false, "setVolatile boolean value");
135 }
136
137 // Lazy
138 {
Paul Sandoza7aff442016-04-13 15:05:48 +0200139 hs.get(TestAccessMode.SET_RELEASE).invokeExact(recv, true);
140 boolean x = (boolean) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact(recv);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100141 assertEquals(x, true, "setRelease boolean value");
142 }
143
144 // Opaque
145 {
Paul Sandoza7aff442016-04-13 15:05:48 +0200146 hs.get(TestAccessMode.SET_OPAQUE).invokeExact(recv, false);
147 boolean x = (boolean) hs.get(TestAccessMode.GET_OPAQUE).invokeExact(recv);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100148 assertEquals(x, false, "setOpaque boolean value");
149 }
150
Aleksey Shipileve6632062016-06-15 11:20:15 +0300151 hs.get(TestAccessMode.SET).invokeExact(recv, true);
152
153 // Compare
154 {
155 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(recv, true, false);
156 assertEquals(r, true, "success compareAndSet boolean");
157 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
158 assertEquals(x, false, "success compareAndSet boolean value");
159 }
160
161 {
162 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(recv, true, false);
163 assertEquals(r, false, "failing compareAndSet boolean");
164 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
165 assertEquals(x, false, "failing compareAndSet boolean value");
166 }
167
168 {
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200169 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(recv, false, true);
170 assertEquals(r, false, "success compareAndExchange boolean");
Aleksey Shipileve6632062016-06-15 11:20:15 +0300171 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200172 assertEquals(x, true, "success compareAndExchange boolean value");
Aleksey Shipileve6632062016-06-15 11:20:15 +0300173 }
174
175 {
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200176 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(recv, false, false);
177 assertEquals(r, true, "failing compareAndExchange boolean");
Aleksey Shipileve6632062016-06-15 11:20:15 +0300178 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200179 assertEquals(x, true, "failing compareAndExchange boolean value");
Aleksey Shipileve6632062016-06-15 11:20:15 +0300180 }
181
182 {
183 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(recv, true, false);
184 assertEquals(r, true, "success compareAndExchangeAcquire boolean");
185 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
186 assertEquals(x, false, "success compareAndExchangeAcquire boolean value");
187 }
188
189 {
190 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(recv, true, false);
191 assertEquals(r, false, "failing compareAndExchangeAcquire boolean");
192 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
193 assertEquals(x, false, "failing compareAndExchangeAcquire boolean value");
194 }
195
196 {
197 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(recv, false, true);
198 assertEquals(r, false, "success compareAndExchangeRelease boolean");
199 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
200 assertEquals(x, true, "success compareAndExchangeRelease boolean value");
201 }
202
203 {
204 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(recv, false, false);
205 assertEquals(r, true, "failing compareAndExchangeRelease boolean");
206 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
207 assertEquals(x, true, "failing compareAndExchangeRelease boolean value");
208 }
209
210 {
211 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, true, false);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300214 }
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700215 assertEquals(success, true, "weakCompareAndSetPlain boolean");
Aleksey Shipileve6632062016-06-15 11:20:15 +0300216 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700217 assertEquals(x, false, "weakCompareAndSetPlain boolean value");
Aleksey Shipileve6632062016-06-15 11:20:15 +0300218 }
219
220 {
221 boolean success = false;
222 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
223 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(recv, false, true);
224 }
225 assertEquals(success, true, "weakCompareAndSetAcquire boolean");
226 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
227 assertEquals(x, true, "weakCompareAndSetAcquire boolean");
228 }
229
230 {
231 boolean success = false;
232 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
233 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(recv, true, false);
234 }
235 assertEquals(success, true, "weakCompareAndSetRelease boolean");
236 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
237 assertEquals(x, false, "weakCompareAndSetRelease boolean");
238 }
239
240 {
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, false, true);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300244 }
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700245 assertEquals(success, true, "weakCompareAndSet boolean");
Aleksey Shipileve6632062016-06-15 11:20:15 +0300246 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700247 assertEquals(x, true, "weakCompareAndSet boolean");
Aleksey Shipileve6632062016-06-15 11:20:15 +0300248 }
249
250 // Compare set and get
251 {
252 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_SET).invokeExact(recv, false);
253 assertEquals(o, true, "getAndSet boolean");
254 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
255 assertEquals(x, false, "getAndSet boolean value");
256 }
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100257
Paul Sandoz82d48912016-09-01 10:16:57 -0700258
259 // get and bitwise or
260 {
261 hs.get(TestAccessMode.SET).invokeExact(recv, true);
262
263 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_OR).invokeExact(recv, false);
264 assertEquals(o, true, "getAndBitwiseOr boolean");
265 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
266 assertEquals(x, (boolean)(true | false), "getAndBitwiseOr boolean value");
267 }
268
269 {
270 hs.get(TestAccessMode.SET).invokeExact(recv, true);
271
272 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_OR_ACQUIRE).invokeExact(recv, false);
273 assertEquals(o, true, "getAndBitwiseOrAcquire boolean");
274 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
275 assertEquals(x, (boolean)(true | false), "getAndBitwiseOrAcquire boolean value");
276 }
277
278 {
279 hs.get(TestAccessMode.SET).invokeExact(recv, true);
280
281 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_OR_RELEASE).invokeExact(recv, false);
282 assertEquals(o, true, "getAndBitwiseOrRelease boolean");
283 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
284 assertEquals(x, (boolean)(true | false), "getAndBitwiseOrRelease boolean value");
285 }
286
287 // get and bitwise and
288 {
289 hs.get(TestAccessMode.SET).invokeExact(recv, true);
290
291 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_AND).invokeExact(recv, false);
292 assertEquals(o, true, "getAndBitwiseAnd boolean");
293 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
294 assertEquals(x, (boolean)(true & false), "getAndBitwiseAnd boolean value");
295 }
296
297 {
298 hs.get(TestAccessMode.SET).invokeExact(recv, true);
299
300 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_AND_ACQUIRE).invokeExact(recv, false);
301 assertEquals(o, true, "getAndBitwiseAndAcquire boolean");
302 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
303 assertEquals(x, (boolean)(true & false), "getAndBitwiseAndAcquire boolean value");
304 }
305
306 {
307 hs.get(TestAccessMode.SET).invokeExact(recv, true);
308
309 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_AND_RELEASE).invokeExact(recv, false);
310 assertEquals(o, true, "getAndBitwiseAndRelease boolean");
311 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
312 assertEquals(x, (boolean)(true & false), "getAndBitwiseAndRelease boolean value");
313 }
314
315 // get and bitwise xor
316 {
317 hs.get(TestAccessMode.SET).invokeExact(recv, true);
318
319 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_XOR).invokeExact(recv, false);
320 assertEquals(o, true, "getAndBitwiseXor boolean");
321 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
322 assertEquals(x, (boolean)(true ^ false), "getAndBitwiseXor boolean value");
323 }
324
325 {
326 hs.get(TestAccessMode.SET).invokeExact(recv, true);
327
328 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_XOR_ACQUIRE).invokeExact(recv, false);
329 assertEquals(o, true, "getAndBitwiseXorAcquire boolean");
330 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
331 assertEquals(x, (boolean)(true ^ false), "getAndBitwiseXorAcquire boolean value");
332 }
333
334 {
335 hs.get(TestAccessMode.SET).invokeExact(recv, true);
336
337 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_XOR_RELEASE).invokeExact(recv, false);
338 assertEquals(o, true, "getAndBitwiseXorRelease boolean");
339 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(recv);
340 assertEquals(x, (boolean)(true ^ false), "getAndBitwiseXorRelease boolean value");
341 }
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100342 }
343
344 static void testInstanceFieldUnsupported(VarHandleTestMethodHandleAccessBoolean recv, Handles hs) throws Throwable {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100345
Paul Sandoza7aff442016-04-13 15:05:48 +0200346 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_ADD)) {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100347 checkUOE(am, () -> {
348 boolean r = (boolean) hs.get(am).invokeExact(recv, true);
349 });
350 }
Paul Sandoz82d48912016-09-01 10:16:57 -0700351
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100352 }
353
354
355 static void testStaticField(Handles hs) throws Throwable {
356 // Plain
357 {
Paul Sandoza7aff442016-04-13 15:05:48 +0200358 hs.get(TestAccessMode.SET).invokeExact(true);
359 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100360 assertEquals(x, true, "set boolean value");
361 }
362
363
364 // Volatile
365 {
Paul Sandoza7aff442016-04-13 15:05:48 +0200366 hs.get(TestAccessMode.SET_VOLATILE).invokeExact(false);
367 boolean x = (boolean) hs.get(TestAccessMode.GET_VOLATILE).invokeExact();
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100368 assertEquals(x, false, "setVolatile boolean value");
369 }
370
371 // Lazy
372 {
Paul Sandoza7aff442016-04-13 15:05:48 +0200373 hs.get(TestAccessMode.SET_RELEASE).invokeExact(true);
374 boolean x = (boolean) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact();
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100375 assertEquals(x, true, "setRelease boolean value");
376 }
377
378 // Opaque
379 {
Paul Sandoza7aff442016-04-13 15:05:48 +0200380 hs.get(TestAccessMode.SET_OPAQUE).invokeExact(false);
381 boolean x = (boolean) hs.get(TestAccessMode.GET_OPAQUE).invokeExact();
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100382 assertEquals(x, false, "setOpaque boolean value");
383 }
384
Aleksey Shipileve6632062016-06-15 11:20:15 +0300385 hs.get(TestAccessMode.SET).invokeExact(true);
386
387 // Compare
388 {
389 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(true, false);
390 assertEquals(r, true, "success compareAndSet boolean");
391 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
392 assertEquals(x, false, "success compareAndSet boolean value");
393 }
394
395 {
396 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(true, false);
397 assertEquals(r, false, "failing compareAndSet boolean");
398 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
399 assertEquals(x, false, "failing compareAndSet boolean value");
400 }
401
402 {
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200403 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(false, true);
404 assertEquals(r, false, "success compareAndExchange boolean");
Aleksey Shipileve6632062016-06-15 11:20:15 +0300405 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200406 assertEquals(x, true, "success compareAndExchange boolean value");
Aleksey Shipileve6632062016-06-15 11:20:15 +0300407 }
408
409 {
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200410 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(false, false);
411 assertEquals(r, true, "failing compareAndExchange boolean");
Aleksey Shipileve6632062016-06-15 11:20:15 +0300412 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200413 assertEquals(x, true, "failing compareAndExchange boolean value");
Aleksey Shipileve6632062016-06-15 11:20:15 +0300414 }
415
416 {
417 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(true, false);
418 assertEquals(r, true, "success compareAndExchangeAcquire boolean");
419 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
420 assertEquals(x, false, "success compareAndExchangeAcquire boolean value");
421 }
422
423 {
424 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(true, false);
425 assertEquals(r, false, "failing compareAndExchangeAcquire boolean");
426 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
427 assertEquals(x, false, "failing compareAndExchangeAcquire boolean value");
428 }
429
430 {
431 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(false, true);
432 assertEquals(r, false, "success compareAndExchangeRelease boolean");
433 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
434 assertEquals(x, true, "success compareAndExchangeRelease boolean value");
435 }
436
437 {
438 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(false, false);
439 assertEquals(r, true, "failing compareAndExchangeRelease boolean");
440 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
441 assertEquals(x, true, "failing compareAndExchangeRelease boolean value");
442 }
443
444 {
445 boolean success = false;
446 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700447 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN).invokeExact(true, false);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300448 }
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700449 assertEquals(success, true, "weakCompareAndSetPlain boolean");
Aleksey Shipileve6632062016-06-15 11:20:15 +0300450 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700451 assertEquals(x, false, "weakCompareAndSetPlain boolean value");
Aleksey Shipileve6632062016-06-15 11:20:15 +0300452 }
453
454 {
455 boolean success = false;
456 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
457 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(false, true);
458 }
459 assertEquals(success, true, "weakCompareAndSetAcquire boolean");
460 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
461 assertEquals(x, true, "weakCompareAndSetAcquire boolean");
462 }
463
464 {
465 boolean success = false;
466 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
467 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(true, false);
468 }
469 assertEquals(success, true, "weakCompareAndSetRelease boolean");
470 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
471 assertEquals(x, false, "weakCompareAndSetRelease boolean");
472 }
473
474 {
475 boolean success = false;
476 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700477 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(false, true);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300478 }
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700479 assertEquals(success, true, "weakCompareAndSet boolean");
Aleksey Shipileve6632062016-06-15 11:20:15 +0300480 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700481 assertEquals(x, true, "weakCompareAndSet boolean");
Aleksey Shipileve6632062016-06-15 11:20:15 +0300482 }
483
484 // Compare set and get
485 {
Paul Sandoz82d48912016-09-01 10:16:57 -0700486 hs.get(TestAccessMode.SET).invokeExact(true);
487
488 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_SET).invokeExact(false);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300489 assertEquals(o, true, "getAndSet boolean");
490 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
491 assertEquals(x, false, "getAndSet boolean value");
492 }
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100493
Paul Sandoz82d48912016-09-01 10:16:57 -0700494 // Compare set and get
495 {
496 hs.get(TestAccessMode.SET).invokeExact(true);
497
498 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_SET_ACQUIRE).invokeExact(false);
499 assertEquals(o, true, "getAndSetAcquire boolean");
500 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
501 assertEquals(x, false, "getAndSetAcquire boolean value");
502 }
503
504 // Compare set and get
505 {
506 hs.get(TestAccessMode.SET).invokeExact(true);
507
508 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_SET_RELEASE).invokeExact(false);
509 assertEquals(o, true, "getAndSetRelease boolean");
510 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
511 assertEquals(x, false, "getAndSetRelease boolean value");
512 }
513
514
515 // get and bitwise or
516 {
517 hs.get(TestAccessMode.SET).invokeExact(true);
518
519 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_OR).invokeExact(false);
520 assertEquals(o, true, "getAndBitwiseOr boolean");
521 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
522 assertEquals(x, (boolean)(true | false), "getAndBitwiseOr boolean value");
523 }
524
525 {
526 hs.get(TestAccessMode.SET).invokeExact(true);
527
528 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_OR_ACQUIRE).invokeExact(false);
529 assertEquals(o, true, "getAndBitwiseOrAcquire boolean");
530 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
531 assertEquals(x, (boolean)(true | false), "getAndBitwiseOrAcquire boolean value");
532 }
533
534 {
535 hs.get(TestAccessMode.SET).invokeExact(true);
536
537 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_OR_RELEASE).invokeExact(false);
538 assertEquals(o, true, "getAndBitwiseOrRelease boolean");
539 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
540 assertEquals(x, (boolean)(true | false), "getAndBitwiseOrRelease boolean value");
541 }
542
543 // get and bitwise and
544 {
545 hs.get(TestAccessMode.SET).invokeExact(true);
546
547 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_AND).invokeExact(false);
548 assertEquals(o, true, "getAndBitwiseAnd boolean");
549 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
550 assertEquals(x, (boolean)(true & false), "getAndBitwiseAnd boolean value");
551 }
552
553 {
554 hs.get(TestAccessMode.SET).invokeExact(true);
555
556 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_AND_ACQUIRE).invokeExact(false);
557 assertEquals(o, true, "getAndBitwiseAndAcquire boolean");
558 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
559 assertEquals(x, (boolean)(true & false), "getAndBitwiseAndAcquire boolean value");
560 }
561
562 {
563 hs.get(TestAccessMode.SET).invokeExact(true);
564
565 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_AND_RELEASE).invokeExact(false);
566 assertEquals(o, true, "getAndBitwiseAndRelease boolean");
567 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
568 assertEquals(x, (boolean)(true & false), "getAndBitwiseAndRelease boolean value");
569 }
570
571 // get and bitwise xor
572 {
573 hs.get(TestAccessMode.SET).invokeExact(true);
574
575 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_XOR).invokeExact(false);
576 assertEquals(o, true, "getAndBitwiseXor boolean");
577 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
578 assertEquals(x, (boolean)(true ^ false), "getAndBitwiseXor boolean value");
579 }
580
581 {
582 hs.get(TestAccessMode.SET).invokeExact(true);
583
584 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_XOR_ACQUIRE).invokeExact(false);
585 assertEquals(o, true, "getAndBitwiseXorAcquire boolean");
586 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
587 assertEquals(x, (boolean)(true ^ false), "getAndBitwiseXorAcquire boolean value");
588 }
589
590 {
591 hs.get(TestAccessMode.SET).invokeExact(true);
592
593 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_XOR_RELEASE).invokeExact(false);
594 assertEquals(o, true, "getAndBitwiseXorRelease boolean");
595 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact();
596 assertEquals(x, (boolean)(true ^ false), "getAndBitwiseXorRelease boolean value");
597 }
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100598 }
599
600 static void testStaticFieldUnsupported(Handles hs) throws Throwable {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100601
Paul Sandoza7aff442016-04-13 15:05:48 +0200602 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_ADD)) {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100603 checkUOE(am, () -> {
604 boolean r = (boolean) hs.get(am).invokeExact(true);
605 });
606 }
Paul Sandoz82d48912016-09-01 10:16:57 -0700607
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100608 }
609
610
611 static void testArray(Handles hs) throws Throwable {
612 boolean[] array = new boolean[10];
613
614 for (int i = 0; i < array.length; i++) {
615 // Plain
616 {
Paul Sandoza7aff442016-04-13 15:05:48 +0200617 hs.get(TestAccessMode.SET).invokeExact(array, i, true);
618 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100619 assertEquals(x, true, "get boolean value");
620 }
621
622
623 // Volatile
624 {
Paul Sandoza7aff442016-04-13 15:05:48 +0200625 hs.get(TestAccessMode.SET_VOLATILE).invokeExact(array, i, false);
626 boolean x = (boolean) hs.get(TestAccessMode.GET_VOLATILE).invokeExact(array, i);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100627 assertEquals(x, false, "setVolatile boolean value");
628 }
629
630 // Lazy
631 {
Paul Sandoza7aff442016-04-13 15:05:48 +0200632 hs.get(TestAccessMode.SET_RELEASE).invokeExact(array, i, true);
633 boolean x = (boolean) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact(array, i);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100634 assertEquals(x, true, "setRelease boolean value");
635 }
636
637 // Opaque
638 {
Paul Sandoza7aff442016-04-13 15:05:48 +0200639 hs.get(TestAccessMode.SET_OPAQUE).invokeExact(array, i, false);
640 boolean x = (boolean) hs.get(TestAccessMode.GET_OPAQUE).invokeExact(array, i);
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100641 assertEquals(x, false, "setOpaque boolean value");
642 }
643
Aleksey Shipileve6632062016-06-15 11:20:15 +0300644 hs.get(TestAccessMode.SET).invokeExact(array, i, true);
645
646 // Compare
647 {
648 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(array, i, true, false);
649 assertEquals(r, true, "success compareAndSet boolean");
650 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
651 assertEquals(x, false, "success compareAndSet boolean value");
652 }
653
654 {
655 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(array, i, true, false);
656 assertEquals(r, false, "failing compareAndSet boolean");
657 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
658 assertEquals(x, false, "failing compareAndSet boolean value");
659 }
660
661 {
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200662 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(array, i, false, true);
663 assertEquals(r, false, "success compareAndExchange boolean");
Aleksey Shipileve6632062016-06-15 11:20:15 +0300664 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200665 assertEquals(x, true, "success compareAndExchange boolean value");
Aleksey Shipileve6632062016-06-15 11:20:15 +0300666 }
667
668 {
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200669 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(array, i, false, false);
670 assertEquals(r, true, "failing compareAndExchange boolean");
Aleksey Shipileve6632062016-06-15 11:20:15 +0300671 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
Paul Sandoz3f0273a2016-06-23 13:46:48 +0200672 assertEquals(x, true, "failing compareAndExchange boolean value");
Aleksey Shipileve6632062016-06-15 11:20:15 +0300673 }
674
675 {
676 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(array, i, true, false);
677 assertEquals(r, true, "success compareAndExchangeAcquire boolean");
678 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
679 assertEquals(x, false, "success compareAndExchangeAcquire boolean value");
680 }
681
682 {
683 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(array, i, true, false);
684 assertEquals(r, false, "failing compareAndExchangeAcquire boolean");
685 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
686 assertEquals(x, false, "failing compareAndExchangeAcquire boolean value");
687 }
688
689 {
690 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(array, i, false, true);
691 assertEquals(r, false, "success compareAndExchangeRelease boolean");
692 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
693 assertEquals(x, true, "success compareAndExchangeRelease boolean value");
694 }
695
696 {
697 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(array, i, false, false);
698 assertEquals(r, true, "failing compareAndExchangeRelease boolean");
699 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
700 assertEquals(x, true, "failing compareAndExchangeRelease boolean value");
701 }
702
703 {
704 boolean success = false;
705 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700706 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN).invokeExact(array, i, true, false);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300707 }
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700708 assertEquals(success, true, "weakCompareAndSetPlain boolean");
Aleksey Shipileve6632062016-06-15 11:20:15 +0300709 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700710 assertEquals(x, false, "weakCompareAndSetPlain boolean value");
Aleksey Shipileve6632062016-06-15 11:20:15 +0300711 }
712
713 {
714 boolean success = false;
715 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
716 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(array, i, false, true);
717 }
718 assertEquals(success, true, "weakCompareAndSetAcquire boolean");
719 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
720 assertEquals(x, true, "weakCompareAndSetAcquire boolean");
721 }
722
723 {
724 boolean success = false;
725 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
726 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(array, i, true, false);
727 }
728 assertEquals(success, true, "weakCompareAndSetRelease boolean");
729 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
730 assertEquals(x, false, "weakCompareAndSetRelease boolean");
731 }
732
733 {
734 boolean success = false;
735 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700736 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(array, i, false, true);
Aleksey Shipileve6632062016-06-15 11:20:15 +0300737 }
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700738 assertEquals(success, true, "weakCompareAndSet boolean");
Aleksey Shipileve6632062016-06-15 11:20:15 +0300739 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
Paul Sandoz3bd5ebe2016-09-01 13:56:13 -0700740 assertEquals(x, true, "weakCompareAndSet boolean");
Aleksey Shipileve6632062016-06-15 11:20:15 +0300741 }
742
743 // Compare set and get
744 {
Paul Sandoz82d48912016-09-01 10:16:57 -0700745 hs.get(TestAccessMode.SET).invokeExact(array, i, true);
746
Aleksey Shipileve6632062016-06-15 11:20:15 +0300747 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_SET).invokeExact(array, i, false);
748 assertEquals(o, true, "getAndSet boolean");
749 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
750 assertEquals(x, false, "getAndSet boolean value");
751 }
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100752
Paul Sandoz82d48912016-09-01 10:16:57 -0700753 {
754 hs.get(TestAccessMode.SET).invokeExact(array, i, true);
755
756 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_SET_ACQUIRE).invokeExact(array, i, false);
757 assertEquals(o, true, "getAndSetAcquire boolean");
758 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
759 assertEquals(x, false, "getAndSetAcquire boolean value");
760 }
761
762 {
763 hs.get(TestAccessMode.SET).invokeExact(array, i, true);
764
765 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_SET_RELEASE).invokeExact(array, i, false);
766 assertEquals(o, true, "getAndSetRelease boolean");
767 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
768 assertEquals(x, false, "getAndSetRelease boolean value");
769 }
770
771
772 // get and bitwise or
773 {
774 hs.get(TestAccessMode.SET).invokeExact(array, i, true);
775
776 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_OR).invokeExact(array, i, false);
777 assertEquals(o, true, "getAndBitwiseOr boolean");
778 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
779 assertEquals(x, (boolean)(true | false), "getAndBitwiseOr boolean value");
780 }
781
782 {
783 hs.get(TestAccessMode.SET).invokeExact(array, i, true);
784
785 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_OR_ACQUIRE).invokeExact(array, i, false);
786 assertEquals(o, true, "getAndBitwiseOrAcquire boolean");
787 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
788 assertEquals(x, (boolean)(true | false), "getAndBitwiseOrAcquire boolean value");
789 }
790
791 {
792 hs.get(TestAccessMode.SET).invokeExact(array, i, true);
793
794 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_OR_RELEASE).invokeExact(array, i, false);
795 assertEquals(o, true, "getAndBitwiseOrRelease boolean");
796 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
797 assertEquals(x, (boolean)(true | false), "getAndBitwiseOrRelease boolean value");
798 }
799
800 // get and bitwise and
801 {
802 hs.get(TestAccessMode.SET).invokeExact(array, i, true);
803
804 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_AND).invokeExact(array, i, false);
805 assertEquals(o, true, "getAndBitwiseAnd boolean");
806 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
807 assertEquals(x, (boolean)(true & false), "getAndBitwiseAnd boolean value");
808 }
809
810 {
811 hs.get(TestAccessMode.SET).invokeExact(array, i, true);
812
813 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_AND_ACQUIRE).invokeExact(array, i, false);
814 assertEquals(o, true, "getAndBitwiseAndAcquire boolean");
815 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
816 assertEquals(x, (boolean)(true & false), "getAndBitwiseAndAcquire boolean value");
817 }
818
819 {
820 hs.get(TestAccessMode.SET).invokeExact(array, i, true);
821
822 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_AND_RELEASE).invokeExact(array, i, false);
823 assertEquals(o, true, "getAndBitwiseAndRelease boolean");
824 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
825 assertEquals(x, (boolean)(true & false), "getAndBitwiseAndRelease boolean value");
826 }
827
828 // get and bitwise xor
829 {
830 hs.get(TestAccessMode.SET).invokeExact(array, i, true);
831
832 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_XOR).invokeExact(array, i, false);
833 assertEquals(o, true, "getAndBitwiseXor boolean");
834 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
835 assertEquals(x, (boolean)(true ^ false), "getAndBitwiseXor boolean value");
836 }
837
838 {
839 hs.get(TestAccessMode.SET).invokeExact(array, i, true);
840
841 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_XOR_ACQUIRE).invokeExact(array, i, false);
842 assertEquals(o, true, "getAndBitwiseXorAcquire boolean");
843 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
844 assertEquals(x, (boolean)(true ^ false), "getAndBitwiseXorAcquire boolean value");
845 }
846
847 {
848 hs.get(TestAccessMode.SET).invokeExact(array, i, true);
849
850 boolean o = (boolean) hs.get(TestAccessMode.GET_AND_BITWISE_XOR_RELEASE).invokeExact(array, i, false);
851 assertEquals(o, true, "getAndBitwiseXorRelease boolean");
852 boolean x = (boolean) hs.get(TestAccessMode.GET).invokeExact(array, i);
853 assertEquals(x, (boolean)(true ^ false), "getAndBitwiseXorRelease boolean value");
854 }
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100855 }
856 }
857
858 static void testArrayUnsupported(Handles hs) throws Throwable {
859 boolean[] array = new boolean[10];
860
861 final int i = 0;
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100862
Paul Sandoza7aff442016-04-13 15:05:48 +0200863 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_ADD)) {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100864 checkUOE(am, () -> {
865 boolean o = (boolean) hs.get(am).invokeExact(array, i, true);
866 });
867 }
Paul Sandoz82d48912016-09-01 10:16:57 -0700868
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100869 }
870
871 static void testArrayIndexOutOfBounds(Handles hs) throws Throwable {
872 boolean[] array = new boolean[10];
873
874 for (int i : new int[]{-1, Integer.MIN_VALUE, 10, 11, Integer.MAX_VALUE}) {
875 final int ci = i;
876
Paul Sandoza7aff442016-04-13 15:05:48 +0200877 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET)) {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100878 checkIOOBE(am, () -> {
879 boolean x = (boolean) hs.get(am).invokeExact(array, ci);
880 });
881 }
882
Paul Sandoza7aff442016-04-13 15:05:48 +0200883 for (TestAccessMode am : testAccessModesOfType(TestAccessType.SET)) {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100884 checkIOOBE(am, () -> {
885 hs.get(am).invokeExact(array, ci, true);
886 });
887 }
888
Aleksey Shipileve6632062016-06-15 11:20:15 +0300889 for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_SET)) {
890 checkIOOBE(am, () -> {
891 boolean r = (boolean) hs.get(am).invokeExact(array, ci, true, false);
892 });
893 }
894
895 for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_EXCHANGE)) {
896 checkIOOBE(am, () -> {
897 boolean r = (boolean) hs.get(am).invokeExact(array, ci, false, true);
898 });
899 }
900
901 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_SET)) {
902 checkIOOBE(am, () -> {
903 boolean o = (boolean) hs.get(am).invokeExact(array, ci, true);
904 });
905 }
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100906
Paul Sandoz82d48912016-09-01 10:16:57 -0700907
908 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_BITWISE)) {
909 checkIOOBE(am, () -> {
910 boolean o = (boolean) hs.get(am).invokeExact(array, ci, false);
911 });
912 }
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100913 }
914 }
915}
916