blob: bcc42a3c335578dde2c996b20bceaf4cce17c7e5 [file] [log] [blame]
Paul Sandoz9fb30a32016-03-24 11:21:21 +01001/*
2 * Copyright (c) 2015, 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=10 -Xint VarHandleTestAccessChar
27 * @run testng/othervm -Diters=20000 -XX:TieredStopAtLevel=1 VarHandleTestAccessChar
28 * @run testng/othervm -Diters=20000 VarHandleTestAccessChar
29 * @run testng/othervm -Diters=20000 -XX:-TieredCompilation VarHandleTestAccessChar
Paul Sandoz44afe202016-05-17 12:06:41 +020030 * @run testng/othervm -Diters=20000 -Djava.lang.invoke.VarHandle.VAR_HANDLE_GUARDS=false VarHandleTestAccessChar
Paul Sandoz9fb30a32016-03-24 11:21:21 +010031 */
32
33import org.testng.annotations.BeforeClass;
34import org.testng.annotations.DataProvider;
35import org.testng.annotations.Test;
36
37import java.lang.invoke.MethodHandles;
38import java.lang.invoke.VarHandle;
39import java.util.ArrayList;
40import java.util.Arrays;
41import java.util.List;
42
43import static org.testng.Assert.*;
44
45public class VarHandleTestAccessChar extends VarHandleBaseTest {
46 static final char static_final_v = 'a';
47
48 static char static_v;
49
50 final char final_v = 'a';
51
52 char v;
53
54 VarHandle vhFinalField;
55
56 VarHandle vhField;
57
58 VarHandle vhStaticField;
59
60 VarHandle vhStaticFinalField;
61
62 VarHandle vhArray;
63
64 @BeforeClass
65 public void setup() throws Exception {
66 vhFinalField = MethodHandles.lookup().findVarHandle(
67 VarHandleTestAccessChar.class, "final_v", char.class);
68
69 vhField = MethodHandles.lookup().findVarHandle(
70 VarHandleTestAccessChar.class, "v", char.class);
71
72 vhStaticFinalField = MethodHandles.lookup().findStaticVarHandle(
73 VarHandleTestAccessChar.class, "static_final_v", char.class);
74
75 vhStaticField = MethodHandles.lookup().findStaticVarHandle(
76 VarHandleTestAccessChar.class, "static_v", char.class);
77
78 vhArray = MethodHandles.arrayElementVarHandle(char[].class);
79 }
80
81
82 @DataProvider
83 public Object[][] varHandlesProvider() throws Exception {
84 List<VarHandle> vhs = new ArrayList<>();
85 vhs.add(vhField);
86 vhs.add(vhStaticField);
87 vhs.add(vhArray);
88
89 return vhs.stream().map(tc -> new Object[]{tc}).toArray(Object[][]::new);
90 }
91
92 @Test(dataProvider = "varHandlesProvider")
93 public void testIsAccessModeSupported(VarHandle vh) {
Paul Sandoza7aff442016-04-13 15:05:48 +020094 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET));
95 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET));
96 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_VOLATILE));
97 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET_VOLATILE));
98 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_ACQUIRE));
99 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET_RELEASE));
100 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_OPAQUE));
101 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET_OPAQUE));
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100102
Paul Sandoza7aff442016-04-13 15:05:48 +0200103 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_SET));
104 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_VOLATILE));
105 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_ACQUIRE));
106 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_RELEASE));
107 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET));
Paul Sandoze9556602016-04-29 13:46:19 -0700108 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_VOLATILE));
Paul Sandoza7aff442016-04-13 15:05:48 +0200109 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE));
110 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE));
Paul Sandoza7aff442016-04-13 15:05:48 +0200111 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET));
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100112
Paul Sandoza7aff442016-04-13 15:05:48 +0200113 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD));
114 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.ADD_AND_GET));
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100115 }
116
117
118 @DataProvider
119 public Object[][] typesProvider() throws Exception {
120 List<Object[]> types = new ArrayList<>();
121 types.add(new Object[] {vhField, Arrays.asList(VarHandleTestAccessChar.class)});
122 types.add(new Object[] {vhStaticField, Arrays.asList()});
123 types.add(new Object[] {vhArray, Arrays.asList(char[].class, int.class)});
124
125 return types.stream().toArray(Object[][]::new);
126 }
127
128 @Test(dataProvider = "typesProvider")
129 public void testTypes(VarHandle vh, List<Class<?>> pts) {
130 assertEquals(vh.varType(), char.class);
131
132 assertEquals(vh.coordinateTypes(), pts);
133
134 testTypes(vh);
135 }
136
137
138 @Test
139 public void testLookupInstanceToStatic() {
140 checkIAE("Lookup of static final field to instance final field", () -> {
141 MethodHandles.lookup().findStaticVarHandle(
142 VarHandleTestAccessChar.class, "final_v", char.class);
143 });
144
145 checkIAE("Lookup of static field to instance field", () -> {
146 MethodHandles.lookup().findStaticVarHandle(
147 VarHandleTestAccessChar.class, "v", char.class);
148 });
149 }
150
151 @Test
152 public void testLookupStaticToInstance() {
153 checkIAE("Lookup of instance final field to static final field", () -> {
154 MethodHandles.lookup().findVarHandle(
155 VarHandleTestAccessChar.class, "static_final_v", char.class);
156 });
157
158 checkIAE("Lookup of instance field to static field", () -> {
159 vhStaticField = MethodHandles.lookup().findVarHandle(
160 VarHandleTestAccessChar.class, "static_v", char.class);
161 });
162 }
163
164
165 @DataProvider
166 public Object[][] accessTestCaseProvider() throws Exception {
167 List<AccessTestCase<?>> cases = new ArrayList<>();
168
169 cases.add(new VarHandleAccessTestCase("Instance final field",
170 vhFinalField, vh -> testInstanceFinalField(this, vh)));
171 cases.add(new VarHandleAccessTestCase("Instance final field unsupported",
172 vhFinalField, vh -> testInstanceFinalFieldUnsupported(this, vh),
173 false));
174
175 cases.add(new VarHandleAccessTestCase("Static final field",
176 vhStaticFinalField, VarHandleTestAccessChar::testStaticFinalField));
177 cases.add(new VarHandleAccessTestCase("Static final field unsupported",
178 vhStaticFinalField, VarHandleTestAccessChar::testStaticFinalFieldUnsupported,
179 false));
180
181 cases.add(new VarHandleAccessTestCase("Instance field",
182 vhField, vh -> testInstanceField(this, vh)));
183 cases.add(new VarHandleAccessTestCase("Instance field unsupported",
184 vhField, vh -> testInstanceFieldUnsupported(this, vh),
185 false));
186
187 cases.add(new VarHandleAccessTestCase("Static field",
188 vhStaticField, VarHandleTestAccessChar::testStaticField));
189 cases.add(new VarHandleAccessTestCase("Static field unsupported",
190 vhStaticField, VarHandleTestAccessChar::testStaticFieldUnsupported,
191 false));
192
193 cases.add(new VarHandleAccessTestCase("Array",
194 vhArray, VarHandleTestAccessChar::testArray));
195 cases.add(new VarHandleAccessTestCase("Array unsupported",
196 vhArray, VarHandleTestAccessChar::testArrayUnsupported,
197 false));
198 cases.add(new VarHandleAccessTestCase("Array index out of bounds",
199 vhArray, VarHandleTestAccessChar::testArrayIndexOutOfBounds,
200 false));
201
202 // Work around issue with jtreg summary reporting which truncates
203 // the String result of Object.toString to 30 characters, hence
204 // the first dummy argument
205 return cases.stream().map(tc -> new Object[]{tc.toString(), tc}).toArray(Object[][]::new);
206 }
207
208 @Test(dataProvider = "accessTestCaseProvider")
209 public <T> void testAccess(String desc, AccessTestCase<T> atc) throws Throwable {
210 T t = atc.get();
211 int iters = atc.requiresLoop() ? ITERS : 1;
212 for (int c = 0; c < iters; c++) {
213 atc.testAccess(t);
214 }
215 }
216
217
218
219
220 static void testInstanceFinalField(VarHandleTestAccessChar recv, VarHandle vh) {
221 // Plain
222 {
223 char x = (char) vh.get(recv);
224 assertEquals(x, 'a', "get char value");
225 }
226
227
228 // Volatile
229 {
230 char x = (char) vh.getVolatile(recv);
231 assertEquals(x, 'a', "getVolatile char value");
232 }
233
234 // Lazy
235 {
236 char x = (char) vh.getAcquire(recv);
237 assertEquals(x, 'a', "getRelease char value");
238 }
239
240 // Opaque
241 {
242 char x = (char) vh.getOpaque(recv);
243 assertEquals(x, 'a', "getOpaque char value");
244 }
245 }
246
247 static void testInstanceFinalFieldUnsupported(VarHandleTestAccessChar recv, VarHandle vh) {
248 checkUOE(() -> {
249 vh.set(recv, 'b');
250 });
251
252 checkUOE(() -> {
253 vh.setVolatile(recv, 'b');
254 });
255
256 checkUOE(() -> {
257 vh.setRelease(recv, 'b');
258 });
259
260 checkUOE(() -> {
261 vh.setOpaque(recv, 'b');
262 });
263
264 checkUOE(() -> {
265 boolean r = vh.compareAndSet(recv, 'a', 'b');
266 });
267
268 checkUOE(() -> {
269 char r = (char) vh.compareAndExchangeVolatile(recv, 'a', 'b');
270 });
271
272 checkUOE(() -> {
273 char r = (char) vh.compareAndExchangeAcquire(recv, 'a', 'b');
274 });
275
276 checkUOE(() -> {
277 char r = (char) vh.compareAndExchangeRelease(recv, 'a', 'b');
278 });
279
280 checkUOE(() -> {
281 boolean r = vh.weakCompareAndSet(recv, 'a', 'b');
282 });
283
284 checkUOE(() -> {
Paul Sandoze9556602016-04-29 13:46:19 -0700285 boolean r = vh.weakCompareAndSetVolatile(recv, 'a', 'b');
286 });
287
288 checkUOE(() -> {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100289 boolean r = vh.weakCompareAndSetAcquire(recv, 'a', 'b');
290 });
291
292 checkUOE(() -> {
293 boolean r = vh.weakCompareAndSetRelease(recv, 'a', 'b');
294 });
295
296 checkUOE(() -> {
Paul Sandoz44afe202016-05-17 12:06:41 +0200297 char r = (char) vh.getAndSet(recv, 'a');
298 });
299
300 checkUOE(() -> {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100301 char o = (char) vh.getAndAdd(recv, 'a');
302 });
303
304 checkUOE(() -> {
305 char o = (char) vh.addAndGet(recv, 'a');
306 });
307 }
308
309
310 static void testStaticFinalField(VarHandle vh) {
311 // Plain
312 {
313 char x = (char) vh.get();
314 assertEquals(x, 'a', "get char value");
315 }
316
317
318 // Volatile
319 {
320 char x = (char) vh.getVolatile();
321 assertEquals(x, 'a', "getVolatile char value");
322 }
323
324 // Lazy
325 {
326 char x = (char) vh.getAcquire();
327 assertEquals(x, 'a', "getRelease char value");
328 }
329
330 // Opaque
331 {
332 char x = (char) vh.getOpaque();
333 assertEquals(x, 'a', "getOpaque char value");
334 }
335 }
336
337 static void testStaticFinalFieldUnsupported(VarHandle vh) {
338 checkUOE(() -> {
339 vh.set('b');
340 });
341
342 checkUOE(() -> {
343 vh.setVolatile('b');
344 });
345
346 checkUOE(() -> {
347 vh.setRelease('b');
348 });
349
350 checkUOE(() -> {
351 vh.setOpaque('b');
352 });
353
354 checkUOE(() -> {
355 boolean r = vh.compareAndSet('a', 'b');
356 });
357
358 checkUOE(() -> {
359 char r = (char) vh.compareAndExchangeVolatile('a', 'b');
360 });
361
362 checkUOE(() -> {
363 char r = (char) vh.compareAndExchangeAcquire('a', 'b');
364 });
365
366 checkUOE(() -> {
367 char r = (char) vh.compareAndExchangeRelease('a', 'b');
368 });
369
370 checkUOE(() -> {
371 boolean r = vh.weakCompareAndSet('a', 'b');
372 });
373
374 checkUOE(() -> {
Paul Sandoze9556602016-04-29 13:46:19 -0700375 boolean r = vh.weakCompareAndSetVolatile('a', 'b');
376 });
377
378 checkUOE(() -> {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100379 boolean r = vh.weakCompareAndSetAcquire('a', 'b');
380 });
381
382 checkUOE(() -> {
383 boolean r = vh.weakCompareAndSetRelease('a', 'b');
384 });
385
386 checkUOE(() -> {
Paul Sandoz44afe202016-05-17 12:06:41 +0200387 char r = (char) vh.getAndSet('a');
388 });
389
390 checkUOE(() -> {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100391 char o = (char) vh.getAndAdd('a');
392 });
393
394 checkUOE(() -> {
395 char o = (char) vh.addAndGet('a');
396 });
397 }
398
399
400 static void testInstanceField(VarHandleTestAccessChar recv, VarHandle vh) {
401 // Plain
402 {
403 vh.set(recv, 'a');
404 char x = (char) vh.get(recv);
405 assertEquals(x, 'a', "set char value");
406 }
407
408
409 // Volatile
410 {
411 vh.setVolatile(recv, 'b');
412 char x = (char) vh.getVolatile(recv);
413 assertEquals(x, 'b', "setVolatile char value");
414 }
415
416 // Lazy
417 {
418 vh.setRelease(recv, 'a');
419 char x = (char) vh.getAcquire(recv);
420 assertEquals(x, 'a', "setRelease char value");
421 }
422
423 // Opaque
424 {
425 vh.setOpaque(recv, 'b');
426 char x = (char) vh.getOpaque(recv);
427 assertEquals(x, 'b', "setOpaque char value");
428 }
429
430
431 }
432
433 static void testInstanceFieldUnsupported(VarHandleTestAccessChar recv, VarHandle vh) {
434 checkUOE(() -> {
435 boolean r = vh.compareAndSet(recv, 'a', 'b');
436 });
437
438 checkUOE(() -> {
439 char r = (char) vh.compareAndExchangeVolatile(recv, 'a', 'b');
440 });
441
442 checkUOE(() -> {
443 char r = (char) vh.compareAndExchangeAcquire(recv, 'a', 'b');
444 });
445
446 checkUOE(() -> {
447 char r = (char) vh.compareAndExchangeRelease(recv, 'a', 'b');
448 });
449
450 checkUOE(() -> {
451 boolean r = vh.weakCompareAndSet(recv, 'a', 'b');
452 });
453
454 checkUOE(() -> {
Paul Sandoze9556602016-04-29 13:46:19 -0700455 boolean r = vh.weakCompareAndSetVolatile(recv, 'a', 'b');
456 });
457
458 checkUOE(() -> {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100459 boolean r = vh.weakCompareAndSetAcquire(recv, 'a', 'b');
460 });
461
462 checkUOE(() -> {
463 boolean r = vh.weakCompareAndSetRelease(recv, 'a', 'b');
464 });
465
466 checkUOE(() -> {
Paul Sandoz44afe202016-05-17 12:06:41 +0200467 char r = (char) vh.getAndSet(recv, 'a');
468 });
469
470 checkUOE(() -> {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100471 char o = (char) vh.getAndAdd(recv, 'a');
472 });
473
474 checkUOE(() -> {
475 char o = (char) vh.addAndGet(recv, 'a');
476 });
477 }
478
479
480 static void testStaticField(VarHandle vh) {
481 // Plain
482 {
483 vh.set('a');
484 char x = (char) vh.get();
485 assertEquals(x, 'a', "set char value");
486 }
487
488
489 // Volatile
490 {
491 vh.setVolatile('b');
492 char x = (char) vh.getVolatile();
493 assertEquals(x, 'b', "setVolatile char value");
494 }
495
496 // Lazy
497 {
498 vh.setRelease('a');
499 char x = (char) vh.getAcquire();
500 assertEquals(x, 'a', "setRelease char value");
501 }
502
503 // Opaque
504 {
505 vh.setOpaque('b');
506 char x = (char) vh.getOpaque();
507 assertEquals(x, 'b', "setOpaque char value");
508 }
509
510
511 }
512
513 static void testStaticFieldUnsupported(VarHandle vh) {
514 checkUOE(() -> {
515 boolean r = vh.compareAndSet('a', 'b');
516 });
517
518 checkUOE(() -> {
519 char r = (char) vh.compareAndExchangeVolatile('a', 'b');
520 });
521
522 checkUOE(() -> {
523 char r = (char) vh.compareAndExchangeAcquire('a', 'b');
524 });
525
526 checkUOE(() -> {
527 char r = (char) vh.compareAndExchangeRelease('a', 'b');
528 });
529
530 checkUOE(() -> {
531 boolean r = vh.weakCompareAndSet('a', 'b');
532 });
533
534 checkUOE(() -> {
Paul Sandoze9556602016-04-29 13:46:19 -0700535 boolean r = vh.weakCompareAndSetVolatile('a', 'b');
536 });
537
538 checkUOE(() -> {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100539 boolean r = vh.weakCompareAndSetAcquire('a', 'b');
540 });
541
542 checkUOE(() -> {
543 boolean r = vh.weakCompareAndSetRelease('a', 'b');
544 });
545
546 checkUOE(() -> {
Paul Sandoz44afe202016-05-17 12:06:41 +0200547 char r = (char) vh.getAndSet('a');
548 });
549
550 checkUOE(() -> {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100551 char o = (char) vh.getAndAdd('a');
552 });
553
554 checkUOE(() -> {
555 char o = (char) vh.addAndGet('a');
556 });
557 }
558
559
560 static void testArray(VarHandle vh) {
561 char[] array = new char[10];
562
563 for (int i = 0; i < array.length; i++) {
564 // Plain
565 {
566 vh.set(array, i, 'a');
567 char x = (char) vh.get(array, i);
568 assertEquals(x, 'a', "get char value");
569 }
570
571
572 // Volatile
573 {
574 vh.setVolatile(array, i, 'b');
575 char x = (char) vh.getVolatile(array, i);
576 assertEquals(x, 'b', "setVolatile char value");
577 }
578
579 // Lazy
580 {
581 vh.setRelease(array, i, 'a');
582 char x = (char) vh.getAcquire(array, i);
583 assertEquals(x, 'a', "setRelease char value");
584 }
585
586 // Opaque
587 {
588 vh.setOpaque(array, i, 'b');
589 char x = (char) vh.getOpaque(array, i);
590 assertEquals(x, 'b', "setOpaque char value");
591 }
592
593
594 }
595 }
596
597 static void testArrayUnsupported(VarHandle vh) {
598 char[] array = new char[10];
599
600 int i = 0;
601 checkUOE(() -> {
602 boolean r = vh.compareAndSet(array, i, 'a', 'b');
603 });
604
605 checkUOE(() -> {
606 char r = (char) vh.compareAndExchangeVolatile(array, i, 'a', 'b');
607 });
608
609 checkUOE(() -> {
610 char r = (char) vh.compareAndExchangeAcquire(array, i, 'a', 'b');
611 });
612
613 checkUOE(() -> {
614 char r = (char) vh.compareAndExchangeRelease(array, i, 'a', 'b');
615 });
616
617 checkUOE(() -> {
618 boolean r = vh.weakCompareAndSet(array, i, 'a', 'b');
619 });
620
621 checkUOE(() -> {
Paul Sandoze9556602016-04-29 13:46:19 -0700622 boolean r = vh.weakCompareAndSetVolatile(array, i, 'a', 'b');
623 });
624
625 checkUOE(() -> {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100626 boolean r = vh.weakCompareAndSetAcquire(array, i, 'a', 'b');
627 });
628
629 checkUOE(() -> {
630 boolean r = vh.weakCompareAndSetRelease(array, i, 'a', 'b');
631 });
632
633 checkUOE(() -> {
Paul Sandoz44afe202016-05-17 12:06:41 +0200634 char r = (char) vh.getAndSet(array, i, 'a');
635 });
636
637 checkUOE(() -> {
Paul Sandoz9fb30a32016-03-24 11:21:21 +0100638 char o = (char) vh.getAndAdd(array, i, 'a');
639 });
640
641 checkUOE(() -> {
642 char o = (char) vh.addAndGet(array, i, 'a');
643 });
644 }
645
646 static void testArrayIndexOutOfBounds(VarHandle vh) throws Throwable {
647 char[] array = new char[10];
648
649 for (int i : new int[]{-1, Integer.MIN_VALUE, 10, 11, Integer.MAX_VALUE}) {
650 final int ci = i;
651
652 checkIOOBE(() -> {
653 char x = (char) vh.get(array, ci);
654 });
655
656 checkIOOBE(() -> {
657 vh.set(array, ci, 'a');
658 });
659
660 checkIOOBE(() -> {
661 char x = (char) vh.getVolatile(array, ci);
662 });
663
664 checkIOOBE(() -> {
665 vh.setVolatile(array, ci, 'a');
666 });
667
668 checkIOOBE(() -> {
669 char x = (char) vh.getAcquire(array, ci);
670 });
671
672 checkIOOBE(() -> {
673 vh.setRelease(array, ci, 'a');
674 });
675
676 checkIOOBE(() -> {
677 char x = (char) vh.getOpaque(array, ci);
678 });
679
680 checkIOOBE(() -> {
681 vh.setOpaque(array, ci, 'a');
682 });
683
684
685 }
686 }
687}
688