VarHandleTestMethodHandleAccessFloat.java revision 15539:74cfa7836890
1270866Simp/* 2270866Simp * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. 3270866Simp * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4270866Simp * 5270866Simp * This code is free software; you can redistribute it and/or modify it 6270866Simp * under the terms of the GNU General Public License version 2 only, as 7270866Simp * published by the Free Software Foundation. 8270866Simp * 9270866Simp * This code is distributed in the hope that it will be useful, but WITHOUT 10270866Simp * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11270866Simp * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12270866Simp * version 2 for more details (a copy is included in the LICENSE file that 13270866Simp * accompanied this code). 14270866Simp * 15270866Simp * You should have received a copy of the GNU General Public License version 16270866Simp * 2 along with this work; if not, write to the Free Software Foundation, 17270866Simp * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18270866Simp * 19270866Simp * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20270866Simp * or visit www.oracle.com if you need additional information or have any 21270866Simp * questions. 22270866Simp */ 23270866Simp 24270866Simp/* 25270866Simp * @test 26270866Simp * @run testng/othervm -Diters=20000 VarHandleTestMethodHandleAccessFloat 27270866Simp */ 28270866Simp 29270866Simpimport org.testng.annotations.BeforeClass; 30270866Simpimport org.testng.annotations.DataProvider; 31270866Simpimport org.testng.annotations.Test; 32270866Simp 33270866Simpimport java.lang.invoke.MethodHandles; 34270866Simpimport java.lang.invoke.VarHandle; 35270866Simpimport java.util.ArrayList; 36270866Simpimport java.util.Arrays; 37270866Simpimport java.util.List; 38270866Simp 39270866Simpimport static org.testng.Assert.*; 40270866Simp 41270866Simppublic class VarHandleTestMethodHandleAccessFloat extends VarHandleBaseTest { 42270866Simp static final float static_final_v = 1.0f; 43270866Simp 44270866Simp static float static_v; 45270866Simp 46270866Simp final float final_v = 1.0f; 47270866Simp 48270866Simp float v; 49270866Simp 50270866Simp VarHandle vhFinalField; 51270866Simp 52270866Simp VarHandle vhField; 53270866Simp 54270866Simp VarHandle vhStaticField; 55270866Simp 56270866Simp VarHandle vhStaticFinalField; 57270866Simp 58270866Simp VarHandle vhArray; 59270866Simp 60270866Simp @BeforeClass 61270866Simp public void setup() throws Exception { 62270866Simp vhFinalField = MethodHandles.lookup().findVarHandle( 63270866Simp VarHandleTestMethodHandleAccessFloat.class, "final_v", float.class); 64270866Simp 65270866Simp vhField = MethodHandles.lookup().findVarHandle( 66270866Simp VarHandleTestMethodHandleAccessFloat.class, "v", float.class); 67270866Simp 68270866Simp vhStaticFinalField = MethodHandles.lookup().findStaticVarHandle( 69270866Simp VarHandleTestMethodHandleAccessFloat.class, "static_final_v", float.class); 70270866Simp 71270866Simp vhStaticField = MethodHandles.lookup().findStaticVarHandle( 72270866Simp VarHandleTestMethodHandleAccessFloat.class, "static_v", float.class); 73270866Simp 74270866Simp vhArray = MethodHandles.arrayElementVarHandle(float[].class); 75270866Simp } 76270866Simp 77270866Simp 78270866Simp @DataProvider 79270866Simp public Object[][] accessTestCaseProvider() throws Exception { 80270866Simp List<AccessTestCase<?>> cases = new ArrayList<>(); 81270866Simp 82270866Simp for (VarHandleToMethodHandle f : VarHandleToMethodHandle.values()) { 83270866Simp cases.add(new MethodHandleAccessTestCase("Instance field", 84270866Simp vhField, f, hs -> testInstanceField(this, hs))); 85270866Simp cases.add(new MethodHandleAccessTestCase("Instance field unsupported", 86270866Simp vhField, f, hs -> testInstanceFieldUnsupported(this, hs), 87270866Simp false)); 88270866Simp 89270866Simp cases.add(new MethodHandleAccessTestCase("Static field", 90270866Simp vhStaticField, f, VarHandleTestMethodHandleAccessFloat::testStaticField)); 91270866Simp cases.add(new MethodHandleAccessTestCase("Static field unsupported", 92270866Simp vhStaticField, f, VarHandleTestMethodHandleAccessFloat::testStaticFieldUnsupported, 93270866Simp false)); 94270866Simp 95270866Simp cases.add(new MethodHandleAccessTestCase("Array", 96270866Simp vhArray, f, VarHandleTestMethodHandleAccessFloat::testArray)); 97270866Simp cases.add(new MethodHandleAccessTestCase("Array unsupported", 98270866Simp vhArray, f, VarHandleTestMethodHandleAccessFloat::testArrayUnsupported, 99270866Simp false)); 100270866Simp cases.add(new MethodHandleAccessTestCase("Array index out of bounds", 101270866Simp vhArray, f, VarHandleTestMethodHandleAccessFloat::testArrayIndexOutOfBounds, 102270866Simp false)); 103270866Simp } 104270866Simp 105270866Simp // Work around issue with jtreg summary reporting which truncates 106270866Simp // the String result of Object.toString to 30 characters, hence 107270866Simp // the first dummy argument 108270866Simp return cases.stream().map(tc -> new Object[]{tc.toString(), tc}).toArray(Object[][]::new); 109270866Simp } 110270866Simp 111270866Simp @Test(dataProvider = "accessTestCaseProvider") 112270866Simp public <T> void testAccess(String desc, AccessTestCase<T> atc) throws Throwable { 113270866Simp T t = atc.get(); 114270866Simp int iters = atc.requiresLoop() ? ITERS : 1; 115270866Simp for (int c = 0; c < iters; c++) { 116270866Simp atc.testAccess(t); 117270866Simp } 118270866Simp } 119270866Simp 120270866Simp 121270866Simp static void testInstanceField(VarHandleTestMethodHandleAccessFloat recv, Handles hs) throws Throwable { 122270866Simp // Plain 123270866Simp { 124270866Simp hs.get(TestAccessMode.SET).invokeExact(recv, 1.0f); 125270866Simp float x = (float) hs.get(TestAccessMode.GET).invokeExact(recv); 126270866Simp assertEquals(x, 1.0f, "set float value"); 127270866Simp } 128270866Simp 129270866Simp 130270866Simp // Volatile 131270866Simp { 132270866Simp hs.get(TestAccessMode.SET_VOLATILE).invokeExact(recv, 2.0f); 133270866Simp float x = (float) hs.get(TestAccessMode.GET_VOLATILE).invokeExact(recv); 134270866Simp assertEquals(x, 2.0f, "setVolatile float value"); 135270866Simp } 136270866Simp 137270866Simp // Lazy 138270866Simp { 139270866Simp hs.get(TestAccessMode.SET_RELEASE).invokeExact(recv, 1.0f); 140270866Simp float x = (float) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact(recv); 141270866Simp assertEquals(x, 1.0f, "setRelease float value"); 142270866Simp } 143270866Simp 144270866Simp // Opaque 145270866Simp { 146270866Simp hs.get(TestAccessMode.SET_OPAQUE).invokeExact(recv, 2.0f); 147270866Simp float x = (float) hs.get(TestAccessMode.GET_OPAQUE).invokeExact(recv); 148270866Simp assertEquals(x, 2.0f, "setOpaque float value"); 149270866Simp } 150270866Simp 151270866Simp hs.get(TestAccessMode.SET).invokeExact(recv, 1.0f); 152270866Simp 153270866Simp // Compare 154270866Simp { 155270866Simp boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(recv, 1.0f, 2.0f); 156270866Simp assertEquals(r, true, "success compareAndSet float"); 157270866Simp float x = (float) hs.get(TestAccessMode.GET).invokeExact(recv); 158270866Simp assertEquals(x, 2.0f, "success compareAndSet float value"); 159270866Simp } 160270866Simp 161270866Simp { 162270866Simp boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(recv, 1.0f, 3.0f); 163270866Simp assertEquals(r, false, "failing compareAndSet float"); 164270866Simp float x = (float) hs.get(TestAccessMode.GET).invokeExact(recv); 165270866Simp assertEquals(x, 2.0f, "failing compareAndSet float value"); 166270866Simp } 167270866Simp 168270866Simp { 169270866Simp float r = (float) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(recv, 2.0f, 1.0f); 170270866Simp assertEquals(r, 2.0f, "success compareAndExchange float"); 171270866Simp float x = (float) hs.get(TestAccessMode.GET).invokeExact(recv); 172270866Simp assertEquals(x, 1.0f, "success compareAndExchange float value"); 173270866Simp } 174270866Simp 175270866Simp { 176270866Simp float r = (float) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(recv, 2.0f, 3.0f); 177270866Simp assertEquals(r, 1.0f, "failing compareAndExchange float"); 178270866Simp float x = (float) hs.get(TestAccessMode.GET).invokeExact(recv); 179270866Simp assertEquals(x, 1.0f, "failing compareAndExchange float value"); 180270866Simp } 181270866Simp 182270866Simp { 183270866Simp float r = (float) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(recv, 1.0f, 2.0f); 184270866Simp assertEquals(r, 1.0f, "success compareAndExchangeAcquire float"); 185270866Simp float x = (float) hs.get(TestAccessMode.GET).invokeExact(recv); 186270866Simp assertEquals(x, 2.0f, "success compareAndExchangeAcquire float value"); 187270866Simp } 188270866Simp 189270866Simp { 190270866Simp float r = (float) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(recv, 1.0f, 3.0f); 191270866Simp assertEquals(r, 2.0f, "failing compareAndExchangeAcquire float"); 192270866Simp float x = (float) hs.get(TestAccessMode.GET).invokeExact(recv); 193270866Simp assertEquals(x, 2.0f, "failing compareAndExchangeAcquire float value"); 194270866Simp } 195270866Simp 196270866Simp { 197270866Simp float r = (float) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(recv, 2.0f, 1.0f); 198270866Simp assertEquals(r, 2.0f, "success compareAndExchangeRelease float"); 199270866Simp float x = (float) hs.get(TestAccessMode.GET).invokeExact(recv); 200270866Simp assertEquals(x, 1.0f, "success compareAndExchangeRelease float value"); 201270866Simp } 202270866Simp 203270866Simp { 204270866Simp float r = (float) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(recv, 2.0f, 3.0f); 205270866Simp assertEquals(r, 1.0f, "failing compareAndExchangeRelease float"); 206270866Simp float x = (float) hs.get(TestAccessMode.GET).invokeExact(recv); 207270866Simp assertEquals(x, 1.0f, "failing compareAndExchangeRelease float value"); 208270866Simp } 209270866Simp 210270866Simp { 211270866Simp boolean success = false; 212270866Simp for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 213270866Simp success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(recv, 1.0f, 2.0f); 214270866Simp } 215270866Simp assertEquals(success, true, "weakCompareAndSet float"); 216270866Simp float x = (float) hs.get(TestAccessMode.GET).invokeExact(recv); 217270866Simp assertEquals(x, 2.0f, "weakCompareAndSet float value"); 218270866Simp } 219270866Simp 220270866Simp { 221270866Simp boolean success = false; 222270866Simp for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 223270866Simp success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(recv, 2.0f, 1.0f); 224270866Simp } 225270866Simp assertEquals(success, true, "weakCompareAndSetAcquire float"); 226270866Simp float x = (float) hs.get(TestAccessMode.GET).invokeExact(recv); 227270866Simp assertEquals(x, 1.0f, "weakCompareAndSetAcquire float"); 228270866Simp } 229270866Simp 230270866Simp { 231270866Simp boolean success = false; 232270866Simp for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 233270866Simp success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(recv, 1.0f, 2.0f); 234270866Simp } 235270866Simp assertEquals(success, true, "weakCompareAndSetRelease float"); 236270866Simp float x = (float) hs.get(TestAccessMode.GET).invokeExact(recv); 237270866Simp assertEquals(x, 2.0f, "weakCompareAndSetRelease float"); 238270866Simp } 239270866Simp 240270866Simp { 241270866Simp boolean success = false; 242270866Simp for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 243270866Simp success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_VOLATILE).invokeExact(recv, 2.0f, 1.0f); 244270866Simp } 245270866Simp assertEquals(success, true, "weakCompareAndSetVolatile float"); 246270866Simp float x = (float) hs.get(TestAccessMode.GET).invokeExact(recv); 247270866Simp assertEquals(x, 1.0f, "weakCompareAndSetVolatile float"); 248270866Simp } 249270866Simp 250270866Simp // Compare set and get 251270866Simp { 252270866Simp float o = (float) hs.get(TestAccessMode.GET_AND_SET).invokeExact(recv, 2.0f); 253270866Simp assertEquals(o, 1.0f, "getAndSet float"); 254270866Simp float x = (float) hs.get(TestAccessMode.GET).invokeExact(recv); 255270866Simp assertEquals(x, 2.0f, "getAndSet float value"); 256270866Simp } 257270866Simp 258270866Simp // get and add, add and get 259270866Simp { 260270866Simp hs.get(TestAccessMode.SET).invokeExact(recv, 1.0f); 261270866Simp 262270866Simp float o = (float) hs.get(TestAccessMode.GET_AND_ADD).invokeExact(recv, 3.0f); 263270866Simp assertEquals(o, 1.0f, "getAndAdd float"); 264270866Simp float c = (float) hs.get(TestAccessMode.ADD_AND_GET).invokeExact(recv, 3.0f); 265270866Simp assertEquals(c, (float)(1.0f + 3.0f + 3.0f), "getAndAdd float value"); 266270866Simp } 267270866Simp 268270866Simp { 269270866Simp hs.get(TestAccessMode.SET).invokeExact(recv, 1.0f); 270270866Simp 271270866Simp float o = (float) hs.get(TestAccessMode.GET_AND_ADD_ACQUIRE).invokeExact(recv, 2.0f); 272270866Simp assertEquals(o, 1.0f, "getAndAddAcquire float"); 273270866Simp float x = (float) hs.get(TestAccessMode.GET).invokeExact(recv); 274270866Simp assertEquals(x, (float)(1.0f + 2.0f), "getAndAddAcquire float value"); 275270866Simp } 276270866Simp 277270866Simp { 278 hs.get(TestAccessMode.SET).invokeExact(recv, 1.0f); 279 280 float o = (float) hs.get(TestAccessMode.GET_AND_ADD_RELEASE).invokeExact(recv, 2.0f); 281 assertEquals(o, 1.0f, "getAndAddRelease float"); 282 float x = (float) hs.get(TestAccessMode.GET).invokeExact(recv); 283 assertEquals(x, (float)(1.0f + 2.0f), "getAndAddRelease float value"); 284 } 285 286 } 287 288 static void testInstanceFieldUnsupported(VarHandleTestMethodHandleAccessFloat recv, Handles hs) throws Throwable { 289 290 291 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_BITWISE)) { 292 checkUOE(am, () -> { 293 float r = (float) hs.get(am).invokeExact(recv, 1.0f); 294 }); 295 } 296 } 297 298 299 static void testStaticField(Handles hs) throws Throwable { 300 // Plain 301 { 302 hs.get(TestAccessMode.SET).invokeExact(1.0f); 303 float x = (float) hs.get(TestAccessMode.GET).invokeExact(); 304 assertEquals(x, 1.0f, "set float value"); 305 } 306 307 308 // Volatile 309 { 310 hs.get(TestAccessMode.SET_VOLATILE).invokeExact(2.0f); 311 float x = (float) hs.get(TestAccessMode.GET_VOLATILE).invokeExact(); 312 assertEquals(x, 2.0f, "setVolatile float value"); 313 } 314 315 // Lazy 316 { 317 hs.get(TestAccessMode.SET_RELEASE).invokeExact(1.0f); 318 float x = (float) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact(); 319 assertEquals(x, 1.0f, "setRelease float value"); 320 } 321 322 // Opaque 323 { 324 hs.get(TestAccessMode.SET_OPAQUE).invokeExact(2.0f); 325 float x = (float) hs.get(TestAccessMode.GET_OPAQUE).invokeExact(); 326 assertEquals(x, 2.0f, "setOpaque float value"); 327 } 328 329 hs.get(TestAccessMode.SET).invokeExact(1.0f); 330 331 // Compare 332 { 333 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(1.0f, 2.0f); 334 assertEquals(r, true, "success compareAndSet float"); 335 float x = (float) hs.get(TestAccessMode.GET).invokeExact(); 336 assertEquals(x, 2.0f, "success compareAndSet float value"); 337 } 338 339 { 340 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(1.0f, 3.0f); 341 assertEquals(r, false, "failing compareAndSet float"); 342 float x = (float) hs.get(TestAccessMode.GET).invokeExact(); 343 assertEquals(x, 2.0f, "failing compareAndSet float value"); 344 } 345 346 { 347 float r = (float) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(2.0f, 1.0f); 348 assertEquals(r, 2.0f, "success compareAndExchange float"); 349 float x = (float) hs.get(TestAccessMode.GET).invokeExact(); 350 assertEquals(x, 1.0f, "success compareAndExchange float value"); 351 } 352 353 { 354 float r = (float) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(2.0f, 3.0f); 355 assertEquals(r, 1.0f, "failing compareAndExchange float"); 356 float x = (float) hs.get(TestAccessMode.GET).invokeExact(); 357 assertEquals(x, 1.0f, "failing compareAndExchange float value"); 358 } 359 360 { 361 float r = (float) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(1.0f, 2.0f); 362 assertEquals(r, 1.0f, "success compareAndExchangeAcquire float"); 363 float x = (float) hs.get(TestAccessMode.GET).invokeExact(); 364 assertEquals(x, 2.0f, "success compareAndExchangeAcquire float value"); 365 } 366 367 { 368 float r = (float) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(1.0f, 3.0f); 369 assertEquals(r, 2.0f, "failing compareAndExchangeAcquire float"); 370 float x = (float) hs.get(TestAccessMode.GET).invokeExact(); 371 assertEquals(x, 2.0f, "failing compareAndExchangeAcquire float value"); 372 } 373 374 { 375 float r = (float) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(2.0f, 1.0f); 376 assertEquals(r, 2.0f, "success compareAndExchangeRelease float"); 377 float x = (float) hs.get(TestAccessMode.GET).invokeExact(); 378 assertEquals(x, 1.0f, "success compareAndExchangeRelease float value"); 379 } 380 381 { 382 float r = (float) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(2.0f, 3.0f); 383 assertEquals(r, 1.0f, "failing compareAndExchangeRelease float"); 384 float x = (float) hs.get(TestAccessMode.GET).invokeExact(); 385 assertEquals(x, 1.0f, "failing compareAndExchangeRelease float value"); 386 } 387 388 { 389 boolean success = false; 390 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 391 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(1.0f, 2.0f); 392 } 393 assertEquals(success, true, "weakCompareAndSet float"); 394 float x = (float) hs.get(TestAccessMode.GET).invokeExact(); 395 assertEquals(x, 2.0f, "weakCompareAndSet float value"); 396 } 397 398 { 399 boolean success = false; 400 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 401 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(2.0f, 1.0f); 402 } 403 assertEquals(success, true, "weakCompareAndSetAcquire float"); 404 float x = (float) hs.get(TestAccessMode.GET).invokeExact(); 405 assertEquals(x, 1.0f, "weakCompareAndSetAcquire float"); 406 } 407 408 { 409 boolean success = false; 410 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 411 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(1.0f, 2.0f); 412 } 413 assertEquals(success, true, "weakCompareAndSetRelease float"); 414 float x = (float) hs.get(TestAccessMode.GET).invokeExact(); 415 assertEquals(x, 2.0f, "weakCompareAndSetRelease float"); 416 } 417 418 { 419 boolean success = false; 420 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 421 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_VOLATILE).invokeExact(2.0f, 1.0f); 422 } 423 assertEquals(success, true, "weakCompareAndSetVolatile float"); 424 float x = (float) hs.get(TestAccessMode.GET).invokeExact(); 425 assertEquals(x, 1.0f, "weakCompareAndSetVolatile float"); 426 } 427 428 // Compare set and get 429 { 430 hs.get(TestAccessMode.SET).invokeExact(1.0f); 431 432 float o = (float) hs.get(TestAccessMode.GET_AND_SET).invokeExact(2.0f); 433 assertEquals(o, 1.0f, "getAndSet float"); 434 float x = (float) hs.get(TestAccessMode.GET).invokeExact(); 435 assertEquals(x, 2.0f, "getAndSet float value"); 436 } 437 438 // Compare set and get 439 { 440 hs.get(TestAccessMode.SET).invokeExact(1.0f); 441 442 float o = (float) hs.get(TestAccessMode.GET_AND_SET_ACQUIRE).invokeExact(2.0f); 443 assertEquals(o, 1.0f, "getAndSetAcquire float"); 444 float x = (float) hs.get(TestAccessMode.GET).invokeExact(); 445 assertEquals(x, 2.0f, "getAndSetAcquire float value"); 446 } 447 448 // Compare set and get 449 { 450 hs.get(TestAccessMode.SET).invokeExact(1.0f); 451 452 float o = (float) hs.get(TestAccessMode.GET_AND_SET_RELEASE).invokeExact(2.0f); 453 assertEquals(o, 1.0f, "getAndSetRelease float"); 454 float x = (float) hs.get(TestAccessMode.GET).invokeExact(); 455 assertEquals(x, 2.0f, "getAndSetRelease float value"); 456 } 457 458 // get and add, add and get 459 { 460 hs.get(TestAccessMode.SET).invokeExact(1.0f); 461 462 float o = (float) hs.get(TestAccessMode.GET_AND_ADD).invokeExact(3.0f); 463 assertEquals(o, 1.0f, "getAndAdd float"); 464 float c = (float) hs.get(TestAccessMode.ADD_AND_GET).invokeExact(3.0f); 465 assertEquals(c, (float)(1.0f + 3.0f + 3.0f), "getAndAdd float value"); 466 } 467 468 { 469 hs.get(TestAccessMode.SET).invokeExact(1.0f); 470 471 float o = (float) hs.get(TestAccessMode.GET_AND_ADD_ACQUIRE).invokeExact(2.0f); 472 assertEquals(o, 1.0f, "getAndAddAcquire float"); 473 float x = (float) hs.get(TestAccessMode.GET).invokeExact(); 474 assertEquals(x, (float)(1.0f + 2.0f), "getAndAddAcquire float value"); 475 } 476 477 { 478 hs.get(TestAccessMode.SET).invokeExact(1.0f); 479 480 float o = (float) hs.get(TestAccessMode.GET_AND_ADD_RELEASE).invokeExact(2.0f); 481 assertEquals(o, 1.0f, "getAndAddRelease float"); 482 float x = (float) hs.get(TestAccessMode.GET).invokeExact(); 483 assertEquals(x, (float)(1.0f + 2.0f), "getAndAddRelease float value"); 484 } 485 486 } 487 488 static void testStaticFieldUnsupported(Handles hs) throws Throwable { 489 490 491 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_BITWISE)) { 492 checkUOE(am, () -> { 493 float r = (float) hs.get(am).invokeExact(1.0f); 494 }); 495 } 496 } 497 498 499 static void testArray(Handles hs) throws Throwable { 500 float[] array = new float[10]; 501 502 for (int i = 0; i < array.length; i++) { 503 // Plain 504 { 505 hs.get(TestAccessMode.SET).invokeExact(array, i, 1.0f); 506 float x = (float) hs.get(TestAccessMode.GET).invokeExact(array, i); 507 assertEquals(x, 1.0f, "get float value"); 508 } 509 510 511 // Volatile 512 { 513 hs.get(TestAccessMode.SET_VOLATILE).invokeExact(array, i, 2.0f); 514 float x = (float) hs.get(TestAccessMode.GET_VOLATILE).invokeExact(array, i); 515 assertEquals(x, 2.0f, "setVolatile float value"); 516 } 517 518 // Lazy 519 { 520 hs.get(TestAccessMode.SET_RELEASE).invokeExact(array, i, 1.0f); 521 float x = (float) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact(array, i); 522 assertEquals(x, 1.0f, "setRelease float value"); 523 } 524 525 // Opaque 526 { 527 hs.get(TestAccessMode.SET_OPAQUE).invokeExact(array, i, 2.0f); 528 float x = (float) hs.get(TestAccessMode.GET_OPAQUE).invokeExact(array, i); 529 assertEquals(x, 2.0f, "setOpaque float value"); 530 } 531 532 hs.get(TestAccessMode.SET).invokeExact(array, i, 1.0f); 533 534 // Compare 535 { 536 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(array, i, 1.0f, 2.0f); 537 assertEquals(r, true, "success compareAndSet float"); 538 float x = (float) hs.get(TestAccessMode.GET).invokeExact(array, i); 539 assertEquals(x, 2.0f, "success compareAndSet float value"); 540 } 541 542 { 543 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(array, i, 1.0f, 3.0f); 544 assertEquals(r, false, "failing compareAndSet float"); 545 float x = (float) hs.get(TestAccessMode.GET).invokeExact(array, i); 546 assertEquals(x, 2.0f, "failing compareAndSet float value"); 547 } 548 549 { 550 float r = (float) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(array, i, 2.0f, 1.0f); 551 assertEquals(r, 2.0f, "success compareAndExchange float"); 552 float x = (float) hs.get(TestAccessMode.GET).invokeExact(array, i); 553 assertEquals(x, 1.0f, "success compareAndExchange float value"); 554 } 555 556 { 557 float r = (float) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(array, i, 2.0f, 3.0f); 558 assertEquals(r, 1.0f, "failing compareAndExchange float"); 559 float x = (float) hs.get(TestAccessMode.GET).invokeExact(array, i); 560 assertEquals(x, 1.0f, "failing compareAndExchange float value"); 561 } 562 563 { 564 float r = (float) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(array, i, 1.0f, 2.0f); 565 assertEquals(r, 1.0f, "success compareAndExchangeAcquire float"); 566 float x = (float) hs.get(TestAccessMode.GET).invokeExact(array, i); 567 assertEquals(x, 2.0f, "success compareAndExchangeAcquire float value"); 568 } 569 570 { 571 float r = (float) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(array, i, 1.0f, 3.0f); 572 assertEquals(r, 2.0f, "failing compareAndExchangeAcquire float"); 573 float x = (float) hs.get(TestAccessMode.GET).invokeExact(array, i); 574 assertEquals(x, 2.0f, "failing compareAndExchangeAcquire float value"); 575 } 576 577 { 578 float r = (float) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(array, i, 2.0f, 1.0f); 579 assertEquals(r, 2.0f, "success compareAndExchangeRelease float"); 580 float x = (float) hs.get(TestAccessMode.GET).invokeExact(array, i); 581 assertEquals(x, 1.0f, "success compareAndExchangeRelease float value"); 582 } 583 584 { 585 float r = (float) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(array, i, 2.0f, 3.0f); 586 assertEquals(r, 1.0f, "failing compareAndExchangeRelease float"); 587 float x = (float) hs.get(TestAccessMode.GET).invokeExact(array, i); 588 assertEquals(x, 1.0f, "failing compareAndExchangeRelease float value"); 589 } 590 591 { 592 boolean success = false; 593 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 594 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(array, i, 1.0f, 2.0f); 595 } 596 assertEquals(success, true, "weakCompareAndSet float"); 597 float x = (float) hs.get(TestAccessMode.GET).invokeExact(array, i); 598 assertEquals(x, 2.0f, "weakCompareAndSet float value"); 599 } 600 601 { 602 boolean success = false; 603 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 604 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(array, i, 2.0f, 1.0f); 605 } 606 assertEquals(success, true, "weakCompareAndSetAcquire float"); 607 float x = (float) hs.get(TestAccessMode.GET).invokeExact(array, i); 608 assertEquals(x, 1.0f, "weakCompareAndSetAcquire float"); 609 } 610 611 { 612 boolean success = false; 613 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 614 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(array, i, 1.0f, 2.0f); 615 } 616 assertEquals(success, true, "weakCompareAndSetRelease float"); 617 float x = (float) hs.get(TestAccessMode.GET).invokeExact(array, i); 618 assertEquals(x, 2.0f, "weakCompareAndSetRelease float"); 619 } 620 621 { 622 boolean success = false; 623 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) { 624 success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_VOLATILE).invokeExact(array, i, 2.0f, 1.0f); 625 } 626 assertEquals(success, true, "weakCompareAndSetVolatile float"); 627 float x = (float) hs.get(TestAccessMode.GET).invokeExact(array, i); 628 assertEquals(x, 1.0f, "weakCompareAndSetVolatile float"); 629 } 630 631 // Compare set and get 632 { 633 hs.get(TestAccessMode.SET).invokeExact(array, i, 1.0f); 634 635 float o = (float) hs.get(TestAccessMode.GET_AND_SET).invokeExact(array, i, 2.0f); 636 assertEquals(o, 1.0f, "getAndSet float"); 637 float x = (float) hs.get(TestAccessMode.GET).invokeExact(array, i); 638 assertEquals(x, 2.0f, "getAndSet float value"); 639 } 640 641 { 642 hs.get(TestAccessMode.SET).invokeExact(array, i, 1.0f); 643 644 float o = (float) hs.get(TestAccessMode.GET_AND_SET_ACQUIRE).invokeExact(array, i, 2.0f); 645 assertEquals(o, 1.0f, "getAndSetAcquire float"); 646 float x = (float) hs.get(TestAccessMode.GET).invokeExact(array, i); 647 assertEquals(x, 2.0f, "getAndSetAcquire float value"); 648 } 649 650 { 651 hs.get(TestAccessMode.SET).invokeExact(array, i, 1.0f); 652 653 float o = (float) hs.get(TestAccessMode.GET_AND_SET_RELEASE).invokeExact(array, i, 2.0f); 654 assertEquals(o, 1.0f, "getAndSetRelease float"); 655 float x = (float) hs.get(TestAccessMode.GET).invokeExact(array, i); 656 assertEquals(x, 2.0f, "getAndSetRelease float value"); 657 } 658 659 // get and add, add and get 660 { 661 hs.get(TestAccessMode.SET).invokeExact(array, i, 1.0f); 662 663 float o = (float) hs.get(TestAccessMode.GET_AND_ADD).invokeExact(array, i, 3.0f); 664 assertEquals(o, 1.0f, "getAndAdd float"); 665 float c = (float) hs.get(TestAccessMode.ADD_AND_GET).invokeExact(array, i, 3.0f); 666 assertEquals(c, (float)(1.0f + 3.0f + 3.0f), "getAndAdd float value"); 667 } 668 669 { 670 hs.get(TestAccessMode.SET).invokeExact(array, i, 1.0f); 671 672 float o = (float) hs.get(TestAccessMode.GET_AND_ADD_ACQUIRE).invokeExact(array, i, 2.0f); 673 assertEquals(o, 1.0f, "getAndAddAcquire float"); 674 float x = (float) hs.get(TestAccessMode.GET).invokeExact(array, i); 675 assertEquals(x, (float)(1.0f + 2.0f), "getAndAddAcquire float value"); 676 } 677 678 { 679 hs.get(TestAccessMode.SET).invokeExact(array, i, 1.0f); 680 681 float o = (float) hs.get(TestAccessMode.GET_AND_ADD_RELEASE).invokeExact(array, i, 2.0f); 682 assertEquals(o, 1.0f, "getAndAddRelease float"); 683 float x = (float) hs.get(TestAccessMode.GET).invokeExact(array, i); 684 assertEquals(x, (float)(1.0f + 2.0f), "getAndAddRelease float value"); 685 } 686 687 } 688 } 689 690 static void testArrayUnsupported(Handles hs) throws Throwable { 691 float[] array = new float[10]; 692 693 final int i = 0; 694 695 696 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_BITWISE)) { 697 checkUOE(am, () -> { 698 float o = (float) hs.get(am).invokeExact(array, i, 1.0f); 699 }); 700 } 701 } 702 703 static void testArrayIndexOutOfBounds(Handles hs) throws Throwable { 704 float[] array = new float[10]; 705 706 for (int i : new int[]{-1, Integer.MIN_VALUE, 10, 11, Integer.MAX_VALUE}) { 707 final int ci = i; 708 709 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET)) { 710 checkIOOBE(am, () -> { 711 float x = (float) hs.get(am).invokeExact(array, ci); 712 }); 713 } 714 715 for (TestAccessMode am : testAccessModesOfType(TestAccessType.SET)) { 716 checkIOOBE(am, () -> { 717 hs.get(am).invokeExact(array, ci, 1.0f); 718 }); 719 } 720 721 for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_SET)) { 722 checkIOOBE(am, () -> { 723 boolean r = (boolean) hs.get(am).invokeExact(array, ci, 1.0f, 2.0f); 724 }); 725 } 726 727 for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_EXCHANGE)) { 728 checkIOOBE(am, () -> { 729 float r = (float) hs.get(am).invokeExact(array, ci, 2.0f, 1.0f); 730 }); 731 } 732 733 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_SET)) { 734 checkIOOBE(am, () -> { 735 float o = (float) hs.get(am).invokeExact(array, ci, 1.0f); 736 }); 737 } 738 739 for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_ADD)) { 740 checkIOOBE(am, () -> { 741 float o = (float) hs.get(am).invokeExact(array, ci, 3.0f); 742 }); 743 } 744 745 } 746 } 747} 748 749