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