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