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