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