1 /* 2 * Copyright (c) 2015, 2023, 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. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 package java.lang.invoke; 26 27 import jdk.internal.util.Preconditions; 28 import jdk.internal.vm.annotation.ForceInline; 29 30 import java.lang.invoke.VarHandle.VarHandleDesc; 31 import java.util.Objects; 32 import java.util.Optional; 33 34 import static java.lang.invoke.MethodHandleStatics.UNSAFE; 35 36 #warn 37 38 final class VarHandle$Type$s { 39 40 static sealed class FieldInstanceReadOnly extends VarHandle { 41 final long fieldOffset; 42 final Class<?> receiverType; 43 #if[Object] 44 final Class<?> fieldType; 45 #end[Object] 46 47 FieldInstanceReadOnly(Class<?> receiverType, long fieldOffset{#if[Object]?, Class<?> fieldType}) { 48 this(receiverType, fieldOffset{#if[Object]?, fieldType}, FieldInstanceReadOnly.FORM, false); 49 } 50 51 protected FieldInstanceReadOnly(Class<?> receiverType, long fieldOffset{#if[Object]?, Class<?> fieldType}, 52 VarForm form, boolean exact) { 53 super(form, exact); 54 this.fieldOffset = fieldOffset; 55 this.receiverType = receiverType; 56 #if[Object] 57 this.fieldType = fieldType; 58 #end[Object] 59 } 60 61 @Override 62 public FieldInstanceReadOnly withInvokeExactBehavior() { 63 return hasInvokeExactBehavior() 64 ? this 65 : new FieldInstanceReadOnly(receiverType, fieldOffset{#if[Object]?, fieldType}, vform, true); 66 } 67 68 @Override 69 public FieldInstanceReadOnly withInvokeBehavior() { 70 return !hasInvokeExactBehavior() 71 ? this 72 : new FieldInstanceReadOnly(receiverType, fieldOffset{#if[Object]?, fieldType}, vform, false); 73 } 74 75 @Override 76 final MethodType accessModeTypeUncached(AccessType at) { 77 return at.accessModeType(receiverType, {#if[Object]?fieldType:$type$.class}); 78 } 79 80 @Override 81 public Optional<VarHandleDesc> describeConstable() { 82 var receiverTypeRef = receiverType.describeConstable(); 83 var fieldTypeRef = {#if[Object]?fieldType:$type$.class}.describeConstable(); 84 if (!receiverTypeRef.isPresent() || !fieldTypeRef.isPresent()) 85 return Optional.empty(); 86 87 // Reflect on this VarHandle to extract the field name 88 String name = VarHandles.getFieldFromReceiverAndOffset( 89 receiverType, fieldOffset, {#if[Object]?fieldType:$type$.class}).getName(); 90 return Optional.of(VarHandleDesc.ofField(receiverTypeRef.get(), name, fieldTypeRef.get())); 91 } 92 93 @ForceInline 94 static $type$ get(VarHandle ob, Object holder) { 95 FieldInstanceReadOnly handle = (FieldInstanceReadOnly)ob; 96 return UNSAFE.get$Type$(Objects.requireNonNull(handle.receiverType.cast(holder)), 97 handle.fieldOffset{#if[Value]?, handle.fieldType}); 98 } 99 100 @ForceInline 101 static $type$ getVolatile(VarHandle ob, Object holder) { 102 FieldInstanceReadOnly handle = (FieldInstanceReadOnly)ob; 103 return UNSAFE.get$Type$Volatile(Objects.requireNonNull(handle.receiverType.cast(holder)), 104 handle.fieldOffset{#if[Value]?, handle.fieldType}); 105 } 106 107 @ForceInline 108 static $type$ getOpaque(VarHandle ob, Object holder) { 109 FieldInstanceReadOnly handle = (FieldInstanceReadOnly)ob; 110 return UNSAFE.get$Type$Opaque(Objects.requireNonNull(handle.receiverType.cast(holder)), 111 handle.fieldOffset{#if[Value]?, handle.fieldType}); 112 } 113 114 @ForceInline 115 static $type$ getAcquire(VarHandle ob, Object holder) { 116 FieldInstanceReadOnly handle = (FieldInstanceReadOnly)ob; 117 return UNSAFE.get$Type$Acquire(Objects.requireNonNull(handle.receiverType.cast(holder)), 118 handle.fieldOffset{#if[Value]?, handle.fieldType}); 119 } 120 121 static final VarForm FORM = new VarForm(FieldInstanceReadOnly.class, Object.class, $type$.class); 122 } 123 124 static final class FieldInstanceReadWrite extends FieldInstanceReadOnly { 125 FieldInstanceReadWrite(Class<?> receiverType, long fieldOffset{#if[Object]?, Class<?> fieldType}) { 126 this(receiverType, fieldOffset{#if[Object]?, fieldType}, false); 127 } 128 129 private FieldInstanceReadWrite(Class<?> receiverType, long fieldOffset{#if[Object]?, Class<?> fieldType}, 130 boolean exact) { 131 super(receiverType, fieldOffset{#if[Object]?, fieldType}, FieldInstanceReadWrite.FORM, exact); 132 } 133 134 @Override 135 public FieldInstanceReadWrite withInvokeExactBehavior() { 136 return hasInvokeExactBehavior() 137 ? this 138 : new FieldInstanceReadWrite(receiverType, fieldOffset{#if[Object]?, fieldType}, true); 139 } 140 141 @Override 142 public FieldInstanceReadWrite withInvokeBehavior() { 143 return !hasInvokeExactBehavior() 144 ? this 145 : new FieldInstanceReadWrite(receiverType, fieldOffset{#if[Object]?, fieldType}, false); 146 } 147 148 #if[Object] 149 @ForceInline 150 static Object checkCast(FieldInstanceReadWrite handle, $type$ value) { 151 return handle.fieldType.cast(value); 152 } 153 #end[Object] 154 155 @ForceInline 156 static void set(VarHandle ob, Object holder, $type$ value) { 157 FieldInstanceReadWrite handle = (FieldInstanceReadWrite)ob; 158 UNSAFE.put$Type$(Objects.requireNonNull(handle.receiverType.cast(holder)), 159 handle.fieldOffset{#if[Value]?, handle.fieldType}, 160 {#if[Object]?checkCast(handle, value):value}); 161 } 162 163 @ForceInline 164 static void setVolatile(VarHandle ob, Object holder, $type$ value) { 165 FieldInstanceReadWrite handle = (FieldInstanceReadWrite)ob; 166 UNSAFE.put$Type$Volatile(Objects.requireNonNull(handle.receiverType.cast(holder)), 167 handle.fieldOffset{#if[Value]?, handle.fieldType}, 168 {#if[Object]?checkCast(handle, value):value}); 169 } 170 171 @ForceInline 172 static void setOpaque(VarHandle ob, Object holder, $type$ value) { 173 FieldInstanceReadWrite handle = (FieldInstanceReadWrite)ob; 174 UNSAFE.put$Type$Opaque(Objects.requireNonNull(handle.receiverType.cast(holder)), 175 handle.fieldOffset{#if[Value]?, handle.fieldType}, 176 {#if[Object]?checkCast(handle, value):value}); 177 } 178 179 @ForceInline 180 static void setRelease(VarHandle ob, Object holder, $type$ value) { 181 FieldInstanceReadWrite handle = (FieldInstanceReadWrite)ob; 182 UNSAFE.put$Type$Release(Objects.requireNonNull(handle.receiverType.cast(holder)), 183 handle.fieldOffset{#if[Value]?, handle.fieldType}, 184 {#if[Object]?checkCast(handle, value):value}); 185 } 186 #if[CAS] 187 188 @ForceInline 189 static boolean compareAndSet(VarHandle ob, Object holder, $type$ expected, $type$ value) { 190 FieldInstanceReadWrite handle = (FieldInstanceReadWrite)ob; 191 return UNSAFE.compareAndSet$Type$(Objects.requireNonNull(handle.receiverType.cast(holder)), 192 handle.fieldOffset{#if[Object]?, handle.fieldType}, 193 {#if[Object]?checkCast(handle, expected):expected}, 194 {#if[Object]?checkCast(handle, value):value}); 195 } 196 197 @ForceInline 198 static $type$ compareAndExchange(VarHandle ob, Object holder, $type$ expected, $type$ value) { 199 FieldInstanceReadWrite handle = (FieldInstanceReadWrite)ob; 200 return UNSAFE.compareAndExchange$Type$(Objects.requireNonNull(handle.receiverType.cast(holder)), 201 handle.fieldOffset{#if[Object]?, handle.fieldType}, 202 {#if[Object]?checkCast(handle, expected):expected}, 203 {#if[Object]?checkCast(handle, value):value}); 204 } 205 206 @ForceInline 207 static $type$ compareAndExchangeAcquire(VarHandle ob, Object holder, $type$ expected, $type$ value) { 208 FieldInstanceReadWrite handle = (FieldInstanceReadWrite)ob; 209 return UNSAFE.compareAndExchange$Type$Acquire(Objects.requireNonNull(handle.receiverType.cast(holder)), 210 handle.fieldOffset{#if[Object]?, handle.fieldType}, 211 {#if[Object]?checkCast(handle, expected):expected}, 212 {#if[Object]?checkCast(handle, value):value}); 213 } 214 215 @ForceInline 216 static $type$ compareAndExchangeRelease(VarHandle ob, Object holder, $type$ expected, $type$ value) { 217 FieldInstanceReadWrite handle = (FieldInstanceReadWrite)ob; 218 return UNSAFE.compareAndExchange$Type$Release(Objects.requireNonNull(handle.receiverType.cast(holder)), 219 handle.fieldOffset{#if[Object]?, handle.fieldType}, 220 {#if[Object]?checkCast(handle, expected):expected}, 221 {#if[Object]?checkCast(handle, value):value}); 222 } 223 224 @ForceInline 225 static boolean weakCompareAndSetPlain(VarHandle ob, Object holder, $type$ expected, $type$ value) { 226 FieldInstanceReadWrite handle = (FieldInstanceReadWrite)ob; 227 return UNSAFE.weakCompareAndSet$Type$Plain(Objects.requireNonNull(handle.receiverType.cast(holder)), 228 handle.fieldOffset{#if[Object]?, handle.fieldType}, 229 {#if[Object]?checkCast(handle, expected):expected}, 230 {#if[Object]?checkCast(handle, value):value}); 231 } 232 233 @ForceInline 234 static boolean weakCompareAndSet(VarHandle ob, Object holder, $type$ expected, $type$ value) { 235 FieldInstanceReadWrite handle = (FieldInstanceReadWrite)ob; 236 return UNSAFE.weakCompareAndSet$Type$(Objects.requireNonNull(handle.receiverType.cast(holder)), 237 handle.fieldOffset{#if[Object]?, handle.fieldType}, 238 {#if[Object]?checkCast(handle, expected):expected}, 239 {#if[Object]?checkCast(handle, value):value}); 240 } 241 242 @ForceInline 243 static boolean weakCompareAndSetAcquire(VarHandle ob, Object holder, $type$ expected, $type$ value) { 244 FieldInstanceReadWrite handle = (FieldInstanceReadWrite)ob; 245 return UNSAFE.weakCompareAndSet$Type$Acquire(Objects.requireNonNull(handle.receiverType.cast(holder)), 246 handle.fieldOffset{#if[Object]?, handle.fieldType}, 247 {#if[Object]?checkCast(handle, expected):expected}, 248 {#if[Object]?checkCast(handle, value):value}); 249 } 250 251 @ForceInline 252 static boolean weakCompareAndSetRelease(VarHandle ob, Object holder, $type$ expected, $type$ value) { 253 FieldInstanceReadWrite handle = (FieldInstanceReadWrite)ob; 254 return UNSAFE.weakCompareAndSet$Type$Release(Objects.requireNonNull(handle.receiverType.cast(holder)), 255 handle.fieldOffset{#if[Object]?, handle.fieldType}, 256 {#if[Object]?checkCast(handle, expected):expected}, 257 {#if[Object]?checkCast(handle, value):value}); 258 } 259 260 @ForceInline 261 static $type$ getAndSet(VarHandle ob, Object holder, $type$ value) { 262 FieldInstanceReadWrite handle = (FieldInstanceReadWrite)ob; 263 return UNSAFE.getAndSet$Type$(Objects.requireNonNull(handle.receiverType.cast(holder)), 264 handle.fieldOffset{#if[Value]?, handle.fieldType}, 265 {#if[Object]?checkCast(handle, value):value}); 266 } 267 268 @ForceInline 269 static $type$ getAndSetAcquire(VarHandle ob, Object holder, $type$ value) { 270 FieldInstanceReadWrite handle = (FieldInstanceReadWrite)ob; 271 return UNSAFE.getAndSet$Type$Acquire(Objects.requireNonNull(handle.receiverType.cast(holder)), 272 handle.fieldOffset{#if[Value]?, handle.fieldType}, 273 {#if[Object]?checkCast(handle, value):value}); 274 } 275 276 @ForceInline 277 static $type$ getAndSetRelease(VarHandle ob, Object holder, $type$ value) { 278 FieldInstanceReadWrite handle = (FieldInstanceReadWrite)ob; 279 return UNSAFE.getAndSet$Type$Release(Objects.requireNonNull(handle.receiverType.cast(holder)), 280 handle.fieldOffset{#if[Value]?, handle.fieldType}, 281 {#if[Object]?checkCast(handle, value):value}); 282 } 283 #end[CAS] 284 #if[AtomicAdd] 285 286 @ForceInline 287 static $type$ getAndAdd(VarHandle ob, Object holder, $type$ value) { 288 FieldInstanceReadWrite handle = (FieldInstanceReadWrite)ob; 289 return UNSAFE.getAndAdd$Type$(Objects.requireNonNull(handle.receiverType.cast(holder)), 290 handle.fieldOffset, 291 value); 292 } 293 294 @ForceInline 295 static $type$ getAndAddAcquire(VarHandle ob, Object holder, $type$ value) { 296 FieldInstanceReadWrite handle = (FieldInstanceReadWrite)ob; 297 return UNSAFE.getAndAdd$Type$Acquire(Objects.requireNonNull(handle.receiverType.cast(holder)), 298 handle.fieldOffset, 299 value); 300 } 301 302 @ForceInline 303 static $type$ getAndAddRelease(VarHandle ob, Object holder, $type$ value) { 304 FieldInstanceReadWrite handle = (FieldInstanceReadWrite)ob; 305 return UNSAFE.getAndAdd$Type$Release(Objects.requireNonNull(handle.receiverType.cast(holder)), 306 handle.fieldOffset, 307 value); 308 } 309 310 #end[AtomicAdd] 311 #if[Bitwise] 312 313 @ForceInline 314 static $type$ getAndBitwiseOr(VarHandle ob, Object holder, $type$ value) { 315 FieldInstanceReadWrite handle = (FieldInstanceReadWrite)ob; 316 return UNSAFE.getAndBitwiseOr$Type$(Objects.requireNonNull(handle.receiverType.cast(holder)), 317 handle.fieldOffset, 318 value); 319 } 320 321 @ForceInline 322 static $type$ getAndBitwiseOrRelease(VarHandle ob, Object holder, $type$ value) { 323 FieldInstanceReadWrite handle = (FieldInstanceReadWrite)ob; 324 return UNSAFE.getAndBitwiseOr$Type$Release(Objects.requireNonNull(handle.receiverType.cast(holder)), 325 handle.fieldOffset, 326 value); 327 } 328 329 @ForceInline 330 static $type$ getAndBitwiseOrAcquire(VarHandle ob, Object holder, $type$ value) { 331 FieldInstanceReadWrite handle = (FieldInstanceReadWrite)ob; 332 return UNSAFE.getAndBitwiseOr$Type$Acquire(Objects.requireNonNull(handle.receiverType.cast(holder)), 333 handle.fieldOffset, 334 value); 335 } 336 337 @ForceInline 338 static $type$ getAndBitwiseAnd(VarHandle ob, Object holder, $type$ value) { 339 FieldInstanceReadWrite handle = (FieldInstanceReadWrite)ob; 340 return UNSAFE.getAndBitwiseAnd$Type$(Objects.requireNonNull(handle.receiverType.cast(holder)), 341 handle.fieldOffset, 342 value); 343 } 344 345 @ForceInline 346 static $type$ getAndBitwiseAndRelease(VarHandle ob, Object holder, $type$ value) { 347 FieldInstanceReadWrite handle = (FieldInstanceReadWrite)ob; 348 return UNSAFE.getAndBitwiseAnd$Type$Release(Objects.requireNonNull(handle.receiverType.cast(holder)), 349 handle.fieldOffset, 350 value); 351 } 352 353 @ForceInline 354 static $type$ getAndBitwiseAndAcquire(VarHandle ob, Object holder, $type$ value) { 355 FieldInstanceReadWrite handle = (FieldInstanceReadWrite)ob; 356 return UNSAFE.getAndBitwiseAnd$Type$Acquire(Objects.requireNonNull(handle.receiverType.cast(holder)), 357 handle.fieldOffset, 358 value); 359 } 360 361 @ForceInline 362 static $type$ getAndBitwiseXor(VarHandle ob, Object holder, $type$ value) { 363 FieldInstanceReadWrite handle = (FieldInstanceReadWrite)ob; 364 return UNSAFE.getAndBitwiseXor$Type$(Objects.requireNonNull(handle.receiverType.cast(holder)), 365 handle.fieldOffset, 366 value); 367 } 368 369 @ForceInline 370 static $type$ getAndBitwiseXorRelease(VarHandle ob, Object holder, $type$ value) { 371 FieldInstanceReadWrite handle = (FieldInstanceReadWrite)ob; 372 return UNSAFE.getAndBitwiseXor$Type$Release(Objects.requireNonNull(handle.receiverType.cast(holder)), 373 handle.fieldOffset, 374 value); 375 } 376 377 @ForceInline 378 static $type$ getAndBitwiseXorAcquire(VarHandle ob, Object holder, $type$ value) { 379 FieldInstanceReadWrite handle = (FieldInstanceReadWrite)ob; 380 return UNSAFE.getAndBitwiseXor$Type$Acquire(Objects.requireNonNull(handle.receiverType.cast(holder)), 381 handle.fieldOffset, 382 value); 383 } 384 #end[Bitwise] 385 386 static final VarForm FORM = new VarForm(FieldInstanceReadWrite.class, Object.class, $type$.class); 387 } 388 389 390 static sealed class FieldStaticReadOnly extends VarHandle { 391 final Class<?> declaringClass; 392 final Object base; 393 final long fieldOffset; 394 #if[Object] 395 final Class<?> fieldType; 396 #end[Object] 397 398 FieldStaticReadOnly(Class<?> declaringClass, Object base, long fieldOffset{#if[Object]?, Class<?> fieldType}) { 399 this(declaringClass, base, fieldOffset{#if[Object]?, fieldType}, FieldStaticReadOnly.FORM, false); 400 } 401 402 protected FieldStaticReadOnly(Class<?> declaringClass, Object base, long fieldOffset{#if[Object]?, Class<?> fieldType}, 403 VarForm form, boolean exact) { 404 super(form, exact); 405 this.declaringClass = declaringClass; 406 this.base = base; 407 this.fieldOffset = fieldOffset; 408 #if[Object] 409 this.fieldType = fieldType; 410 #end[Object] 411 } 412 413 @Override 414 public FieldStaticReadOnly withInvokeExactBehavior() { 415 return hasInvokeExactBehavior() 416 ? this 417 : new FieldStaticReadOnly(declaringClass, base, fieldOffset{#if[Object]?, fieldType}, vform, true); 418 } 419 420 @Override 421 public FieldStaticReadOnly withInvokeBehavior() { 422 return !hasInvokeExactBehavior() 423 ? this 424 : new FieldStaticReadOnly(declaringClass, base, fieldOffset{#if[Object]?, fieldType}, vform, false); 425 } 426 427 @Override 428 public Optional<VarHandleDesc> describeConstable() { 429 var fieldTypeRef = {#if[Object]?fieldType:$type$.class}.describeConstable(); 430 if (!fieldTypeRef.isPresent()) 431 return Optional.empty(); 432 433 // Reflect on this VarHandle to extract the field name 434 var staticField = VarHandles.getStaticFieldFromBaseAndOffset( 435 declaringClass, fieldOffset, {#if[Object]?fieldType:$type$.class}); 436 var declaringTypeRef = declaringClass.describeConstable(); 437 if (!declaringTypeRef.isPresent()) 438 return Optional.empty(); 439 return Optional.of(VarHandleDesc.ofStaticField(declaringTypeRef.get(), staticField.getName(), fieldTypeRef.get())); 440 } 441 442 @Override 443 final MethodType accessModeTypeUncached(AccessType at) { 444 return at.accessModeType(null, {#if[Object]?fieldType:$type$.class}); 445 } 446 447 @ForceInline 448 static $type$ get(VarHandle ob) { 449 FieldStaticReadOnly handle = (FieldStaticReadOnly) ob.target(); 450 return UNSAFE.get$Type$(handle.base, 451 handle.fieldOffset{#if[Value]?, handle.fieldType}); 452 } 453 454 @ForceInline 455 static $type$ getVolatile(VarHandle ob) { 456 FieldStaticReadOnly handle = (FieldStaticReadOnly) ob.target(); 457 return UNSAFE.get$Type$Volatile(handle.base, 458 handle.fieldOffset{#if[Value]?, handle.fieldType}); 459 } 460 461 @ForceInline 462 static $type$ getOpaque(VarHandle ob) { 463 FieldStaticReadOnly handle = (FieldStaticReadOnly) ob.target(); 464 return UNSAFE.get$Type$Opaque(handle.base, 465 handle.fieldOffset{#if[Value]?, handle.fieldType}); 466 } 467 468 @ForceInline 469 static $type$ getAcquire(VarHandle ob) { 470 FieldStaticReadOnly handle = (FieldStaticReadOnly) ob.target(); 471 return UNSAFE.get$Type$Acquire(handle.base, 472 handle.fieldOffset{#if[Value]?, handle.fieldType}); 473 } 474 475 static final VarForm FORM = new VarForm(FieldStaticReadOnly.class, null, $type$.class); 476 } 477 478 static final class FieldStaticReadWrite extends FieldStaticReadOnly { 479 480 FieldStaticReadWrite(Class<?> declaringClass, Object base, long fieldOffset{#if[Object]?, Class<?> fieldType}) { 481 this(declaringClass, base, fieldOffset{#if[Object]?, fieldType}, false); 482 } 483 484 private FieldStaticReadWrite(Class<?> declaringClass, Object base, long fieldOffset{#if[Object]?, Class<?> fieldType}, 485 boolean exact) { 486 super(declaringClass, base, fieldOffset{#if[Object]?, fieldType}, FieldStaticReadWrite.FORM, exact); 487 } 488 489 @Override 490 public FieldStaticReadWrite withInvokeExactBehavior() { 491 return hasInvokeExactBehavior() 492 ? this 493 : new FieldStaticReadWrite(declaringClass, base, fieldOffset{#if[Object]?, fieldType}, true); 494 } 495 496 @Override 497 public FieldStaticReadWrite withInvokeBehavior() { 498 return !hasInvokeExactBehavior() 499 ? this 500 : new FieldStaticReadWrite(declaringClass, base, fieldOffset{#if[Object]?, fieldType}, false); 501 } 502 503 #if[Object] 504 static Object checkCast(FieldStaticReadWrite handle, $type$ value) { 505 return handle.fieldType.cast(value); 506 } 507 #end[Object] 508 509 @ForceInline 510 static void set(VarHandle ob, $type$ value) { 511 FieldStaticReadWrite handle = (FieldStaticReadWrite) ob.target(); 512 UNSAFE.put$Type$(handle.base, 513 handle.fieldOffset{#if[Value]?, handle.fieldType}, 514 {#if[Object]?checkCast(handle, value):value}); 515 } 516 517 @ForceInline 518 static void setVolatile(VarHandle ob, $type$ value) { 519 FieldStaticReadWrite handle = (FieldStaticReadWrite) ob.target(); 520 UNSAFE.put$Type$Volatile(handle.base, 521 handle.fieldOffset{#if[Value]?, handle.fieldType}, 522 {#if[Object]?checkCast(handle, value):value}); 523 } 524 525 @ForceInline 526 static void setOpaque(VarHandle ob, $type$ value) { 527 FieldStaticReadWrite handle = (FieldStaticReadWrite) ob.target(); 528 UNSAFE.put$Type$Opaque(handle.base, 529 handle.fieldOffset{#if[Value]?, handle.fieldType}, 530 {#if[Object]?checkCast(handle, value):value}); 531 } 532 533 @ForceInline 534 static void setRelease(VarHandle ob, $type$ value) { 535 FieldStaticReadWrite handle = (FieldStaticReadWrite) ob.target(); 536 UNSAFE.put$Type$Release(handle.base, 537 handle.fieldOffset{#if[Value]?, handle.fieldType}, 538 {#if[Object]?checkCast(handle, value):value}); 539 } 540 #if[CAS] 541 542 @ForceInline 543 static boolean compareAndSet(VarHandle ob, $type$ expected, $type$ value) { 544 FieldStaticReadWrite handle = (FieldStaticReadWrite) ob.target(); 545 return UNSAFE.compareAndSet$Type$(handle.base, 546 handle.fieldOffset{#if[Object]?, handle.fieldType}, 547 {#if[Object]?checkCast(handle, expected):expected}, 548 {#if[Object]?checkCast(handle, value):value}); 549 } 550 551 552 @ForceInline 553 static $type$ compareAndExchange(VarHandle ob, $type$ expected, $type$ value) { 554 FieldStaticReadWrite handle = (FieldStaticReadWrite) ob.target(); 555 return UNSAFE.compareAndExchange$Type$(handle.base, 556 handle.fieldOffset{#if[Object]?, handle.fieldType}, 557 {#if[Object]?checkCast(handle, expected):expected}, 558 {#if[Object]?checkCast(handle, value):value}); 559 } 560 561 @ForceInline 562 static $type$ compareAndExchangeAcquire(VarHandle ob, $type$ expected, $type$ value) { 563 FieldStaticReadWrite handle = (FieldStaticReadWrite) ob.target(); 564 return UNSAFE.compareAndExchange$Type$Acquire(handle.base, 565 handle.fieldOffset{#if[Object]?, handle.fieldType}, 566 {#if[Object]?checkCast(handle, expected):expected}, 567 {#if[Object]?checkCast(handle, value):value}); 568 } 569 570 @ForceInline 571 static $type$ compareAndExchangeRelease(VarHandle ob, $type$ expected, $type$ value) { 572 FieldStaticReadWrite handle = (FieldStaticReadWrite) ob.target(); 573 return UNSAFE.compareAndExchange$Type$Release(handle.base, 574 handle.fieldOffset{#if[Object]?, handle.fieldType}, 575 {#if[Object]?checkCast(handle, expected):expected}, 576 {#if[Object]?checkCast(handle, value):value}); 577 } 578 579 @ForceInline 580 static boolean weakCompareAndSetPlain(VarHandle ob, $type$ expected, $type$ value) { 581 FieldStaticReadWrite handle = (FieldStaticReadWrite) ob.target(); 582 return UNSAFE.weakCompareAndSet$Type$Plain(handle.base, 583 handle.fieldOffset{#if[Object]?, handle.fieldType}, 584 {#if[Object]?checkCast(handle, expected):expected}, 585 {#if[Object]?checkCast(handle, value):value}); 586 } 587 588 @ForceInline 589 static boolean weakCompareAndSet(VarHandle ob, $type$ expected, $type$ value) { 590 FieldStaticReadWrite handle = (FieldStaticReadWrite) ob.target(); 591 return UNSAFE.weakCompareAndSet$Type$(handle.base, 592 handle.fieldOffset{#if[Object]?, handle.fieldType}, 593 {#if[Object]?checkCast(handle, expected):expected}, 594 {#if[Object]?checkCast(handle, value):value}); 595 } 596 597 @ForceInline 598 static boolean weakCompareAndSetAcquire(VarHandle ob, $type$ expected, $type$ value) { 599 FieldStaticReadWrite handle = (FieldStaticReadWrite) ob.target(); 600 return UNSAFE.weakCompareAndSet$Type$Acquire(handle.base, 601 handle.fieldOffset{#if[Object]?, handle.fieldType}, 602 {#if[Object]?checkCast(handle, expected):expected}, 603 {#if[Object]?checkCast(handle, value):value}); 604 } 605 606 @ForceInline 607 static boolean weakCompareAndSetRelease(VarHandle ob, $type$ expected, $type$ value) { 608 FieldStaticReadWrite handle = (FieldStaticReadWrite) ob.target(); 609 return UNSAFE.weakCompareAndSet$Type$Release(handle.base, 610 handle.fieldOffset{#if[Object]?, handle.fieldType}, 611 {#if[Object]?checkCast(handle, expected):expected}, 612 {#if[Object]?checkCast(handle, value):value}); 613 } 614 615 @ForceInline 616 static $type$ getAndSet(VarHandle ob, $type$ value) { 617 FieldStaticReadWrite handle = (FieldStaticReadWrite) ob.target(); 618 return UNSAFE.getAndSet$Type$(handle.base, 619 handle.fieldOffset{#if[Value]?, handle.fieldType}, 620 {#if[Object]?checkCast(handle, value):value}); 621 } 622 623 @ForceInline 624 static $type$ getAndSetAcquire(VarHandle ob, $type$ value) { 625 FieldStaticReadWrite handle = (FieldStaticReadWrite) ob.target(); 626 return UNSAFE.getAndSet$Type$Acquire(handle.base, 627 handle.fieldOffset{#if[Value]?, handle.fieldType}, 628 {#if[Object]?checkCast(handle, value):value}); 629 } 630 631 @ForceInline 632 static $type$ getAndSetRelease(VarHandle ob, $type$ value) { 633 FieldStaticReadWrite handle = (FieldStaticReadWrite) ob.target(); 634 return UNSAFE.getAndSet$Type$Release(handle.base, 635 handle.fieldOffset{#if[Value]?, handle.fieldType}, 636 {#if[Object]?checkCast(handle, value):value}); 637 } 638 #end[CAS] 639 #if[AtomicAdd] 640 641 @ForceInline 642 static $type$ getAndAdd(VarHandle ob, $type$ value) { 643 FieldStaticReadWrite handle = (FieldStaticReadWrite) ob.target(); 644 return UNSAFE.getAndAdd$Type$(handle.base, 645 handle.fieldOffset, 646 value); 647 } 648 649 @ForceInline 650 static $type$ getAndAddAcquire(VarHandle ob, $type$ value) { 651 FieldStaticReadWrite handle = (FieldStaticReadWrite) ob.target(); 652 return UNSAFE.getAndAdd$Type$Acquire(handle.base, 653 handle.fieldOffset, 654 value); 655 } 656 657 @ForceInline 658 static $type$ getAndAddRelease(VarHandle ob, $type$ value) { 659 FieldStaticReadWrite handle = (FieldStaticReadWrite) ob.target(); 660 return UNSAFE.getAndAdd$Type$Release(handle.base, 661 handle.fieldOffset, 662 value); 663 } 664 #end[AtomicAdd] 665 #if[Bitwise] 666 667 @ForceInline 668 static $type$ getAndBitwiseOr(VarHandle ob, $type$ value) { 669 FieldStaticReadWrite handle = (FieldStaticReadWrite) ob.target(); 670 return UNSAFE.getAndBitwiseOr$Type$(handle.base, 671 handle.fieldOffset, 672 value); 673 } 674 675 @ForceInline 676 static $type$ getAndBitwiseOrRelease(VarHandle ob, $type$ value) { 677 FieldStaticReadWrite handle = (FieldStaticReadWrite) ob.target(); 678 return UNSAFE.getAndBitwiseOr$Type$Release(handle.base, 679 handle.fieldOffset, 680 value); 681 } 682 683 @ForceInline 684 static $type$ getAndBitwiseOrAcquire(VarHandle ob, $type$ value) { 685 FieldStaticReadWrite handle = (FieldStaticReadWrite) ob.target(); 686 return UNSAFE.getAndBitwiseOr$Type$Acquire(handle.base, 687 handle.fieldOffset, 688 value); 689 } 690 691 @ForceInline 692 static $type$ getAndBitwiseAnd(VarHandle ob, $type$ value) { 693 FieldStaticReadWrite handle = (FieldStaticReadWrite) ob.target(); 694 return UNSAFE.getAndBitwiseAnd$Type$(handle.base, 695 handle.fieldOffset, 696 value); 697 } 698 699 @ForceInline 700 static $type$ getAndBitwiseAndRelease(VarHandle ob, $type$ value) { 701 FieldStaticReadWrite handle = (FieldStaticReadWrite) ob.target(); 702 return UNSAFE.getAndBitwiseAnd$Type$Release(handle.base, 703 handle.fieldOffset, 704 value); 705 } 706 707 @ForceInline 708 static $type$ getAndBitwiseAndAcquire(VarHandle ob, $type$ value) { 709 FieldStaticReadWrite handle = (FieldStaticReadWrite) ob.target(); 710 return UNSAFE.getAndBitwiseAnd$Type$Acquire(handle.base, 711 handle.fieldOffset, 712 value); 713 } 714 715 @ForceInline 716 static $type$ getAndBitwiseXor(VarHandle ob, $type$ value) { 717 FieldStaticReadWrite handle = (FieldStaticReadWrite) ob.target(); 718 return UNSAFE.getAndBitwiseXor$Type$(handle.base, 719 handle.fieldOffset, 720 value); 721 } 722 723 @ForceInline 724 static $type$ getAndBitwiseXorRelease(VarHandle ob, $type$ value) { 725 FieldStaticReadWrite handle = (FieldStaticReadWrite) ob.target(); 726 return UNSAFE.getAndBitwiseXor$Type$Release(handle.base, 727 handle.fieldOffset, 728 value); 729 } 730 731 @ForceInline 732 static $type$ getAndBitwiseXorAcquire(VarHandle ob, $type$ value) { 733 FieldStaticReadWrite handle = (FieldStaticReadWrite) ob.target(); 734 return UNSAFE.getAndBitwiseXor$Type$Acquire(handle.base, 735 handle.fieldOffset, 736 value); 737 } 738 #end[Bitwise] 739 740 static final VarForm FORM = new VarForm(FieldStaticReadWrite.class, null, $type$.class); 741 } 742 743 #if[Reference] 744 static VarHandle makeVarHandleValuesArray(Class<?> arrayClass) { 745 Class<?> componentType = arrayClass.getComponentType(); 746 assert UNSAFE.isFlattenedArray(arrayClass); 747 // should cache these VarHandle for performance 748 return VarHandles.makeArrayElementHandle(arrayClass); 749 } 750 #end[Reference] 751 752 static final class Array extends VarHandle { 753 final int abase; 754 final int ashift; 755 #if[Object] 756 final Class<{#if[Object]??:$type$[]}> arrayType; 757 final Class<?> componentType; 758 #end[Object] 759 760 Array(int abase, int ashift{#if[Object]?, Class<?> arrayType}) { 761 this(abase, ashift{#if[Object]?, arrayType}, false); 762 } 763 764 private Array(int abase, int ashift{#if[Object]?, Class<?> arrayType}, boolean exact) { 765 super(Array.FORM, exact); 766 this.abase = abase; 767 this.ashift = ashift; 768 #if[Object] 769 this.arrayType = {#if[Object]?arrayType:$type$[].class}; 770 this.componentType = arrayType.getComponentType(); 771 #end[Object] 772 } 773 774 @Override 775 public Array withInvokeExactBehavior() { 776 return hasInvokeExactBehavior() 777 ? this 778 : new Array(abase, ashift{#if[Object]?, arrayType}, true); 779 } 780 781 @Override 782 public Array withInvokeBehavior() { 783 return !hasInvokeExactBehavior() 784 ? this 785 : new Array(abase, ashift{#if[Object]?, arrayType}, false); 786 } 787 788 @Override 789 public Optional<VarHandleDesc> describeConstable() { 790 var arrayTypeRef = {#if[Object]?arrayType:$type$[].class}.describeConstable(); 791 if (!arrayTypeRef.isPresent()) 792 return Optional.empty(); 793 794 return Optional.of(VarHandleDesc.ofArray(arrayTypeRef.get())); 795 } 796 797 @Override 798 final MethodType accessModeTypeUncached(AccessType at) { 799 return at.accessModeType({#if[Object]?arrayType:$type$[].class}, {#if[Object]?arrayType.getComponentType():$type$.class}, int.class); 800 } 801 802 #if[Object] 803 @ForceInline 804 static Object runtimeTypeCheck(Array handle, Object[] oarray, Object value) { 805 if (handle.arrayType == oarray.getClass()) { 806 // Fast path: static array type same as argument array type 807 return handle.componentType.cast(value); 808 } else { 809 // Slow path: check value against argument array component type 810 return reflectiveTypeCheck(oarray, value); 811 } 812 } 813 814 @ForceInline 815 static Object reflectiveTypeCheck(Object[] oarray, Object value) { 816 try { 817 return oarray.getClass().getComponentType().cast(value); 818 } catch (ClassCastException e) { 819 throw new ArrayStoreException(); 820 } 821 } 822 #end[Object] 823 824 @ForceInline 825 static $type$ get(VarHandle ob, Object oarray, int index) { 826 Array handle = (Array)ob; 827 #if[Object] 828 Object[] array = (Object[]) handle.arrayType.cast(oarray); 829 #else[Object] 830 $type$[] array = ($type$[]) oarray; 831 #end[Object] 832 return array[index]; 833 } 834 835 @ForceInline 836 static void set(VarHandle ob, Object oarray, int index, $type$ value) { 837 Array handle = (Array)ob; 838 #if[Object] 839 Object[] array = (Object[]) handle.arrayType.cast(oarray); 840 #else[Object] 841 $type$[] array = ($type$[]) oarray; 842 #end[Object] 843 #if[Reference] 844 if (UNSAFE.isFlattenedArray(oarray.getClass())) { 845 // for flattened array, delegate to VarHandle of the inline type array 846 VarHandle vh = makeVarHandleValuesArray(oarray.getClass()); 847 vh.set(oarray, index, reflectiveTypeCheck(array, value)); 848 return; 849 } 850 #end[Reference] 851 array[index] = {#if[Object]?runtimeTypeCheck(handle, array, value):value}; 852 } 853 854 @ForceInline 855 static $type$ getVolatile(VarHandle ob, Object oarray, int index) { 856 Array handle = (Array)ob; 857 #if[Object] 858 Object[] array = (Object[]) handle.arrayType.cast(oarray); 859 #else[Object] 860 $type$[] array = ($type$[]) oarray; 861 #end[Object] 862 #if[Reference] 863 if (UNSAFE.isFlattenedArray(oarray.getClass())) { 864 // for flattened array, delegate to VarHandle of the inline type array 865 VarHandle vh = makeVarHandleValuesArray(oarray.getClass()); 866 return vh.getVolatile(oarray, index); 867 } 868 #end[Reference] 869 return UNSAFE.get$Type$Volatile(array, 870 (((long) Preconditions.checkIndex(index, array.length, Preconditions.AIOOBE_FORMATTER)) << handle.ashift) + handle.abase{#if[Value]?, handle.componentType}); 871 } 872 873 @ForceInline 874 static void setVolatile(VarHandle ob, Object oarray, int index, $type$ value) { 875 Array handle = (Array)ob; 876 #if[Object] 877 Object[] array = (Object[]) handle.arrayType.cast(oarray); 878 #else[Object] 879 $type$[] array = ($type$[]) oarray; 880 #end[Object] 881 #if[Reference] 882 if (UNSAFE.isFlattenedArray(oarray.getClass())) { 883 // for flattened array, delegate to VarHandle of the inline type array 884 VarHandle vh = makeVarHandleValuesArray(oarray.getClass()); 885 vh.setVolatile(oarray, index, reflectiveTypeCheck(array, value)); 886 return; 887 } 888 #end[Reference] 889 UNSAFE.put$Type$Volatile(array, 890 (((long) Preconditions.checkIndex(index, array.length, Preconditions.AIOOBE_FORMATTER)) << handle.ashift) + handle.abase{#if[Value]?, handle.componentType}, 891 {#if[Object]?runtimeTypeCheck(handle, array, value):value}); 892 } 893 894 @ForceInline 895 static $type$ getOpaque(VarHandle ob, Object oarray, int index) { 896 Array handle = (Array)ob; 897 #if[Object] 898 Object[] array = (Object[]) handle.arrayType.cast(oarray); 899 #else[Object] 900 $type$[] array = ($type$[]) oarray; 901 #end[Object] 902 #if[Reference] 903 if (UNSAFE.isFlattenedArray(oarray.getClass())) { 904 // for flattened array, delegate to VarHandle of the inline type array 905 VarHandle vh = makeVarHandleValuesArray(oarray.getClass()); 906 return vh.getOpaque(oarray, index); 907 } 908 #end[Reference] 909 return UNSAFE.get$Type$Opaque(array, 910 (((long) Preconditions.checkIndex(index, array.length, Preconditions.AIOOBE_FORMATTER)) << handle.ashift) + handle.abase{#if[Value]?, handle.componentType}); 911 } 912 913 @ForceInline 914 static void setOpaque(VarHandle ob, Object oarray, int index, $type$ value) { 915 Array handle = (Array)ob; 916 #if[Object] 917 Object[] array = (Object[]) handle.arrayType.cast(oarray); 918 #else[Object] 919 $type$[] array = ($type$[]) oarray; 920 #end[Object] 921 #if[Reference] 922 if (UNSAFE.isFlattenedArray(oarray.getClass())) { 923 // for flattened array, delegate to VarHandle of the inline type array 924 VarHandle vh = makeVarHandleValuesArray(oarray.getClass()); 925 vh.setOpaque(oarray, index, reflectiveTypeCheck(array, value)); 926 return; 927 } 928 #end[Reference] 929 UNSAFE.put$Type$Opaque(array, 930 (((long) Preconditions.checkIndex(index, array.length, Preconditions.AIOOBE_FORMATTER)) << handle.ashift) + handle.abase{#if[Value]?, handle.componentType}, 931 {#if[Object]?runtimeTypeCheck(handle, array, value):value}); 932 } 933 934 @ForceInline 935 static $type$ getAcquire(VarHandle ob, Object oarray, int index) { 936 Array handle = (Array)ob; 937 #if[Object] 938 Object[] array = (Object[]) handle.arrayType.cast(oarray); 939 #else[Object] 940 $type$[] array = ($type$[]) oarray; 941 #end[Object] 942 #if[Reference] 943 if (UNSAFE.isFlattenedArray(oarray.getClass())) { 944 // for flattened array, delegate to VarHandle of the inline type array 945 VarHandle vh = makeVarHandleValuesArray(oarray.getClass()); 946 return vh.getAcquire(oarray, index); 947 } 948 #end[Reference] 949 return UNSAFE.get$Type$Acquire(array, 950 (((long) Preconditions.checkIndex(index, array.length, Preconditions.AIOOBE_FORMATTER)) << handle.ashift) + handle.abase{#if[Value]?, handle.componentType}); 951 } 952 953 @ForceInline 954 static void setRelease(VarHandle ob, Object oarray, int index, $type$ value) { 955 Array handle = (Array)ob; 956 #if[Object] 957 Object[] array = (Object[]) handle.arrayType.cast(oarray); 958 #else[Object] 959 $type$[] array = ($type$[]) oarray; 960 #end[Object] 961 #if[Reference] 962 if (UNSAFE.isFlattenedArray(oarray.getClass())) { 963 // for flattened array, delegate to VarHandle of the inline type array 964 VarHandle vh = makeVarHandleValuesArray(oarray.getClass()); 965 vh.setRelease(oarray, index, reflectiveTypeCheck(array, value)); 966 return; 967 } 968 #end[Reference] 969 UNSAFE.put$Type$Release(array, 970 (((long) Preconditions.checkIndex(index, array.length, Preconditions.AIOOBE_FORMATTER)) << handle.ashift) + handle.abase{#if[Value]?, handle.componentType}, 971 {#if[Object]?runtimeTypeCheck(handle, array, value):value}); 972 } 973 #if[CAS] 974 975 @ForceInline 976 static boolean compareAndSet(VarHandle ob, Object oarray, int index, $type$ expected, $type$ value) { 977 Array handle = (Array)ob; 978 #if[Object] 979 Object[] array = (Object[]) handle.arrayType.cast(oarray); 980 #else[Object] 981 $type$[] array = ($type$[]) oarray; 982 #end[Object] 983 #if[Reference] 984 if (UNSAFE.isFlattenedArray(oarray.getClass())) { 985 // for flattened array, delegate to VarHandle of the inline type array 986 VarHandle vh = makeVarHandleValuesArray(oarray.getClass()); 987 return vh.compareAndSet(oarray, index, expected, reflectiveTypeCheck(array, value)); 988 } 989 #end[Reference] 990 return UNSAFE.compareAndSet$Type$(array, 991 (((long) Preconditions.checkIndex(index, array.length, Preconditions.AIOOBE_FORMATTER)) << handle.ashift) + handle.abase{#if[Object]?, handle.componentType}, 992 {#if[Object]?handle.componentType.cast(expected):expected}, 993 {#if[Object]?runtimeTypeCheck(handle, array, value):value}); 994 } 995 996 @ForceInline 997 static $type$ compareAndExchange(VarHandle ob, Object oarray, int index, $type$ expected, $type$ value) { 998 Array handle = (Array)ob; 999 #if[Object] 1000 Object[] array = (Object[]) handle.arrayType.cast(oarray); 1001 #else[Object] 1002 $type$[] array = ($type$[]) oarray; 1003 #end[Object] 1004 #if[Reference] 1005 if (UNSAFE.isFlattenedArray(oarray.getClass())) { 1006 // for flattened array, delegate to VarHandle of the inline type array 1007 VarHandle vh = makeVarHandleValuesArray(oarray.getClass()); 1008 return vh.compareAndExchange(oarray, index, expected, reflectiveTypeCheck(array, value)); 1009 } 1010 #end[Reference] 1011 return UNSAFE.compareAndExchange$Type$(array, 1012 (((long) Preconditions.checkIndex(index, array.length, Preconditions.AIOOBE_FORMATTER)) << handle.ashift) + handle.abase{#if[Object]?, handle.componentType}, 1013 {#if[Object]?handle.componentType.cast(expected):expected}, 1014 {#if[Object]?runtimeTypeCheck(handle, array, value):value}); 1015 } 1016 1017 @ForceInline 1018 static $type$ compareAndExchangeAcquire(VarHandle ob, Object oarray, int index, $type$ expected, $type$ value) { 1019 Array handle = (Array)ob; 1020 #if[Object] 1021 Object[] array = (Object[]) handle.arrayType.cast(oarray); 1022 #else[Object] 1023 $type$[] array = ($type$[]) oarray; 1024 #end[Object] 1025 #if[Reference] 1026 if (UNSAFE.isFlattenedArray(oarray.getClass())) { 1027 // for flattened array, delegate to VarHandle of the inline type array 1028 VarHandle vh = makeVarHandleValuesArray(oarray.getClass()); 1029 return vh.compareAndExchangeAcquire(oarray, index, expected, reflectiveTypeCheck(array, value)); 1030 } 1031 #end[Reference] 1032 return UNSAFE.compareAndExchange$Type$Acquire(array, 1033 (((long) Preconditions.checkIndex(index, array.length, Preconditions.AIOOBE_FORMATTER)) << handle.ashift) + handle.abase{#if[Object]?, handle.componentType}, 1034 {#if[Object]?handle.componentType.cast(expected):expected}, 1035 {#if[Object]?runtimeTypeCheck(handle, array, value):value}); 1036 } 1037 1038 @ForceInline 1039 static $type$ compareAndExchangeRelease(VarHandle ob, Object oarray, int index, $type$ expected, $type$ value) { 1040 Array handle = (Array)ob; 1041 #if[Object] 1042 Object[] array = (Object[]) handle.arrayType.cast(oarray); 1043 #else[Object] 1044 $type$[] array = ($type$[]) oarray; 1045 #end[Object] 1046 #if[Reference] 1047 if (UNSAFE.isFlattenedArray(oarray.getClass())) { 1048 // for flattened array, delegate to VarHandle of the inline type array 1049 VarHandle vh = makeVarHandleValuesArray(oarray.getClass()); 1050 return vh.compareAndExchangeRelease(oarray, index, expected, reflectiveTypeCheck(array, value)); 1051 } 1052 #end[Reference] 1053 return UNSAFE.compareAndExchange$Type$Release(array, 1054 (((long) Preconditions.checkIndex(index, array.length, Preconditions.AIOOBE_FORMATTER)) << handle.ashift) + handle.abase{#if[Object]?, handle.componentType}, 1055 {#if[Object]?handle.componentType.cast(expected):expected}, 1056 {#if[Object]?runtimeTypeCheck(handle, array, value):value}); 1057 } 1058 1059 @ForceInline 1060 static boolean weakCompareAndSetPlain(VarHandle ob, Object oarray, int index, $type$ expected, $type$ value) { 1061 Array handle = (Array)ob; 1062 #if[Object] 1063 Object[] array = (Object[]) handle.arrayType.cast(oarray); 1064 #else[Object] 1065 $type$[] array = ($type$[]) oarray; 1066 #end[Object] 1067 #if[Reference] 1068 if (UNSAFE.isFlattenedArray(oarray.getClass())) { 1069 // for flattened array, delegate to VarHandle of the inline type array 1070 VarHandle vh = makeVarHandleValuesArray(oarray.getClass()); 1071 return vh.weakCompareAndSetPlain(oarray, index, expected, reflectiveTypeCheck(array, value)); 1072 } 1073 #end[Reference] 1074 return UNSAFE.weakCompareAndSet$Type$Plain(array, 1075 (((long) Preconditions.checkIndex(index, array.length, Preconditions.AIOOBE_FORMATTER)) << handle.ashift) + handle.abase{#if[Object]?, handle.componentType}, 1076 {#if[Object]?handle.componentType.cast(expected):expected}, 1077 {#if[Object]?runtimeTypeCheck(handle, array, value):value}); 1078 } 1079 1080 @ForceInline 1081 static boolean weakCompareAndSet(VarHandle ob, Object oarray, int index, $type$ expected, $type$ value) { 1082 Array handle = (Array)ob; 1083 #if[Object] 1084 Object[] array = (Object[]) handle.arrayType.cast(oarray); 1085 #else[Object] 1086 $type$[] array = ($type$[]) oarray; 1087 #end[Object] 1088 #if[Reference] 1089 if (UNSAFE.isFlattenedArray(oarray.getClass())) { 1090 // for flattened array, delegate to VarHandle of the inline type array 1091 VarHandle vh = makeVarHandleValuesArray(oarray.getClass()); 1092 return vh.weakCompareAndSet(oarray, index, expected, reflectiveTypeCheck(array, value)); 1093 } 1094 #end[Reference] 1095 return UNSAFE.weakCompareAndSet$Type$(array, 1096 (((long) Preconditions.checkIndex(index, array.length, Preconditions.AIOOBE_FORMATTER)) << handle.ashift) + handle.abase{#if[Object]?, handle.componentType}, 1097 {#if[Object]?handle.componentType.cast(expected):expected}, 1098 {#if[Object]?runtimeTypeCheck(handle, array, value):value}); 1099 } 1100 1101 @ForceInline 1102 static boolean weakCompareAndSetAcquire(VarHandle ob, Object oarray, int index, $type$ expected, $type$ value) { 1103 Array handle = (Array)ob; 1104 #if[Object] 1105 Object[] array = (Object[]) handle.arrayType.cast(oarray); 1106 #else[Object] 1107 $type$[] array = ($type$[]) oarray; 1108 #end[Object] 1109 #if[Reference] 1110 if (UNSAFE.isFlattenedArray(oarray.getClass())) { 1111 // for flattened array, delegate to VarHandle of the inline type array 1112 VarHandle vh = makeVarHandleValuesArray(oarray.getClass()); 1113 return vh.weakCompareAndSetAcquire(oarray, index, expected, reflectiveTypeCheck(array, value)); 1114 } 1115 #end[Reference] 1116 return UNSAFE.weakCompareAndSet$Type$Acquire(array, 1117 (((long) Preconditions.checkIndex(index, array.length, Preconditions.AIOOBE_FORMATTER)) << handle.ashift) + handle.abase{#if[Object]?, handle.componentType}, 1118 {#if[Object]?handle.componentType.cast(expected):expected}, 1119 {#if[Object]?runtimeTypeCheck(handle, array, value):value}); 1120 } 1121 1122 @ForceInline 1123 static boolean weakCompareAndSetRelease(VarHandle ob, Object oarray, int index, $type$ expected, $type$ value) { 1124 Array handle = (Array)ob; 1125 #if[Object] 1126 Object[] array = (Object[]) handle.arrayType.cast(oarray); 1127 #else[Object] 1128 $type$[] array = ($type$[]) oarray; 1129 #end[Object] 1130 #if[Reference] 1131 if (UNSAFE.isFlattenedArray(oarray.getClass())) { 1132 // for flattened array, delegate to VarHandle of the inline type array 1133 VarHandle vh = makeVarHandleValuesArray(oarray.getClass()); 1134 return vh.weakCompareAndSetRelease(oarray, index, expected, reflectiveTypeCheck(array, value)); 1135 } 1136 #end[Reference] 1137 return UNSAFE.weakCompareAndSet$Type$Release(array, 1138 (((long) Preconditions.checkIndex(index, array.length, Preconditions.AIOOBE_FORMATTER)) << handle.ashift) + handle.abase{#if[Object]?, handle.componentType}, 1139 {#if[Object]?handle.componentType.cast(expected):expected}, 1140 {#if[Object]?runtimeTypeCheck(handle, array, value):value}); 1141 } 1142 1143 @ForceInline 1144 static $type$ getAndSet(VarHandle ob, Object oarray, int index, $type$ value) { 1145 Array handle = (Array)ob; 1146 #if[Object] 1147 Object[] array = (Object[]) handle.arrayType.cast(oarray); 1148 #else[Object] 1149 $type$[] array = ($type$[]) oarray; 1150 #end[Object] 1151 #if[Reference] 1152 if (UNSAFE.isFlattenedArray(oarray.getClass())) { 1153 // for flattened array, delegate to VarHandle of the inline type array 1154 VarHandle vh = makeVarHandleValuesArray(oarray.getClass()); 1155 return vh.getAndSet(oarray, index, reflectiveTypeCheck(array, value)); 1156 } 1157 #end[Reference] 1158 return UNSAFE.getAndSet$Type$(array, 1159 (((long) Preconditions.checkIndex(index, array.length, Preconditions.AIOOBE_FORMATTER)) << handle.ashift) + handle.abase{#if[Value]?, handle.componentType}, 1160 {#if[Object]?runtimeTypeCheck(handle, array, value):value}); 1161 } 1162 1163 @ForceInline 1164 static $type$ getAndSetAcquire(VarHandle ob, Object oarray, int index, $type$ value) { 1165 Array handle = (Array)ob; 1166 #if[Object] 1167 Object[] array = (Object[]) handle.arrayType.cast(oarray); 1168 #else[Object] 1169 $type$[] array = ($type$[]) oarray; 1170 #end[Object] 1171 #if[Reference] 1172 if (UNSAFE.isFlattenedArray(oarray.getClass())) { 1173 // for flattened array, delegate to VarHandle of the inline type array 1174 VarHandle vh = makeVarHandleValuesArray(oarray.getClass()); 1175 return vh.getAndSetAcquire(oarray, index, reflectiveTypeCheck(array, value)); 1176 } 1177 #end[Reference] 1178 return UNSAFE.getAndSet$Type$Acquire(array, 1179 (((long) Preconditions.checkIndex(index, array.length, Preconditions.AIOOBE_FORMATTER)) << handle.ashift) + handle.abase{#if[Value]?, handle.componentType}, 1180 {#if[Object]?runtimeTypeCheck(handle, array, value):value}); 1181 } 1182 1183 @ForceInline 1184 static $type$ getAndSetRelease(VarHandle ob, Object oarray, int index, $type$ value) { 1185 Array handle = (Array)ob; 1186 #if[Object] 1187 Object[] array = (Object[]) handle.arrayType.cast(oarray); 1188 #else[Object] 1189 $type$[] array = ($type$[]) oarray; 1190 #end[Object] 1191 #if[Reference] 1192 if (UNSAFE.isFlattenedArray(oarray.getClass())) { 1193 // for flattened array, delegate to VarHandle of the inline type array 1194 VarHandle vh = makeVarHandleValuesArray(oarray.getClass()); 1195 return vh.getAndSetRelease(oarray, index, reflectiveTypeCheck(array, value)); 1196 } 1197 #end[Reference] 1198 return UNSAFE.getAndSet$Type$Release(array, 1199 (((long) Preconditions.checkIndex(index, array.length, Preconditions.AIOOBE_FORMATTER)) << handle.ashift) + handle.abase{#if[Value]?, handle.componentType}, 1200 {#if[Object]?runtimeTypeCheck(handle, array, value):value}); 1201 } 1202 #end[CAS] 1203 #if[AtomicAdd] 1204 1205 @ForceInline 1206 static $type$ getAndAdd(VarHandle ob, Object oarray, int index, $type$ value) { 1207 Array handle = (Array)ob; 1208 $type$[] array = ($type$[]) oarray; 1209 return UNSAFE.getAndAdd$Type$(array, 1210 (((long) Preconditions.checkIndex(index, array.length, Preconditions.AIOOBE_FORMATTER)) << handle.ashift) + handle.abase, 1211 value); 1212 } 1213 1214 @ForceInline 1215 static $type$ getAndAddAcquire(VarHandle ob, Object oarray, int index, $type$ value) { 1216 Array handle = (Array)ob; 1217 $type$[] array = ($type$[]) oarray; 1218 return UNSAFE.getAndAdd$Type$Acquire(array, 1219 (((long) Preconditions.checkIndex(index, array.length, Preconditions.AIOOBE_FORMATTER)) << handle.ashift) + handle.abase, 1220 value); 1221 } 1222 1223 @ForceInline 1224 static $type$ getAndAddRelease(VarHandle ob, Object oarray, int index, $type$ value) { 1225 Array handle = (Array)ob; 1226 $type$[] array = ($type$[]) oarray; 1227 return UNSAFE.getAndAdd$Type$Release(array, 1228 (((long) Preconditions.checkIndex(index, array.length, Preconditions.AIOOBE_FORMATTER)) << handle.ashift) + handle.abase, 1229 value); 1230 } 1231 #end[AtomicAdd] 1232 #if[Bitwise] 1233 1234 @ForceInline 1235 static $type$ getAndBitwiseOr(VarHandle ob, Object oarray, int index, $type$ value) { 1236 Array handle = (Array)ob; 1237 $type$[] array = ($type$[]) oarray; 1238 return UNSAFE.getAndBitwiseOr$Type$(array, 1239 (((long) Preconditions.checkIndex(index, array.length, Preconditions.AIOOBE_FORMATTER)) << handle.ashift) + handle.abase, 1240 value); 1241 } 1242 1243 @ForceInline 1244 static $type$ getAndBitwiseOrRelease(VarHandle ob, Object oarray, int index, $type$ value) { 1245 Array handle = (Array)ob; 1246 $type$[] array = ($type$[]) oarray; 1247 return UNSAFE.getAndBitwiseOr$Type$Release(array, 1248 (((long) Preconditions.checkIndex(index, array.length, Preconditions.AIOOBE_FORMATTER)) << handle.ashift) + handle.abase, 1249 value); 1250 } 1251 1252 @ForceInline 1253 static $type$ getAndBitwiseOrAcquire(VarHandle ob, Object oarray, int index, $type$ value) { 1254 Array handle = (Array)ob; 1255 $type$[] array = ($type$[]) oarray; 1256 return UNSAFE.getAndBitwiseOr$Type$Acquire(array, 1257 (((long) Preconditions.checkIndex(index, array.length, Preconditions.AIOOBE_FORMATTER)) << handle.ashift) + handle.abase, 1258 value); 1259 } 1260 1261 @ForceInline 1262 static $type$ getAndBitwiseAnd(VarHandle ob, Object oarray, int index, $type$ value) { 1263 Array handle = (Array)ob; 1264 $type$[] array = ($type$[]) oarray; 1265 return UNSAFE.getAndBitwiseAnd$Type$(array, 1266 (((long) Preconditions.checkIndex(index, array.length, Preconditions.AIOOBE_FORMATTER)) << handle.ashift) + handle.abase, 1267 value); 1268 } 1269 1270 @ForceInline 1271 static $type$ getAndBitwiseAndRelease(VarHandle ob, Object oarray, int index, $type$ value) { 1272 Array handle = (Array)ob; 1273 $type$[] array = ($type$[]) oarray; 1274 return UNSAFE.getAndBitwiseAnd$Type$Release(array, 1275 (((long) Preconditions.checkIndex(index, array.length, Preconditions.AIOOBE_FORMATTER)) << handle.ashift) + handle.abase, 1276 value); 1277 } 1278 1279 @ForceInline 1280 static $type$ getAndBitwiseAndAcquire(VarHandle ob, Object oarray, int index, $type$ value) { 1281 Array handle = (Array)ob; 1282 $type$[] array = ($type$[]) oarray; 1283 return UNSAFE.getAndBitwiseAnd$Type$Acquire(array, 1284 (((long) Preconditions.checkIndex(index, array.length, Preconditions.AIOOBE_FORMATTER)) << handle.ashift) + handle.abase, 1285 value); 1286 } 1287 1288 @ForceInline 1289 static $type$ getAndBitwiseXor(VarHandle ob, Object oarray, int index, $type$ value) { 1290 Array handle = (Array)ob; 1291 $type$[] array = ($type$[]) oarray; 1292 return UNSAFE.getAndBitwiseXor$Type$(array, 1293 (((long) Preconditions.checkIndex(index, array.length, Preconditions.AIOOBE_FORMATTER)) << handle.ashift) + handle.abase, 1294 value); 1295 } 1296 1297 @ForceInline 1298 static $type$ getAndBitwiseXorRelease(VarHandle ob, Object oarray, int index, $type$ value) { 1299 Array handle = (Array)ob; 1300 $type$[] array = ($type$[]) oarray; 1301 return UNSAFE.getAndBitwiseXor$Type$Release(array, 1302 (((long) Preconditions.checkIndex(index, array.length, Preconditions.AIOOBE_FORMATTER)) << handle.ashift) + handle.abase, 1303 value); 1304 } 1305 1306 @ForceInline 1307 static $type$ getAndBitwiseXorAcquire(VarHandle ob, Object oarray, int index, $type$ value) { 1308 Array handle = (Array)ob; 1309 $type$[] array = ($type$[]) oarray; 1310 return UNSAFE.getAndBitwiseXor$Type$Acquire(array, 1311 (((long) Preconditions.checkIndex(index, array.length, Preconditions.AIOOBE_FORMATTER)) << handle.ashift) + handle.abase, 1312 value); 1313 } 1314 #end[Bitwise] 1315 1316 static final VarForm FORM = new VarForm(Array.class, {#if[Object]?Object[].class:$type$[].class}, {#if[Object]?Object.class:$type$.class}, int.class); 1317 } 1318 }