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