1 /*
   2  * Copyright (c) 2015, 2017, 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.util.Objects;
  31 
  32 import static java.lang.invoke.MethodHandleStatics.UNSAFE;
  33 
  34 #warn
  35 
  36 final class VarHandle$Type$s {
  37 
  38     static class FieldInstanceReadOnly extends VarHandle {
  39         final long fieldOffset;
  40         final Class<?> receiverType;
  41 #if[Object]
  42         final Class<?> fieldType;
  43 #end[Object]
  44 
  45         FieldInstanceReadOnly(Class<?> receiverType, long fieldOffset{#if[Object]?, Class<?> fieldType}) {
  46             this(receiverType, fieldOffset{#if[Object]?, fieldType}, FieldInstanceReadOnly.FORM);
  47         }
  48 
  49         protected FieldInstanceReadOnly(Class<?> receiverType, long fieldOffset{#if[Object]?, Class<?> fieldType},
  50                                         VarForm form) {
  51             super(form);
  52             this.fieldOffset = fieldOffset;
  53             this.receiverType = receiverType;
  54 #if[Object]
  55             this.fieldType = fieldType;
  56 #end[Object]
  57         }
  58 
  59         @Override
  60         final MethodType accessModeTypeUncached(AccessMode accessMode) {
  61             return accessMode.at.accessModeType(receiverType, {#if[Object]?fieldType:$type$.class});
  62         }
  63 
  64         @ForceInline
  65         static $type$ get(FieldInstanceReadOnly handle, Object holder) {
  66             return UNSAFE.get$Type$(Objects.requireNonNull(handle.receiverType.cast(holder)),
  67                                  handle.fieldOffset);
  68         }
  69 
  70         @ForceInline
  71         static $type$ getVolatile(FieldInstanceReadOnly handle, Object holder) {
  72             return UNSAFE.get$Type$Volatile(Objects.requireNonNull(handle.receiverType.cast(holder)),
  73                                  handle.fieldOffset);
  74         }
  75 
  76         @ForceInline
  77         static $type$ getOpaque(FieldInstanceReadOnly handle, Object holder) {
  78             return UNSAFE.get$Type$Opaque(Objects.requireNonNull(handle.receiverType.cast(holder)),
  79                                  handle.fieldOffset);
  80         }
  81 
  82         @ForceInline
  83         static $type$ getAcquire(FieldInstanceReadOnly handle, Object holder) {
  84             return UNSAFE.get$Type$Acquire(Objects.requireNonNull(handle.receiverType.cast(holder)),
  85                                  handle.fieldOffset);
  86         }
  87 
  88         static final VarForm FORM = new VarForm(FieldInstanceReadOnly.class, Object.class, $type$.class);
  89     }
  90 
  91     static final class FieldInstanceReadWrite extends FieldInstanceReadOnly {
  92 
  93         FieldInstanceReadWrite(Class<?> receiverType, long fieldOffset{#if[Object]?, Class<?> fieldType}) {
  94             super(receiverType, fieldOffset{#if[Object]?, fieldType}, FieldInstanceReadWrite.FORM);
  95         }
  96 
  97         @ForceInline
  98         static void set(FieldInstanceReadWrite handle, Object holder, $type$ value) {
  99             UNSAFE.put$Type$(Objects.requireNonNull(handle.receiverType.cast(holder)),
 100                              handle.fieldOffset,
 101                              {#if[Object]?handle.fieldType.cast(value):value});
 102         }
 103 
 104         @ForceInline
 105         static void setVolatile(FieldInstanceReadWrite handle, Object holder, $type$ value) {
 106             UNSAFE.put$Type$Volatile(Objects.requireNonNull(handle.receiverType.cast(holder)),
 107                                      handle.fieldOffset,
 108                                      {#if[Object]?handle.fieldType.cast(value):value});
 109         }
 110 
 111         @ForceInline
 112         static void setOpaque(FieldInstanceReadWrite handle, Object holder, $type$ value) {
 113             UNSAFE.put$Type$Opaque(Objects.requireNonNull(handle.receiverType.cast(holder)),
 114                                    handle.fieldOffset,
 115                                    {#if[Object]?handle.fieldType.cast(value):value});
 116         }
 117 
 118         @ForceInline
 119         static void setRelease(FieldInstanceReadWrite handle, Object holder, $type$ value) {
 120             UNSAFE.put$Type$Release(Objects.requireNonNull(handle.receiverType.cast(holder)),
 121                                     handle.fieldOffset,
 122                                     {#if[Object]?handle.fieldType.cast(value):value});
 123         }
 124 #if[CAS]
 125 
 126         @ForceInline
 127         static boolean compareAndSet(FieldInstanceReadWrite handle, Object holder, $type$ expected, $type$ value) {
 128             return UNSAFE.compareAndSet$Type$(Objects.requireNonNull(handle.receiverType.cast(holder)),
 129                                                handle.fieldOffset,
 130                                                {#if[Object]?handle.fieldType.cast(expected):expected},
 131                                                {#if[Object]?handle.fieldType.cast(value):value});
 132         }
 133 
 134         @ForceInline
 135         static $type$ compareAndExchange(FieldInstanceReadWrite handle, Object holder, $type$ expected, $type$ value) {
 136             return UNSAFE.compareAndExchange$Type$(Objects.requireNonNull(handle.receiverType.cast(holder)),
 137                                                handle.fieldOffset,
 138                                                {#if[Object]?handle.fieldType.cast(expected):expected},
 139                                                {#if[Object]?handle.fieldType.cast(value):value});
 140         }
 141 
 142         @ForceInline
 143         static $type$ compareAndExchangeAcquire(FieldInstanceReadWrite handle, Object holder, $type$ expected, $type$ value) {
 144             return UNSAFE.compareAndExchange$Type$Acquire(Objects.requireNonNull(handle.receiverType.cast(holder)),
 145                                                handle.fieldOffset,
 146                                                {#if[Object]?handle.fieldType.cast(expected):expected},
 147                                                {#if[Object]?handle.fieldType.cast(value):value});
 148         }
 149 
 150         @ForceInline
 151         static $type$ compareAndExchangeRelease(FieldInstanceReadWrite handle, Object holder, $type$ expected, $type$ value) {
 152             return UNSAFE.compareAndExchange$Type$Release(Objects.requireNonNull(handle.receiverType.cast(holder)),
 153                                                handle.fieldOffset,
 154                                                {#if[Object]?handle.fieldType.cast(expected):expected},
 155                                                {#if[Object]?handle.fieldType.cast(value):value});
 156         }
 157 
 158         @ForceInline
 159         static boolean weakCompareAndSetPlain(FieldInstanceReadWrite handle, Object holder, $type$ expected, $type$ value) {
 160             return UNSAFE.weakCompareAndSet$Type$Plain(Objects.requireNonNull(handle.receiverType.cast(holder)),
 161                                                handle.fieldOffset,
 162                                                {#if[Object]?handle.fieldType.cast(expected):expected},
 163                                                {#if[Object]?handle.fieldType.cast(value):value});
 164         }
 165 
 166         @ForceInline
 167         static boolean weakCompareAndSet(FieldInstanceReadWrite handle, Object holder, $type$ expected, $type$ value) {
 168             return UNSAFE.weakCompareAndSet$Type$(Objects.requireNonNull(handle.receiverType.cast(holder)),
 169                                                handle.fieldOffset,
 170                                                {#if[Object]?handle.fieldType.cast(expected):expected},
 171                                                {#if[Object]?handle.fieldType.cast(value):value});
 172         }
 173 
 174         @ForceInline
 175         static boolean weakCompareAndSetAcquire(FieldInstanceReadWrite handle, Object holder, $type$ expected, $type$ value) {
 176             return UNSAFE.weakCompareAndSet$Type$Acquire(Objects.requireNonNull(handle.receiverType.cast(holder)),
 177                                                handle.fieldOffset,
 178                                                {#if[Object]?handle.fieldType.cast(expected):expected},
 179                                                {#if[Object]?handle.fieldType.cast(value):value});
 180         }
 181 
 182         @ForceInline
 183         static boolean weakCompareAndSetRelease(FieldInstanceReadWrite handle, Object holder, $type$ expected, $type$ value) {
 184             return UNSAFE.weakCompareAndSet$Type$Release(Objects.requireNonNull(handle.receiverType.cast(holder)),
 185                                                handle.fieldOffset,
 186                                                {#if[Object]?handle.fieldType.cast(expected):expected},
 187                                                {#if[Object]?handle.fieldType.cast(value):value});
 188         }
 189 
 190         @ForceInline
 191         static $type$ getAndSet(FieldInstanceReadWrite handle, Object holder, $type$ value) {
 192             return UNSAFE.getAndSet$Type$(Objects.requireNonNull(handle.receiverType.cast(holder)),
 193                                           handle.fieldOffset,
 194                                           {#if[Object]?handle.fieldType.cast(value):value});
 195         }
 196 
 197         @ForceInline
 198         static $type$ getAndSetAcquire(FieldInstanceReadWrite handle, Object holder, $type$ value) {
 199             return UNSAFE.getAndSet$Type$Acquire(Objects.requireNonNull(handle.receiverType.cast(holder)),
 200                                           handle.fieldOffset,
 201                                           {#if[Object]?handle.fieldType.cast(value):value});
 202         }
 203 
 204         @ForceInline
 205         static $type$ getAndSetRelease(FieldInstanceReadWrite handle, Object holder, $type$ value) {
 206             return UNSAFE.getAndSet$Type$Release(Objects.requireNonNull(handle.receiverType.cast(holder)),
 207                                           handle.fieldOffset,
 208                                           {#if[Object]?handle.fieldType.cast(value):value});
 209         }
 210 #end[CAS]
 211 #if[AtomicAdd]
 212 
 213         @ForceInline
 214         static $type$ getAndAdd(FieldInstanceReadWrite handle, Object holder, $type$ value) {
 215             return UNSAFE.getAndAdd$Type$(Objects.requireNonNull(handle.receiverType.cast(holder)),
 216                                        handle.fieldOffset,
 217                                        value);
 218         }
 219 
 220         @ForceInline
 221         static $type$ getAndAddAcquire(FieldInstanceReadWrite handle, Object holder, $type$ value) {
 222             return UNSAFE.getAndAdd$Type$Acquire(Objects.requireNonNull(handle.receiverType.cast(holder)),
 223                                        handle.fieldOffset,
 224                                        value);
 225         }
 226 
 227         @ForceInline
 228         static $type$ getAndAddRelease(FieldInstanceReadWrite handle, Object holder, $type$ value) {
 229             return UNSAFE.getAndAdd$Type$Release(Objects.requireNonNull(handle.receiverType.cast(holder)),
 230                                        handle.fieldOffset,
 231                                        value);
 232         }
 233 
 234 #end[AtomicAdd]
 235 #if[Bitwise]
 236 
 237         @ForceInline
 238         static $type$ getAndBitwiseOr(FieldInstanceReadWrite handle, Object holder, $type$ value) {
 239             return UNSAFE.getAndBitwiseOr$Type$(Objects.requireNonNull(handle.receiverType.cast(holder)),
 240                                        handle.fieldOffset,
 241                                        value);
 242         }
 243 
 244         @ForceInline
 245         static $type$ getAndBitwiseOrRelease(FieldInstanceReadWrite handle, Object holder, $type$ value) {
 246             return UNSAFE.getAndBitwiseOr$Type$Release(Objects.requireNonNull(handle.receiverType.cast(holder)),
 247                                        handle.fieldOffset,
 248                                        value);
 249         }
 250 
 251         @ForceInline
 252         static $type$ getAndBitwiseOrAcquire(FieldInstanceReadWrite handle, Object holder, $type$ value) {
 253             return UNSAFE.getAndBitwiseOr$Type$Acquire(Objects.requireNonNull(handle.receiverType.cast(holder)),
 254                                        handle.fieldOffset,
 255                                        value);
 256         }
 257 
 258         @ForceInline
 259         static $type$ getAndBitwiseAnd(FieldInstanceReadWrite handle, Object holder, $type$ value) {
 260             return UNSAFE.getAndBitwiseAnd$Type$(Objects.requireNonNull(handle.receiverType.cast(holder)),
 261                                        handle.fieldOffset,
 262                                        value);
 263         }
 264 
 265         @ForceInline
 266         static $type$ getAndBitwiseAndRelease(FieldInstanceReadWrite handle, Object holder, $type$ value) {
 267             return UNSAFE.getAndBitwiseAnd$Type$Release(Objects.requireNonNull(handle.receiverType.cast(holder)),
 268                                        handle.fieldOffset,
 269                                        value);
 270         }
 271 
 272         @ForceInline
 273         static $type$ getAndBitwiseAndAcquire(FieldInstanceReadWrite handle, Object holder, $type$ value) {
 274             return UNSAFE.getAndBitwiseAnd$Type$Acquire(Objects.requireNonNull(handle.receiverType.cast(holder)),
 275                                        handle.fieldOffset,
 276                                        value);
 277         }
 278 
 279         @ForceInline
 280         static $type$ getAndBitwiseXor(FieldInstanceReadWrite handle, Object holder, $type$ value) {
 281             return UNSAFE.getAndBitwiseXor$Type$(Objects.requireNonNull(handle.receiverType.cast(holder)),
 282                                        handle.fieldOffset,
 283                                        value);
 284         }
 285 
 286         @ForceInline
 287         static $type$ getAndBitwiseXorRelease(FieldInstanceReadWrite handle, Object holder, $type$ value) {
 288             return UNSAFE.getAndBitwiseXor$Type$Release(Objects.requireNonNull(handle.receiverType.cast(holder)),
 289                                        handle.fieldOffset,
 290                                        value);
 291         }
 292 
 293         @ForceInline
 294         static $type$ getAndBitwiseXorAcquire(FieldInstanceReadWrite handle, Object holder, $type$ value) {
 295             return UNSAFE.getAndBitwiseXor$Type$Acquire(Objects.requireNonNull(handle.receiverType.cast(holder)),
 296                                        handle.fieldOffset,
 297                                        value);
 298         }
 299 #end[Bitwise]
 300 
 301         static final VarForm FORM = new VarForm(FieldInstanceReadWrite.class, Object.class, $type$.class);
 302     }
 303 
 304 
 305     static class FieldStaticReadOnly extends VarHandle {
 306         final Object base;
 307         final long fieldOffset;
 308 #if[Object]
 309         final Class<?> fieldType;
 310 #end[Object]
 311 
 312         FieldStaticReadOnly(Object base, long fieldOffset{#if[Object]?, Class<?> fieldType}) {
 313             this(base, fieldOffset{#if[Object]?, fieldType}, FieldStaticReadOnly.FORM);
 314         }
 315 
 316         protected FieldStaticReadOnly(Object base, long fieldOffset{#if[Object]?, Class<?> fieldType},
 317                                       VarForm form) {
 318             super(form);
 319             this.base = base;
 320             this.fieldOffset = fieldOffset;
 321 #if[Object]
 322             this.fieldType = fieldType;
 323 #end[Object]
 324         }
 325 
 326         @Override
 327         final MethodType accessModeTypeUncached(AccessMode accessMode) {
 328             return accessMode.at.accessModeType(null, {#if[Object]?fieldType:$type$.class});
 329         }
 330 
 331         @ForceInline
 332         static $type$ get(FieldStaticReadOnly handle) {
 333             return UNSAFE.get$Type$(handle.base,
 334                                  handle.fieldOffset);
 335         }
 336 
 337         @ForceInline
 338         static $type$ getVolatile(FieldStaticReadOnly handle) {
 339             return UNSAFE.get$Type$Volatile(handle.base,
 340                                  handle.fieldOffset);
 341         }
 342 
 343         @ForceInline
 344         static $type$ getOpaque(FieldStaticReadOnly handle) {
 345             return UNSAFE.get$Type$Opaque(handle.base,
 346                                  handle.fieldOffset);
 347         }
 348 
 349         @ForceInline
 350         static $type$ getAcquire(FieldStaticReadOnly handle) {
 351             return UNSAFE.get$Type$Acquire(handle.base,
 352                                  handle.fieldOffset);
 353         }
 354 
 355         static final VarForm FORM = new VarForm(FieldStaticReadOnly.class, null, $type$.class);
 356     }
 357 
 358     static final class FieldStaticReadWrite extends FieldStaticReadOnly {
 359 
 360         FieldStaticReadWrite(Object base, long fieldOffset{#if[Object]?, Class<?> fieldType}) {
 361             super(base, fieldOffset{#if[Object]?, fieldType}, FieldStaticReadWrite.FORM);
 362         }
 363 
 364         @ForceInline
 365         static void set(FieldStaticReadWrite handle, $type$ value) {
 366             UNSAFE.put$Type$(handle.base,
 367                              handle.fieldOffset,
 368                              {#if[Object]?handle.fieldType.cast(value):value});
 369         }
 370 
 371         @ForceInline
 372         static void setVolatile(FieldStaticReadWrite handle, $type$ value) {
 373             UNSAFE.put$Type$Volatile(handle.base,
 374                                      handle.fieldOffset,
 375                                      {#if[Object]?handle.fieldType.cast(value):value});
 376         }
 377 
 378         @ForceInline
 379         static void setOpaque(FieldStaticReadWrite handle, $type$ value) {
 380             UNSAFE.put$Type$Opaque(handle.base,
 381                                    handle.fieldOffset,
 382                                    {#if[Object]?handle.fieldType.cast(value):value});
 383         }
 384 
 385         @ForceInline
 386         static void setRelease(FieldStaticReadWrite handle, $type$ value) {
 387             UNSAFE.put$Type$Release(handle.base,
 388                                     handle.fieldOffset,
 389                                     {#if[Object]?handle.fieldType.cast(value):value});
 390         }
 391 #if[CAS]
 392 
 393         @ForceInline
 394         static boolean compareAndSet(FieldStaticReadWrite handle, $type$ expected, $type$ value) {
 395             return UNSAFE.compareAndSet$Type$(handle.base,
 396                                                handle.fieldOffset,
 397                                                {#if[Object]?handle.fieldType.cast(expected):expected},
 398                                                {#if[Object]?handle.fieldType.cast(value):value});
 399         }
 400 
 401 
 402         @ForceInline
 403         static $type$ compareAndExchange(FieldStaticReadWrite handle, $type$ expected, $type$ value) {
 404             return UNSAFE.compareAndExchange$Type$(handle.base,
 405                                                handle.fieldOffset,
 406                                                {#if[Object]?handle.fieldType.cast(expected):expected},
 407                                                {#if[Object]?handle.fieldType.cast(value):value});
 408         }
 409 
 410         @ForceInline
 411         static $type$ compareAndExchangeAcquire(FieldStaticReadWrite handle, $type$ expected, $type$ value) {
 412             return UNSAFE.compareAndExchange$Type$Acquire(handle.base,
 413                                                handle.fieldOffset,
 414                                                {#if[Object]?handle.fieldType.cast(expected):expected},
 415                                                {#if[Object]?handle.fieldType.cast(value):value});
 416         }
 417 
 418         @ForceInline
 419         static $type$ compareAndExchangeRelease(FieldStaticReadWrite handle, $type$ expected, $type$ value) {
 420             return UNSAFE.compareAndExchange$Type$Release(handle.base,
 421                                                handle.fieldOffset,
 422                                                {#if[Object]?handle.fieldType.cast(expected):expected},
 423                                                {#if[Object]?handle.fieldType.cast(value):value});
 424         }
 425 
 426         @ForceInline
 427         static boolean weakCompareAndSetPlain(FieldStaticReadWrite handle, $type$ expected, $type$ value) {
 428             return UNSAFE.weakCompareAndSet$Type$Plain(handle.base,
 429                                                handle.fieldOffset,
 430                                                {#if[Object]?handle.fieldType.cast(expected):expected},
 431                                                {#if[Object]?handle.fieldType.cast(value):value});
 432         }
 433 
 434         @ForceInline
 435         static boolean weakCompareAndSet(FieldStaticReadWrite handle, $type$ expected, $type$ value) {
 436             return UNSAFE.weakCompareAndSet$Type$(handle.base,
 437                                                handle.fieldOffset,
 438                                                {#if[Object]?handle.fieldType.cast(expected):expected},
 439                                                {#if[Object]?handle.fieldType.cast(value):value});
 440         }
 441 
 442         @ForceInline
 443         static boolean weakCompareAndSetAcquire(FieldStaticReadWrite handle, $type$ expected, $type$ value) {
 444             return UNSAFE.weakCompareAndSet$Type$Acquire(handle.base,
 445                                                handle.fieldOffset,
 446                                                {#if[Object]?handle.fieldType.cast(expected):expected},
 447                                                {#if[Object]?handle.fieldType.cast(value):value});
 448         }
 449 
 450         @ForceInline
 451         static boolean weakCompareAndSetRelease(FieldStaticReadWrite handle, $type$ expected, $type$ value) {
 452             return UNSAFE.weakCompareAndSet$Type$Release(handle.base,
 453                                                handle.fieldOffset,
 454                                                {#if[Object]?handle.fieldType.cast(expected):expected},
 455                                                {#if[Object]?handle.fieldType.cast(value):value});
 456         }
 457 
 458         @ForceInline
 459         static $type$ getAndSet(FieldStaticReadWrite handle, $type$ value) {
 460             return UNSAFE.getAndSet$Type$(handle.base,
 461                                           handle.fieldOffset,
 462                                           {#if[Object]?handle.fieldType.cast(value):value});
 463         }
 464 
 465         @ForceInline
 466         static $type$ getAndSetAcquire(FieldStaticReadWrite handle, $type$ value) {
 467             return UNSAFE.getAndSet$Type$Acquire(handle.base,
 468                                           handle.fieldOffset,
 469                                           {#if[Object]?handle.fieldType.cast(value):value});
 470         }
 471 
 472         @ForceInline
 473         static $type$ getAndSetRelease(FieldStaticReadWrite handle, $type$ value) {
 474             return UNSAFE.getAndSet$Type$Release(handle.base,
 475                                           handle.fieldOffset,
 476                                           {#if[Object]?handle.fieldType.cast(value):value});
 477         }
 478 #end[CAS]
 479 #if[AtomicAdd]
 480 
 481         @ForceInline
 482         static $type$ getAndAdd(FieldStaticReadWrite handle, $type$ value) {
 483             return UNSAFE.getAndAdd$Type$(handle.base,
 484                                        handle.fieldOffset,
 485                                        value);
 486         }
 487 
 488         @ForceInline
 489         static $type$ getAndAddAcquire(FieldStaticReadWrite handle, $type$ value) {
 490             return UNSAFE.getAndAdd$Type$Acquire(handle.base,
 491                                        handle.fieldOffset,
 492                                        value);
 493         }
 494 
 495         @ForceInline
 496         static $type$ getAndAddRelease(FieldStaticReadWrite handle, $type$ value) {
 497             return UNSAFE.getAndAdd$Type$Release(handle.base,
 498                                        handle.fieldOffset,
 499                                        value);
 500         }
 501 #end[AtomicAdd]
 502 #if[Bitwise]
 503 
 504         @ForceInline
 505         static $type$ getAndBitwiseOr(FieldStaticReadWrite handle, $type$ value) {
 506             return UNSAFE.getAndBitwiseOr$Type$(handle.base,
 507                                        handle.fieldOffset,
 508                                        value);
 509         }
 510 
 511         @ForceInline
 512         static $type$ getAndBitwiseOrRelease(FieldStaticReadWrite handle, $type$ value) {
 513             return UNSAFE.getAndBitwiseOr$Type$Release(handle.base,
 514                                        handle.fieldOffset,
 515                                        value);
 516         }
 517 
 518         @ForceInline
 519         static $type$ getAndBitwiseOrAcquire(FieldStaticReadWrite handle, $type$ value) {
 520             return UNSAFE.getAndBitwiseOr$Type$Acquire(handle.base,
 521                                        handle.fieldOffset,
 522                                        value);
 523         }
 524 
 525         @ForceInline
 526         static $type$ getAndBitwiseAnd(FieldStaticReadWrite handle, $type$ value) {
 527             return UNSAFE.getAndBitwiseAnd$Type$(handle.base,
 528                                        handle.fieldOffset,
 529                                        value);
 530         }
 531 
 532         @ForceInline
 533         static $type$ getAndBitwiseAndRelease(FieldStaticReadWrite handle, $type$ value) {
 534             return UNSAFE.getAndBitwiseAnd$Type$Release(handle.base,
 535                                        handle.fieldOffset,
 536                                        value);
 537         }
 538 
 539         @ForceInline
 540         static $type$ getAndBitwiseAndAcquire(FieldStaticReadWrite handle, $type$ value) {
 541             return UNSAFE.getAndBitwiseAnd$Type$Acquire(handle.base,
 542                                        handle.fieldOffset,
 543                                        value);
 544         }
 545 
 546         @ForceInline
 547         static $type$ getAndBitwiseXor(FieldStaticReadWrite handle, $type$ value) {
 548             return UNSAFE.getAndBitwiseXor$Type$(handle.base,
 549                                        handle.fieldOffset,
 550                                        value);
 551         }
 552 
 553         @ForceInline
 554         static $type$ getAndBitwiseXorRelease(FieldStaticReadWrite handle, $type$ value) {
 555             return UNSAFE.getAndBitwiseXor$Type$Release(handle.base,
 556                                        handle.fieldOffset,
 557                                        value);
 558         }
 559 
 560         @ForceInline
 561         static $type$ getAndBitwiseXorAcquire(FieldStaticReadWrite handle, $type$ value) {
 562             return UNSAFE.getAndBitwiseXor$Type$Acquire(handle.base,
 563                                        handle.fieldOffset,
 564                                        value);
 565         }
 566 #end[Bitwise]
 567 
 568         static final VarForm FORM = new VarForm(FieldStaticReadWrite.class, null, $type$.class);
 569     }
 570 
 571 #if[Object]
 572     static class ValueFieldInstanceReadOnly extends VarHandle {
 573         final long fieldOffset;
 574         final Class<?> receiverType;
 575         final Class<?> fieldType;
 576 
 577         ValueFieldInstanceReadOnly(Class<?> receiverType, long fieldOffset, Class<?> fieldType) {
 578             this(receiverType, fieldOffset, fieldType, ValueFieldInstanceReadOnly.FORM);
 579         }
 580 
 581         protected ValueFieldInstanceReadOnly(Class<?> receiverType, long fieldOffset, Class<?> fieldType,
 582                                              VarForm form) {
 583             super(form);
 584             this.fieldOffset = fieldOffset;
 585             this.receiverType = receiverType;
 586             this.fieldType = fieldType;
 587         }
 588 
 589         @Override
 590         final MethodType accessModeTypeUncached(AccessMode accessMode) {
 591             return accessMode.at.accessModeType(receiverType, fieldType);
 592         }
 593 
 594         @ForceInline
 595         static Object get(ValueFieldInstanceReadOnly handle, Object holder) {
 596             return UNSAFE.getValue(Objects.requireNonNull(handle.receiverType.cast(holder)),
 597                                   handle.fieldOffset, handle.fieldType);
 598         }
 599 
 600         @ForceInline
 601         static Object getVolatile(ValueFieldInstanceReadOnly handle, Object holder) {
 602             return UNSAFE.getValueVolatile(Objects.requireNonNull(handle.receiverType.cast(holder)),
 603                                            handle.fieldOffset, handle.fieldType);
 604         }
 605 
 606         @ForceInline
 607         static Object getOpaque(ValueFieldInstanceReadOnly handle, Object holder) {
 608             return UNSAFE.getValueOpaque(Objects.requireNonNull(handle.receiverType.cast(holder)),
 609                                          handle.fieldOffset, handle.fieldType);
 610         }
 611 
 612         @ForceInline
 613         static Object getAcquire(ValueFieldInstanceReadOnly handle, Object holder) {
 614             return UNSAFE.getValueAcquire(Objects.requireNonNull(handle.receiverType.cast(holder)),
 615                                           handle.fieldOffset, handle.fieldType);
 616         }
 617 
 618         static final VarForm FORM = new VarForm(ValueFieldInstanceReadOnly.class, Object.class, Object.class);
 619     }
 620 
 621     static final class ValueFieldInstanceReadWrite extends ValueFieldInstanceReadOnly {
 622 
 623         ValueFieldInstanceReadWrite(Class<?> receiverType, long fieldOffset, Class<?> fieldType) {
 624             super(receiverType, fieldOffset, fieldType, ValueFieldInstanceReadWrite.FORM);
 625         }
 626 
 627         @ForceInline
 628         static void set(ValueFieldInstanceReadWrite handle, Object holder, Object value) {
 629             UNSAFE.putValue(Objects.requireNonNull(handle.receiverType.cast(holder)),
 630                             handle.fieldOffset, handle.fieldType,
 631                             handle.fieldType.cast(Objects.requireNonNull(value)));
 632         }
 633 
 634         @ForceInline
 635         static void setVolatile(ValueFieldInstanceReadWrite handle, Object holder, Object value) {
 636             UNSAFE.putValueVolatile(Objects.requireNonNull(handle.receiverType.cast(holder)),
 637                                     handle.fieldOffset, handle.fieldType,
 638                                     handle.fieldType.cast(Objects.requireNonNull(value)));
 639         }
 640 
 641         @ForceInline
 642         static void setOpaque(ValueFieldInstanceReadWrite handle, Object holder, Object value) {
 643             UNSAFE.putValueOpaque(Objects.requireNonNull(handle.receiverType.cast(holder)),
 644                                   handle.fieldOffset, handle.fieldType,
 645                                   handle.fieldType.cast(Objects.requireNonNull(value)));
 646         }
 647 
 648         @ForceInline
 649         static void setRelease(ValueFieldInstanceReadWrite handle, Object holder, $type$ value) {
 650             UNSAFE.putValueRelease(Objects.requireNonNull(handle.receiverType.cast(holder)),
 651                                    handle.fieldOffset, handle.fieldType,
 652                                    handle.fieldType.cast(Objects.requireNonNull(value)));
 653         }
 654 #if[CAS]
 655 
 656         @ForceInline
 657         static boolean compareAndSet(ValueFieldInstanceReadWrite handle, Object holder, $type$ expected, $type$ value) {
 658             return UNSAFE.compareAndSet$Type$(Objects.requireNonNull(handle.receiverType.cast(holder)),
 659                                                handle.fieldOffset,
 660                                                {#if[Object]?handle.fieldType.cast(expected):expected},
 661                                                {#if[Object]?handle.fieldType.cast(value):value});
 662         }
 663 
 664         @ForceInline
 665         static $type$ compareAndExchange(ValueFieldInstanceReadWrite handle, Object holder, $type$ expected, $type$ value) {
 666             return UNSAFE.compareAndExchange$Type$(Objects.requireNonNull(handle.receiverType.cast(holder)),
 667                                                handle.fieldOffset,
 668                                                {#if[Object]?handle.fieldType.cast(expected):expected},
 669                                                {#if[Object]?handle.fieldType.cast(value):value});
 670         }
 671 
 672         @ForceInline
 673         static $type$ compareAndExchangeAcquire(ValueFieldInstanceReadWrite handle, Object holder, $type$ expected, $type$ value) {
 674             return UNSAFE.compareAndExchange$Type$Acquire(Objects.requireNonNull(handle.receiverType.cast(holder)),
 675                                                handle.fieldOffset,
 676                                                {#if[Object]?handle.fieldType.cast(expected):expected},
 677                                                {#if[Object]?handle.fieldType.cast(value):value});
 678         }
 679 
 680         @ForceInline
 681         static $type$ compareAndExchangeRelease(ValueFieldInstanceReadWrite handle, Object holder, $type$ expected, $type$ value) {
 682             return UNSAFE.compareAndExchange$Type$Release(Objects.requireNonNull(handle.receiverType.cast(holder)),
 683                                                handle.fieldOffset,
 684                                                {#if[Object]?handle.fieldType.cast(expected):expected},
 685                                                {#if[Object]?handle.fieldType.cast(value):value});
 686         }
 687 
 688         @ForceInline
 689         static boolean weakCompareAndSetPlain(ValueFieldInstanceReadWrite handle, Object holder, $type$ expected, $type$ value) {
 690             return UNSAFE.weakCompareAndSet$Type$Plain(Objects.requireNonNull(handle.receiverType.cast(holder)),
 691                                                handle.fieldOffset,
 692                                                {#if[Object]?handle.fieldType.cast(expected):expected},
 693                                                {#if[Object]?handle.fieldType.cast(value):value});
 694         }
 695 
 696         @ForceInline
 697         static boolean weakCompareAndSet(ValueFieldInstanceReadWrite handle, Object holder, $type$ expected, $type$ value) {
 698             return UNSAFE.weakCompareAndSet$Type$(Objects.requireNonNull(handle.receiverType.cast(holder)),
 699                                                handle.fieldOffset,
 700                                                {#if[Object]?handle.fieldType.cast(expected):expected},
 701                                                {#if[Object]?handle.fieldType.cast(value):value});
 702         }
 703 
 704         @ForceInline
 705         static boolean weakCompareAndSetAcquire(ValueFieldInstanceReadWrite handle, Object holder, $type$ expected, $type$ value) {
 706             return UNSAFE.weakCompareAndSet$Type$Acquire(Objects.requireNonNull(handle.receiverType.cast(holder)),
 707                                                handle.fieldOffset,
 708                                                {#if[Object]?handle.fieldType.cast(expected):expected},
 709                                                {#if[Object]?handle.fieldType.cast(value):value});
 710         }
 711 
 712         @ForceInline
 713         static boolean weakCompareAndSetRelease(ValueFieldInstanceReadWrite handle, Object holder, $type$ expected, $type$ value) {
 714             return UNSAFE.weakCompareAndSet$Type$Release(Objects.requireNonNull(handle.receiverType.cast(holder)),
 715                                                handle.fieldOffset,
 716                                                {#if[Object]?handle.fieldType.cast(expected):expected},
 717                                                {#if[Object]?handle.fieldType.cast(value):value});
 718         }
 719 
 720         @ForceInline
 721         static $type$ getAndSet(ValueFieldInstanceReadWrite handle, Object holder, $type$ value) {
 722             return UNSAFE.getAndSet$Type$(Objects.requireNonNull(handle.receiverType.cast(holder)),
 723                                           handle.fieldOffset,
 724                                           {#if[Object]?handle.fieldType.cast(value):value});
 725         }
 726 
 727         @ForceInline
 728         static $type$ getAndSetAcquire(ValueFieldInstanceReadWrite handle, Object holder, $type$ value) {
 729             return UNSAFE.getAndSet$Type$Acquire(Objects.requireNonNull(handle.receiverType.cast(holder)),
 730                                           handle.fieldOffset,
 731                                           {#if[Object]?handle.fieldType.cast(value):value});
 732         }
 733 
 734         @ForceInline
 735         static $type$ getAndSetRelease(ValueFieldInstanceReadWrite handle, Object holder, $type$ value) {
 736             return UNSAFE.getAndSet$Type$Release(Objects.requireNonNull(handle.receiverType.cast(holder)),
 737                                           handle.fieldOffset,
 738                                           {#if[Object]?handle.fieldType.cast(value):value});
 739         }
 740 #end[CAS]
 741         static final VarForm FORM = new VarForm(ValueFieldInstanceReadWrite.class, Object.class, Object.class);
 742     }
 743 #end[Object]
 744 
 745     static final class Array extends VarHandle {
 746         final int abase;
 747         final int ashift;
 748 #if[Object]
 749         final Class<{#if[Object]??:$type$[]}> arrayType;
 750         final Class<?> componentType;
 751 #end[Object]
 752 
 753         Array(int abase, int ashift{#if[Object]?, Class<?> arrayType}) {
 754             super(Array.FORM);
 755             this.abase = abase;
 756             this.ashift = ashift;
 757 #if[Object]
 758             this.arrayType = {#if[Object]?arrayType:$type$[].class};
 759             this.componentType = arrayType.getComponentType();
 760 #end[Object]
 761         }
 762 
 763         @Override
 764         final MethodType accessModeTypeUncached(AccessMode accessMode) {
 765             return accessMode.at.accessModeType({#if[Object]?arrayType:$type$[].class}, {#if[Object]?arrayType.getComponentType():$type$.class}, int.class);
 766         }
 767 
 768 #if[Object]
 769         @ForceInline
 770         static Object runtimeTypeCheck(Array handle, Object[] oarray, Object value) {
 771             if (handle.arrayType == oarray.getClass()) {
 772                 // Fast path: static array type same as argument array type
 773                 return handle.componentType.cast(value);
 774             } else {
 775                 // Slow path: check value against argument array component type
 776                 return reflectiveTypeCheck(oarray, value);
 777             }
 778         }
 779 
 780         @ForceInline
 781         static Object reflectiveTypeCheck(Object[] oarray, Object value) {
 782             try {
 783                 return oarray.getClass().getComponentType().cast(value);
 784             } catch (ClassCastException e) {
 785                 throw new ArrayStoreException();
 786             }
 787         }
 788 #end[Object]
 789 
 790         @ForceInline
 791         static $type$ get(Array handle, Object oarray, int index) {
 792 #if[Object]
 793             Object[] array = (Object[]) handle.arrayType.cast(oarray);
 794 #else[Object]
 795             $type$[] array = ($type$[]) oarray;
 796 #end[Object]
 797             return array[index];
 798         }
 799 
 800         @ForceInline
 801         static void set(Array handle, Object oarray, int index, $type$ value) {
 802 #if[Object]
 803             Object[] array = (Object[]) handle.arrayType.cast(oarray);
 804 #else[Object]
 805             $type$[] array = ($type$[]) oarray;
 806 #end[Object]
 807             array[index] = {#if[Object]?handle.componentType.cast(value):value};
 808         }
 809 
 810         @ForceInline
 811         static $type$ getVolatile(Array handle, Object oarray, int index) {
 812 #if[Object]
 813             Object[] array = (Object[]) handle.arrayType.cast(oarray);
 814 #else[Object]
 815             $type$[] array = ($type$[]) oarray;
 816 #end[Object]
 817             return UNSAFE.get$Type$Volatile(array,
 818                     (((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase);
 819         }
 820 
 821         @ForceInline
 822         static void setVolatile(Array handle, Object oarray, int index, $type$ value) {
 823 #if[Object]
 824             Object[] array = (Object[]) handle.arrayType.cast(oarray);
 825 #else[Object]
 826             $type$[] array = ($type$[]) oarray;
 827 #end[Object]
 828             UNSAFE.put$Type$Volatile(array,
 829                     (((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
 830                     {#if[Object]?runtimeTypeCheck(handle, array, value):value});
 831         }
 832 
 833         @ForceInline
 834         static $type$ getOpaque(Array handle, Object oarray, int index) {
 835 #if[Object]
 836             Object[] array = (Object[]) handle.arrayType.cast(oarray);
 837 #else[Object]
 838             $type$[] array = ($type$[]) oarray;
 839 #end[Object]
 840             return UNSAFE.get$Type$Opaque(array,
 841                     (((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase);
 842         }
 843 
 844         @ForceInline
 845         static void setOpaque(Array handle, Object oarray, int index, $type$ value) {
 846 #if[Object]
 847             Object[] array = (Object[]) handle.arrayType.cast(oarray);
 848 #else[Object]
 849             $type$[] array = ($type$[]) oarray;
 850 #end[Object]
 851             UNSAFE.put$Type$Opaque(array,
 852                     (((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
 853                     {#if[Object]?runtimeTypeCheck(handle, array, value):value});
 854         }
 855 
 856         @ForceInline
 857         static $type$ getAcquire(Array handle, Object oarray, int index) {
 858 #if[Object]
 859             Object[] array = (Object[]) handle.arrayType.cast(oarray);
 860 #else[Object]
 861             $type$[] array = ($type$[]) oarray;
 862 #end[Object]
 863             return UNSAFE.get$Type$Acquire(array,
 864                     (((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase);
 865         }
 866 
 867         @ForceInline
 868         static void setRelease(Array handle, Object oarray, int index, $type$ value) {
 869 #if[Object]
 870             Object[] array = (Object[]) handle.arrayType.cast(oarray);
 871 #else[Object]
 872             $type$[] array = ($type$[]) oarray;
 873 #end[Object]
 874             UNSAFE.put$Type$Release(array,
 875                     (((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
 876                     {#if[Object]?runtimeTypeCheck(handle, array, value):value});
 877         }
 878 #if[CAS]
 879 
 880         @ForceInline
 881         static boolean compareAndSet(Array handle, Object oarray, int index, $type$ expected, $type$ value) {
 882 #if[Object]
 883             Object[] array = (Object[]) handle.arrayType.cast(oarray);
 884 #else[Object]
 885             $type$[] array = ($type$[]) oarray;
 886 #end[Object]
 887             return UNSAFE.compareAndSet$Type$(array,
 888                     (((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
 889                     {#if[Object]?handle.componentType.cast(expected):expected},
 890                     {#if[Object]?runtimeTypeCheck(handle, array, value):value});
 891         }
 892 
 893         @ForceInline
 894         static $type$ compareAndExchange(Array handle, Object oarray, int index, $type$ expected, $type$ value) {
 895 #if[Object]
 896             Object[] array = (Object[]) handle.arrayType.cast(oarray);
 897 #else[Object]
 898             $type$[] array = ($type$[]) oarray;
 899 #end[Object]
 900             return UNSAFE.compareAndExchange$Type$(array,
 901                     (((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
 902                     {#if[Object]?handle.componentType.cast(expected):expected},
 903                     {#if[Object]?runtimeTypeCheck(handle, array, value):value});
 904         }
 905 
 906         @ForceInline
 907         static $type$ compareAndExchangeAcquire(Array handle, Object oarray, int index, $type$ expected, $type$ value) {
 908 #if[Object]
 909             Object[] array = (Object[]) handle.arrayType.cast(oarray);
 910 #else[Object]
 911             $type$[] array = ($type$[]) oarray;
 912 #end[Object]
 913             return UNSAFE.compareAndExchange$Type$Acquire(array,
 914                     (((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
 915                     {#if[Object]?handle.componentType.cast(expected):expected},
 916                     {#if[Object]?runtimeTypeCheck(handle, array, value):value});
 917         }
 918 
 919         @ForceInline
 920         static $type$ compareAndExchangeRelease(Array handle, Object oarray, int index, $type$ expected, $type$ value) {
 921 #if[Object]
 922             Object[] array = (Object[]) handle.arrayType.cast(oarray);
 923 #else[Object]
 924             $type$[] array = ($type$[]) oarray;
 925 #end[Object]
 926             return UNSAFE.compareAndExchange$Type$Release(array,
 927                     (((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
 928                     {#if[Object]?handle.componentType.cast(expected):expected},
 929                     {#if[Object]?runtimeTypeCheck(handle, array, value):value});
 930         }
 931 
 932         @ForceInline
 933         static boolean weakCompareAndSetPlain(Array handle, Object oarray, int index, $type$ expected, $type$ value) {
 934 #if[Object]
 935             Object[] array = (Object[]) handle.arrayType.cast(oarray);
 936 #else[Object]
 937             $type$[] array = ($type$[]) oarray;
 938 #end[Object]
 939             return UNSAFE.weakCompareAndSet$Type$Plain(array,
 940                     (((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
 941                     {#if[Object]?handle.componentType.cast(expected):expected},
 942                     {#if[Object]?runtimeTypeCheck(handle, array, value):value});
 943         }
 944 
 945         @ForceInline
 946         static boolean weakCompareAndSet(Array handle, Object oarray, int index, $type$ expected, $type$ value) {
 947 #if[Object]
 948             Object[] array = (Object[]) handle.arrayType.cast(oarray);
 949 #else[Object]
 950             $type$[] array = ($type$[]) oarray;
 951 #end[Object]
 952             return UNSAFE.weakCompareAndSet$Type$(array,
 953                     (((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
 954                     {#if[Object]?handle.componentType.cast(expected):expected},
 955                     {#if[Object]?runtimeTypeCheck(handle, array, value):value});
 956         }
 957 
 958         @ForceInline
 959         static boolean weakCompareAndSetAcquire(Array handle, Object oarray, int index, $type$ expected, $type$ value) {
 960 #if[Object]
 961             Object[] array = (Object[]) handle.arrayType.cast(oarray);
 962 #else[Object]
 963             $type$[] array = ($type$[]) oarray;
 964 #end[Object]
 965             return UNSAFE.weakCompareAndSet$Type$Acquire(array,
 966                     (((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
 967                     {#if[Object]?handle.componentType.cast(expected):expected},
 968                     {#if[Object]?runtimeTypeCheck(handle, array, value):value});
 969         }
 970 
 971         @ForceInline
 972         static boolean weakCompareAndSetRelease(Array handle, Object oarray, int index, $type$ expected, $type$ value) {
 973 #if[Object]
 974             Object[] array = (Object[]) handle.arrayType.cast(oarray);
 975 #else[Object]
 976             $type$[] array = ($type$[]) oarray;
 977 #end[Object]
 978             return UNSAFE.weakCompareAndSet$Type$Release(array,
 979                     (((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
 980                     {#if[Object]?handle.componentType.cast(expected):expected},
 981                     {#if[Object]?runtimeTypeCheck(handle, array, value):value});
 982         }
 983 
 984         @ForceInline
 985         static $type$ getAndSet(Array handle, Object oarray, int index, $type$ value) {
 986 #if[Object]
 987             Object[] array = (Object[]) handle.arrayType.cast(oarray);
 988 #else[Object]
 989             $type$[] array = ($type$[]) oarray;
 990 #end[Object]
 991             return UNSAFE.getAndSet$Type$(array,
 992                     (((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
 993                     {#if[Object]?runtimeTypeCheck(handle, array, value):value});
 994         }
 995 
 996         @ForceInline
 997         static $type$ getAndSetAcquire(Array handle, Object oarray, int index, $type$ value) {
 998 #if[Object]
 999             Object[] array = (Object[]) handle.arrayType.cast(oarray);
1000 #else[Object]
1001             $type$[] array = ($type$[]) oarray;
1002 #end[Object]
1003             return UNSAFE.getAndSet$Type$Acquire(array,
1004                     (((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
1005                     {#if[Object]?runtimeTypeCheck(handle, array, value):value});
1006         }
1007 
1008         @ForceInline
1009         static $type$ getAndSetRelease(Array handle, Object oarray, int index, $type$ value) {
1010 #if[Object]
1011             Object[] array = (Object[]) handle.arrayType.cast(oarray);
1012 #else[Object]
1013             $type$[] array = ($type$[]) oarray;
1014 #end[Object]
1015             return UNSAFE.getAndSet$Type$Release(array,
1016                     (((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
1017                     {#if[Object]?runtimeTypeCheck(handle, array, value):value});
1018         }
1019 #end[CAS]
1020 #if[AtomicAdd]
1021 
1022         @ForceInline
1023         static $type$ getAndAdd(Array handle, Object oarray, int index, $type$ value) {
1024             $type$[] array = ($type$[]) oarray;
1025             return UNSAFE.getAndAdd$Type$(array,
1026                     (((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
1027                     value);
1028         }
1029 
1030         @ForceInline
1031         static $type$ getAndAddAcquire(Array handle, Object oarray, int index, $type$ value) {
1032             $type$[] array = ($type$[]) oarray;
1033             return UNSAFE.getAndAdd$Type$Acquire(array,
1034                     (((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
1035                     value);
1036         }
1037 
1038         @ForceInline
1039         static $type$ getAndAddRelease(Array handle, Object oarray, int index, $type$ value) {
1040             $type$[] array = ($type$[]) oarray;
1041             return UNSAFE.getAndAdd$Type$Release(array,
1042                     (((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
1043                     value);
1044         }
1045 #end[AtomicAdd]
1046 #if[Bitwise]
1047 
1048         @ForceInline
1049         static $type$ getAndBitwiseOr(Array handle, Object oarray, int index, $type$ value) {
1050             $type$[] array = ($type$[]) oarray;
1051             return UNSAFE.getAndBitwiseOr$Type$(array,
1052                                        (((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
1053                                        value);
1054         }
1055 
1056         @ForceInline
1057         static $type$ getAndBitwiseOrRelease(Array handle, Object oarray, int index, $type$ value) {
1058             $type$[] array = ($type$[]) oarray;
1059             return UNSAFE.getAndBitwiseOr$Type$Release(array,
1060                                        (((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
1061                                        value);
1062         }
1063 
1064         @ForceInline
1065         static $type$ getAndBitwiseOrAcquire(Array handle, Object oarray, int index, $type$ value) {
1066             $type$[] array = ($type$[]) oarray;
1067             return UNSAFE.getAndBitwiseOr$Type$Acquire(array,
1068                                        (((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
1069                                        value);
1070         }
1071 
1072         @ForceInline
1073         static $type$ getAndBitwiseAnd(Array handle, Object oarray, int index, $type$ value) {
1074             $type$[] array = ($type$[]) oarray;
1075             return UNSAFE.getAndBitwiseAnd$Type$(array,
1076                                        (((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
1077                                        value);
1078         }
1079 
1080         @ForceInline
1081         static $type$ getAndBitwiseAndRelease(Array handle, Object oarray, int index, $type$ value) {
1082             $type$[] array = ($type$[]) oarray;
1083             return UNSAFE.getAndBitwiseAnd$Type$Release(array,
1084                                        (((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
1085                                        value);
1086         }
1087 
1088         @ForceInline
1089         static $type$ getAndBitwiseAndAcquire(Array handle, Object oarray, int index, $type$ value) {
1090             $type$[] array = ($type$[]) oarray;
1091             return UNSAFE.getAndBitwiseAnd$Type$Acquire(array,
1092                                        (((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
1093                                        value);
1094         }
1095 
1096         @ForceInline
1097         static $type$ getAndBitwiseXor(Array handle, Object oarray, int index, $type$ value) {
1098             $type$[] array = ($type$[]) oarray;
1099             return UNSAFE.getAndBitwiseXor$Type$(array,
1100                                        (((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
1101                                        value);
1102         }
1103 
1104         @ForceInline
1105         static $type$ getAndBitwiseXorRelease(Array handle, Object oarray, int index, $type$ value) {
1106             $type$[] array = ($type$[]) oarray;
1107             return UNSAFE.getAndBitwiseXor$Type$Release(array,
1108                                        (((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
1109                                        value);
1110         }
1111 
1112         @ForceInline
1113         static $type$ getAndBitwiseXorAcquire(Array handle, Object oarray, int index, $type$ value) {
1114             $type$[] array = ($type$[]) oarray;
1115             return UNSAFE.getAndBitwiseXor$Type$Acquire(array,
1116                                        (((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
1117                                        value);
1118         }
1119 #end[Bitwise]
1120 
1121         static final VarForm FORM = new VarForm(Array.class, {#if[Object]?Object[].class:$type$[].class}, {#if[Object]?Object.class:$type$.class}, int.class);
1122     }
1123 }