1 /*
2 * Copyright (c) 2015, 2024, 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 // -- This file was mechanically generated: Do not edit! -- //
25
26 /*
27 * @test
28 * @comment Set CompileThresholdScaling to 0.1 so that the warmup loop sets to 2000 iterations
29 * to hit compilation thresholds
30 * @run testng/othervm -Diters=2000 -XX:CompileThresholdScaling=0.1 VarHandleTestMethodHandleAccessString
31 */
32
33 import org.testng.annotations.BeforeClass;
34 import org.testng.annotations.DataProvider;
35 import org.testng.annotations.Test;
36
37 import java.lang.invoke.MethodHandle;
38 import java.lang.invoke.MethodHandles;
39 import java.lang.invoke.VarHandle;
40 import java.util.ArrayList;
41 import java.util.Arrays;
42 import java.util.List;
43
44 import static org.testng.Assert.*;
45
46 public class VarHandleTestMethodHandleAccessString extends VarHandleBaseTest {
47 static final String static_final_v = "foo";
48
49 static String static_v;
50
51 final String final_v = "foo";
52
53 String v;
54
55 VarHandle vhFinalField;
56
57 VarHandle vhField;
58
59 VarHandle vhStaticField;
60
61 VarHandle vhStaticFinalField;
62
63 VarHandle vhArray;
64
65 @BeforeClass
66 public void setup() throws Exception {
67 vhFinalField = MethodHandles.lookup().findVarHandle(
68 VarHandleTestMethodHandleAccessString.class, "final_v", String.class);
69
70 vhField = MethodHandles.lookup().findVarHandle(
71 VarHandleTestMethodHandleAccessString.class, "v", String.class);
72
73 vhStaticFinalField = MethodHandles.lookup().findStaticVarHandle(
74 VarHandleTestMethodHandleAccessString.class, "static_final_v", String.class);
75
76 vhStaticField = MethodHandles.lookup().findStaticVarHandle(
77 VarHandleTestMethodHandleAccessString.class, "static_v", String.class);
78
79 vhArray = MethodHandles.arrayElementVarHandle(String[].class);
80 }
81
82
83 @DataProvider
84 public Object[][] accessTestCaseProvider() throws Exception {
85 List<AccessTestCase<?>> cases = new ArrayList<>();
86
87 for (VarHandleToMethodHandle f : VarHandleToMethodHandle.values()) {
88 cases.add(new MethodHandleAccessTestCase("Instance field",
89 vhField, f, hs -> testInstanceField(this, hs)));
90 cases.add(new MethodHandleAccessTestCase("Instance field unsupported",
91 vhField, f, hs -> testInstanceFieldUnsupported(this, hs),
92 false));
93
94 cases.add(new MethodHandleAccessTestCase("Static field",
95 vhStaticField, f, VarHandleTestMethodHandleAccessString::testStaticField));
96 cases.add(new MethodHandleAccessTestCase("Static field unsupported",
97 vhStaticField, f, VarHandleTestMethodHandleAccessString::testStaticFieldUnsupported,
98 false));
99
100 cases.add(new MethodHandleAccessTestCase("Array",
101 vhArray, f, VarHandleTestMethodHandleAccessString::testArray));
102 cases.add(new MethodHandleAccessTestCase("Array unsupported",
103 vhArray, f, VarHandleTestMethodHandleAccessString::testArrayUnsupported,
104 false));
105 cases.add(new MethodHandleAccessTestCase("Array index out of bounds",
106 vhArray, f, VarHandleTestMethodHandleAccessString::testArrayIndexOutOfBounds,
107 false));
108 }
109
110 // Work around issue with jtreg summary reporting which truncates
111 // the String result of Object.toString to 30 characters, hence
112 // the first dummy argument
113 return cases.stream().map(tc -> new Object[]{tc.toString(), tc}).toArray(Object[][]::new);
114 }
115
116 @Test(dataProvider = "accessTestCaseProvider")
117 public <T> void testAccess(String desc, AccessTestCase<T> atc) throws Throwable {
118 T t = atc.get();
119 int iters = atc.requiresLoop() ? ITERS : 1;
120 for (int c = 0; c < iters; c++) {
121 atc.testAccess(t);
122 }
123 }
124
125
126 static void testInstanceField(VarHandleTestMethodHandleAccessString recv, Handles hs) throws Throwable {
127 // Plain
128 {
129 hs.get(TestAccessMode.SET).invokeExact(recv, "foo");
130 String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv);
131 assertEquals(x, "foo", "set String value");
132 }
133
134
135 // Volatile
136 {
137 hs.get(TestAccessMode.SET_VOLATILE).invokeExact(recv, "bar");
138 String x = (String) hs.get(TestAccessMode.GET_VOLATILE).invokeExact(recv);
139 assertEquals(x, "bar", "setVolatile String value");
140 }
141
142 // Lazy
143 {
144 hs.get(TestAccessMode.SET_RELEASE).invokeExact(recv, "foo");
145 String x = (String) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact(recv);
146 assertEquals(x, "foo", "setRelease String value");
147 }
148
149 // Opaque
150 {
151 hs.get(TestAccessMode.SET_OPAQUE).invokeExact(recv, "bar");
152 String x = (String) hs.get(TestAccessMode.GET_OPAQUE).invokeExact(recv);
153 assertEquals(x, "bar", "setOpaque String value");
154 }
155
156 hs.get(TestAccessMode.SET).invokeExact(recv, "foo");
157
158 // Compare
159 {
160 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(recv, "foo", "bar");
161 assertEquals(r, true, "success compareAndSet String");
162 String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv);
163 assertEquals(x, "bar", "success compareAndSet String value");
164 }
165
166 {
167 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(recv, "foo", "baz");
168 assertEquals(r, false, "failing compareAndSet String");
169 String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv);
170 assertEquals(x, "bar", "failing compareAndSet String value");
171 }
172
173 {
174 String r = (String) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(recv, "bar", "foo");
175 assertEquals(r, "bar", "success compareAndExchange String");
176 String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv);
177 assertEquals(x, "foo", "success compareAndExchange String value");
178 }
179
180 {
181 String r = (String) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(recv, "bar", "baz");
182 assertEquals(r, "foo", "failing compareAndExchange String");
183 String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv);
184 assertEquals(x, "foo", "failing compareAndExchange String value");
185 }
186
187 {
188 String r = (String) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(recv, "foo", "bar");
189 assertEquals(r, "foo", "success compareAndExchangeAcquire String");
190 String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv);
191 assertEquals(x, "bar", "success compareAndExchangeAcquire String value");
192 }
193
194 {
195 String r = (String) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(recv, "foo", "baz");
196 assertEquals(r, "bar", "failing compareAndExchangeAcquire String");
197 String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv);
198 assertEquals(x, "bar", "failing compareAndExchangeAcquire String value");
199 }
200
201 {
202 String r = (String) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(recv, "bar", "foo");
203 assertEquals(r, "bar", "success compareAndExchangeRelease String");
204 String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv);
205 assertEquals(x, "foo", "success compareAndExchangeRelease String value");
206 }
207
208 {
209 String r = (String) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(recv, "bar", "baz");
210 assertEquals(r, "foo", "failing compareAndExchangeRelease String");
211 String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv);
212 assertEquals(x, "foo", "failing compareAndExchangeRelease String value");
213 }
214
215 {
216 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN);
217 boolean success = false;
218 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
219 success = (boolean) mh.invokeExact(recv, "foo", "bar");
220 if (!success) weakDelay();
221 }
222 assertEquals(success, true, "success weakCompareAndSetPlain String");
223 String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv);
224 assertEquals(x, "bar", "success weakCompareAndSetPlain String value");
225 }
226
227 {
228 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN).invokeExact(recv, "foo", "baz");
229 assertEquals(success, false, "failing weakCompareAndSetPlain String");
230 String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv);
231 assertEquals(x, "bar", "failing weakCompareAndSetPlain String value");
232 }
233
234 {
235 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE);
236 boolean success = false;
237 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
238 success = (boolean) mh.invokeExact(recv, "bar", "foo");
239 if (!success) weakDelay();
240 }
241 assertEquals(success, true, "success weakCompareAndSetAcquire String");
242 String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv);
243 assertEquals(x, "foo", "success weakCompareAndSetAcquire String");
244 }
245
246 {
247 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(recv, "bar", "baz");
248 assertEquals(success, false, "failing weakCompareAndSetAcquire String");
249 String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv);
250 assertEquals(x, "foo", "failing weakCompareAndSetAcquire String value");
251 }
252
253 {
254 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE);
255 boolean success = false;
256 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
257 success = (boolean) mh.invokeExact(recv, "foo", "bar");
258 if (!success) weakDelay();
259 }
260 assertEquals(success, true, "success weakCompareAndSetRelease String");
261 String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv);
262 assertEquals(x, "bar", "success weakCompareAndSetRelease String");
263 }
264
265 {
266 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(recv, "foo", "baz");
267 assertEquals(success, false, "failing weakCompareAndSetRelease String");
268 String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv);
269 assertEquals(x, "bar", "failing weakCompareAndSetRelease String value");
270 }
271
272 {
273 boolean success = false;
274 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET);
275 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
276 success = (boolean) mh.invokeExact(recv, "bar", "foo");
277 if (!success) weakDelay();
278 }
279 assertEquals(success, true, "success weakCompareAndSet String");
280 String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv);
281 assertEquals(x, "foo", "success weakCompareAndSet String");
282 }
283
284 {
285 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(recv, "bar", "baz");
286 assertEquals(success, false, "failing weakCompareAndSet String");
287 String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv);
288 assertEquals(x, "foo", "failing weakCompareAndSet String value");
289 }
290
291 // Compare set and get
292 {
293 String o = (String) hs.get(TestAccessMode.GET_AND_SET).invokeExact(recv, "bar");
294 assertEquals(o, "foo", "getAndSet String");
295 String x = (String) hs.get(TestAccessMode.GET).invokeExact(recv);
296 assertEquals(x, "bar", "getAndSet String value");
297 }
298
299
300 }
301
302 static void testInstanceFieldUnsupported(VarHandleTestMethodHandleAccessString recv, Handles hs) throws Throwable {
303
304 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_ADD)) {
305 checkUOE(am, () -> {
306 String r = (String) hs.get(am).invokeExact(recv, "foo");
307 });
308 }
309
310 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_BITWISE)) {
311 checkUOE(am, () -> {
312 String r = (String) hs.get(am).invokeExact(recv, "foo");
313 });
314 }
315 }
316
317
318 static void testStaticField(Handles hs) throws Throwable {
319 // Plain
320 {
321 hs.get(TestAccessMode.SET).invokeExact("foo");
322 String x = (String) hs.get(TestAccessMode.GET).invokeExact();
323 assertEquals(x, "foo", "set String value");
324 }
325
326
327 // Volatile
328 {
329 hs.get(TestAccessMode.SET_VOLATILE).invokeExact("bar");
330 String x = (String) hs.get(TestAccessMode.GET_VOLATILE).invokeExact();
331 assertEquals(x, "bar", "setVolatile String value");
332 }
333
334 // Lazy
335 {
336 hs.get(TestAccessMode.SET_RELEASE).invokeExact("foo");
337 String x = (String) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact();
338 assertEquals(x, "foo", "setRelease String value");
339 }
340
341 // Opaque
342 {
343 hs.get(TestAccessMode.SET_OPAQUE).invokeExact("bar");
344 String x = (String) hs.get(TestAccessMode.GET_OPAQUE).invokeExact();
345 assertEquals(x, "bar", "setOpaque String value");
346 }
347
348 hs.get(TestAccessMode.SET).invokeExact("foo");
349
350 // Compare
351 {
352 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact("foo", "bar");
353 assertEquals(r, true, "success compareAndSet String");
354 String x = (String) hs.get(TestAccessMode.GET).invokeExact();
355 assertEquals(x, "bar", "success compareAndSet String value");
356 }
357
358 {
359 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact("foo", "baz");
360 assertEquals(r, false, "failing compareAndSet String");
361 String x = (String) hs.get(TestAccessMode.GET).invokeExact();
362 assertEquals(x, "bar", "failing compareAndSet String value");
363 }
364
365 {
366 String r = (String) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact("bar", "foo");
367 assertEquals(r, "bar", "success compareAndExchange String");
368 String x = (String) hs.get(TestAccessMode.GET).invokeExact();
369 assertEquals(x, "foo", "success compareAndExchange String value");
370 }
371
372 {
373 String r = (String) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact("bar", "baz");
374 assertEquals(r, "foo", "failing compareAndExchange String");
375 String x = (String) hs.get(TestAccessMode.GET).invokeExact();
376 assertEquals(x, "foo", "failing compareAndExchange String value");
377 }
378
379 {
380 String r = (String) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact("foo", "bar");
381 assertEquals(r, "foo", "success compareAndExchangeAcquire String");
382 String x = (String) hs.get(TestAccessMode.GET).invokeExact();
383 assertEquals(x, "bar", "success compareAndExchangeAcquire String value");
384 }
385
386 {
387 String r = (String) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact("foo", "baz");
388 assertEquals(r, "bar", "failing compareAndExchangeAcquire String");
389 String x = (String) hs.get(TestAccessMode.GET).invokeExact();
390 assertEquals(x, "bar", "failing compareAndExchangeAcquire String value");
391 }
392
393 {
394 String r = (String) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact("bar", "foo");
395 assertEquals(r, "bar", "success compareAndExchangeRelease String");
396 String x = (String) hs.get(TestAccessMode.GET).invokeExact();
397 assertEquals(x, "foo", "success compareAndExchangeRelease String value");
398 }
399
400 {
401 String r = (String) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact("bar", "baz");
402 assertEquals(r, "foo", "failing compareAndExchangeRelease String");
403 String x = (String) hs.get(TestAccessMode.GET).invokeExact();
404 assertEquals(x, "foo", "failing compareAndExchangeRelease String value");
405 }
406
407 {
408 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN);
409 boolean success = false;
410 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
411 success = (boolean) mh.invokeExact("foo", "bar");
412 if (!success) weakDelay();
413 }
414 assertEquals(success, true, "success weakCompareAndSetPlain String");
415 String x = (String) hs.get(TestAccessMode.GET).invokeExact();
416 assertEquals(x, "bar", "success weakCompareAndSetPlain String value");
417 }
418
419 {
420 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN).invokeExact("foo", "baz");
421 assertEquals(success, false, "failing weakCompareAndSetPlain String");
422 String x = (String) hs.get(TestAccessMode.GET).invokeExact();
423 assertEquals(x, "bar", "failing weakCompareAndSetPlain String value");
424 }
425
426 {
427 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE);
428 boolean success = false;
429 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
430 success = (boolean) mh.invokeExact("bar", "foo");
431 if (!success) weakDelay();
432 }
433 assertEquals(success, true, "success weakCompareAndSetAcquire String");
434 String x = (String) hs.get(TestAccessMode.GET).invokeExact();
435 assertEquals(x, "foo", "success weakCompareAndSetAcquire String");
436 }
437
438 {
439 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE);
440 boolean success = (boolean) mh.invokeExact("bar", "baz");
441 assertEquals(success, false, "failing weakCompareAndSetAcquire String");
442 String x = (String) hs.get(TestAccessMode.GET).invokeExact();
443 assertEquals(x, "foo", "failing weakCompareAndSetAcquire String value");
444 }
445
446 {
447 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE);
448 boolean success = false;
449 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
450 success = (boolean) mh.invokeExact("foo", "bar");
451 if (!success) weakDelay();
452 }
453 assertEquals(success, true, "success weakCompareAndSetRelease String");
454 String x = (String) hs.get(TestAccessMode.GET).invokeExact();
455 assertEquals(x, "bar", "success weakCompareAndSetRelease String");
456 }
457
458 {
459 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact("foo", "baz");
460 assertEquals(success, false, "failing weakCompareAndSetRelease String");
461 String x = (String) hs.get(TestAccessMode.GET).invokeExact();
462 assertEquals(x, "bar", "failing weakCompareAndSetRelease String value");
463 }
464
465 {
466 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET);
467 boolean success = false;
468 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
469 success = (boolean) mh.invokeExact("bar", "foo");
470 if (!success) weakDelay();
471 }
472 assertEquals(success, true, "success weakCompareAndSet String");
473 String x = (String) hs.get(TestAccessMode.GET).invokeExact();
474 assertEquals(x, "foo", "success weakCompareAndSet String");
475 }
476
477 {
478 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact("bar", "baz");
479 assertEquals(success, false, "failing weakCompareAndSet String");
480 String x = (String) hs.get(TestAccessMode.GET).invokeExact();
481 assertEquals(x, "foo", "failing weakCompareAndSetRe String value");
482 }
483
484 // Compare set and get
485 {
486 hs.get(TestAccessMode.SET).invokeExact("foo");
487
488 String o = (String) hs.get(TestAccessMode.GET_AND_SET).invokeExact("bar");
489 assertEquals(o, "foo", "getAndSet String");
490 String x = (String) hs.get(TestAccessMode.GET).invokeExact();
491 assertEquals(x, "bar", "getAndSet String value");
492 }
493
494 // Compare set and get
495 {
496 hs.get(TestAccessMode.SET).invokeExact("foo");
497
498 String o = (String) hs.get(TestAccessMode.GET_AND_SET_ACQUIRE).invokeExact("bar");
499 assertEquals(o, "foo", "getAndSetAcquire String");
500 String x = (String) hs.get(TestAccessMode.GET).invokeExact();
501 assertEquals(x, "bar", "getAndSetAcquire String value");
502 }
503
504 // Compare set and get
505 {
506 hs.get(TestAccessMode.SET).invokeExact("foo");
507
508 String o = (String) hs.get(TestAccessMode.GET_AND_SET_RELEASE).invokeExact("bar");
509 assertEquals(o, "foo", "getAndSetRelease String");
510 String x = (String) hs.get(TestAccessMode.GET).invokeExact();
511 assertEquals(x, "bar", "getAndSetRelease String value");
512 }
513
514
515 }
516
517 static void testStaticFieldUnsupported(Handles hs) throws Throwable {
518
519 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_ADD)) {
520 checkUOE(am, () -> {
521 String r = (String) hs.get(am).invokeExact("foo");
522 });
523 }
524
525 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_BITWISE)) {
526 checkUOE(am, () -> {
527 String r = (String) hs.get(am).invokeExact("foo");
528 });
529 }
530 }
531
532
533 static void testArray(Handles hs) throws Throwable {
534 String[] array = new String[10];
535
536 for (int i = 0; i < array.length; i++) {
537 // Plain
538 {
539 hs.get(TestAccessMode.SET).invokeExact(array, i, "foo");
540 String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i);
541 assertEquals(x, "foo", "get String value");
542 }
543
544
545 // Volatile
546 {
547 hs.get(TestAccessMode.SET_VOLATILE).invokeExact(array, i, "bar");
548 String x = (String) hs.get(TestAccessMode.GET_VOLATILE).invokeExact(array, i);
549 assertEquals(x, "bar", "setVolatile String value");
550 }
551
552 // Lazy
553 {
554 hs.get(TestAccessMode.SET_RELEASE).invokeExact(array, i, "foo");
555 String x = (String) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact(array, i);
556 assertEquals(x, "foo", "setRelease String value");
557 }
558
559 // Opaque
560 {
561 hs.get(TestAccessMode.SET_OPAQUE).invokeExact(array, i, "bar");
562 String x = (String) hs.get(TestAccessMode.GET_OPAQUE).invokeExact(array, i);
563 assertEquals(x, "bar", "setOpaque String value");
564 }
565
566 hs.get(TestAccessMode.SET).invokeExact(array, i, "foo");
567
568 // Compare
569 {
570 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(array, i, "foo", "bar");
571 assertEquals(r, true, "success compareAndSet String");
572 String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i);
573 assertEquals(x, "bar", "success compareAndSet String value");
574 }
575
576 {
577 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(array, i, "foo", "baz");
578 assertEquals(r, false, "failing compareAndSet String");
579 String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i);
580 assertEquals(x, "bar", "failing compareAndSet String value");
581 }
582
583 {
584 String r = (String) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(array, i, "bar", "foo");
585 assertEquals(r, "bar", "success compareAndExchange String");
586 String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i);
587 assertEquals(x, "foo", "success compareAndExchange String value");
588 }
589
590 {
591 String r = (String) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(array, i, "bar", "baz");
592 assertEquals(r, "foo", "failing compareAndExchange String");
593 String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i);
594 assertEquals(x, "foo", "failing compareAndExchange String value");
595 }
596
597 {
598 String r = (String) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(array, i, "foo", "bar");
599 assertEquals(r, "foo", "success compareAndExchangeAcquire String");
600 String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i);
601 assertEquals(x, "bar", "success compareAndExchangeAcquire String value");
602 }
603
604 {
605 String r = (String) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(array, i, "foo", "baz");
606 assertEquals(r, "bar", "failing compareAndExchangeAcquire String");
607 String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i);
608 assertEquals(x, "bar", "failing compareAndExchangeAcquire String value");
609 }
610
611 {
612 String r = (String) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(array, i, "bar", "foo");
613 assertEquals(r, "bar", "success compareAndExchangeRelease String");
614 String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i);
615 assertEquals(x, "foo", "success compareAndExchangeRelease String value");
616 }
617
618 {
619 String r = (String) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(array, i, "bar", "baz");
620 assertEquals(r, "foo", "failing compareAndExchangeRelease String");
621 String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i);
622 assertEquals(x, "foo", "failing compareAndExchangeRelease String value");
623 }
624
625 {
626 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN);
627 boolean success = false;
628 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
629 success = (boolean) mh.invokeExact(array, i, "foo", "bar");
630 if (!success) weakDelay();
631 }
632 assertEquals(success, true, "success weakCompareAndSetPlain String");
633 String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i);
634 assertEquals(x, "bar", "success weakCompareAndSetPlain String value");
635 }
636
637 {
638 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN).invokeExact(array, i, "foo", "baz");
639 assertEquals(success, false, "failing weakCompareAndSetPlain String");
640 String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i);
641 assertEquals(x, "bar", "failing weakCompareAndSetPlain String value");
642 }
643
644 {
645 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE);
646 boolean success = false;
647 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
648 success = (boolean) mh.invokeExact(array, i, "bar", "foo");
649 if (!success) weakDelay();
650 }
651 assertEquals(success, true, "success weakCompareAndSetAcquire String");
652 String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i);
653 assertEquals(x, "foo", "success weakCompareAndSetAcquire String");
654 }
655
656 {
657 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(array, i, "bar", "baz");
658 assertEquals(success, false, "failing weakCompareAndSetAcquire String");
659 String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i);
660 assertEquals(x, "foo", "failing weakCompareAndSetAcquire String value");
661 }
662
663 {
664 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE);
665 boolean success = false;
666 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
667 success = (boolean) mh.invokeExact(array, i, "foo", "bar");
668 if (!success) weakDelay();
669 }
670 assertEquals(success, true, "success weakCompareAndSetRelease String");
671 String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i);
672 assertEquals(x, "bar", "success weakCompareAndSetRelease String");
673 }
674
675 {
676 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(array, i, "foo", "baz");
677 assertEquals(success, false, "failing weakCompareAndSetAcquire String");
678 String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i);
679 assertEquals(x, "bar", "failing weakCompareAndSetAcquire String value");
680 }
681
682 {
683 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET);
684 boolean success = false;
685 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
686 success = (boolean) mh.invokeExact(array, i, "bar", "foo");
687 if (!success) weakDelay();
688 }
689 assertEquals(success, true, "success weakCompareAndSet String");
690 String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i);
691 assertEquals(x, "foo", "success weakCompareAndSet String");
692 }
693
694 {
695 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(array, i, "bar", "baz");
696 assertEquals(success, false, "failing weakCompareAndSet String");
697 String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i);
698 assertEquals(x, "foo", "failing weakCompareAndSet String value");
699 }
700
701 // Compare set and get
702 {
703 hs.get(TestAccessMode.SET).invokeExact(array, i, "foo");
704
705 String o = (String) hs.get(TestAccessMode.GET_AND_SET).invokeExact(array, i, "bar");
706 assertEquals(o, "foo", "getAndSet String");
707 String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i);
708 assertEquals(x, "bar", "getAndSet String value");
709 }
710
711 {
712 hs.get(TestAccessMode.SET).invokeExact(array, i, "foo");
713
714 String o = (String) hs.get(TestAccessMode.GET_AND_SET_ACQUIRE).invokeExact(array, i, "bar");
715 assertEquals(o, "foo", "getAndSetAcquire String");
716 String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i);
717 assertEquals(x, "bar", "getAndSetAcquire String value");
718 }
719
720 {
721 hs.get(TestAccessMode.SET).invokeExact(array, i, "foo");
722
723 String o = (String) hs.get(TestAccessMode.GET_AND_SET_RELEASE).invokeExact(array, i, "bar");
724 assertEquals(o, "foo", "getAndSetRelease String");
725 String x = (String) hs.get(TestAccessMode.GET).invokeExact(array, i);
726 assertEquals(x, "bar", "getAndSetRelease String value");
727 }
728
729
730 }
731 }
732
733 static void testArrayUnsupported(Handles hs) throws Throwable {
734 String[] array = new String[10];
735
736 final int i = 0;
737
738 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_ADD)) {
739 checkUOE(am, () -> {
740 String o = (String) hs.get(am).invokeExact(array, i, "foo");
741 });
742 }
743
744 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_BITWISE)) {
745 checkUOE(am, () -> {
746 String o = (String) hs.get(am).invokeExact(array, i, "foo");
747 });
748 }
749 }
750
751 static void testArrayIndexOutOfBounds(Handles hs) throws Throwable {
752 String[] array = new String[10];
753
754 for (int i : new int[]{-1, Integer.MIN_VALUE, 10, 11, Integer.MAX_VALUE}) {
755 final int ci = i;
756
757 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET)) {
758 checkAIOOBE(am, () -> {
759 String x = (String) hs.get(am).invokeExact(array, ci);
760 });
761 }
762
763 for (TestAccessMode am : testAccessModesOfType(TestAccessType.SET)) {
764 checkAIOOBE(am, () -> {
765 hs.get(am).invokeExact(array, ci, "foo");
766 });
767 }
768
769 for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_SET)) {
770 checkAIOOBE(am, () -> {
771 boolean r = (boolean) hs.get(am).invokeExact(array, ci, "foo", "bar");
772 });
773 }
774
775 for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_EXCHANGE)) {
776 checkAIOOBE(am, () -> {
777 String r = (String) hs.get(am).invokeExact(array, ci, "bar", "foo");
778 });
779 }
780
781 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_SET)) {
782 checkAIOOBE(am, () -> {
783 String o = (String) hs.get(am).invokeExact(array, ci, "foo");
784 });
785 }
786
787
788 }
789 }
790 }
791