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