Path: blob/master/jcl/src/java.base/share/classes/java/lang/invoke/ArrayVarHandle.java
12520 views
/*[INCLUDE-IF Sidecar19-SE & !OPENJDK_METHODHANDLES]*/1/*******************************************************************************2* Copyright (c) 2016, 2021 IBM Corp. and others3*4* This program and the accompanying materials are made available under5* the terms of the Eclipse Public License 2.0 which accompanies this6* distribution and is available at https://www.eclipse.org/legal/epl-2.0/7* or the Apache License, Version 2.0 which accompanies this distribution and8* is available at https://www.apache.org/licenses/LICENSE-2.0.9*10* This Source Code may also be made available under the following11* Secondary Licenses when the conditions for such availability set12* forth in the Eclipse Public License, v. 2.0 are satisfied: GNU13* General Public License, version 2 with the GNU Classpath14* Exception [1] and GNU General Public License, version 2 with the15* OpenJDK Assembly Exception [2].16*17* [1] https://www.gnu.org/software/classpath/license.html18* [2] http://openjdk.java.net/legal/assembly-exception.html19*20* SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 OR LicenseRef-GPL-2.0 WITH Assembly-exception21*******************************************************************************/22package java.lang.invoke;2324import static java.lang.invoke.MethodType.methodType;25import static java.lang.invoke.ArrayVarHandle.ArrayVarHandleOperations.*;2627/*[IF JAVA_SPEC_VERSION >= 12]*/28import java.lang.constant.ClassDesc;29import java.util.Optional;30/*[ENDIF] JAVA_SPEC_VERSION >= 12 */3132/**33* {@link VarHandle} subclass for array element {@link VarHandle} instances.34*/35final class ArrayVarHandle extends VarHandle {36/**37* Populates the static MethodHandle[] corresponding to the provided type.38*39* @param arrayType The receiver type to create MethodHandles for. Must be an array type.40* @return The populated MethodHandle[].41*42* @throws NullPointerException if arrayType is null or not an array type.43*/44static final MethodHandle[] populateMHs(Class<?> arrayType) {45Class<? extends ArrayVarHandleOperations> operationsClass = null;46final Class<?> initType = arrayType.getComponentType();47boolean isPrimitiveType = initType.isPrimitive();48Class<?> type = initType;4950if (!isPrimitiveType) {51type = Object.class;52operationsClass = OpObject.class;53} else if (int.class == type) {54operationsClass = OpInt.class;55} else if (long.class == type) {56operationsClass = OpLong.class;57} else if (boolean.class == type) {58operationsClass = OpBoolean.class;59} else if (byte.class == type) {60operationsClass = OpByte.class;61} else if (char.class == type) {62operationsClass = OpChar.class;63} else if (double.class == type) {64operationsClass = OpDouble.class;65} else if (float.class == type) {66operationsClass = OpFloat.class;67} else if (short.class == type) {68operationsClass = OpShort.class;69} else {70/*[MSG "K0626", "Unable to handle type {0}."]*/71throw new InternalError(com.ibm.oti.util.Msg.getString("K0626", type)); //$NON-NLS-1$72}7374/* Populate the MethodHandle[] using MethodHandles to methods in ArrayVarHandleOperations.75* Note: For primitive types, there is no need to clone the MethodHandles with the exact types later76* in populateMHs() as we already know their types here.77*/78Class<?> actualArrayType = (isPrimitiveType) ? arrayType : Object.class;79MethodType getter = methodType(type, actualArrayType, int.class, VarHandle.class);80MethodType setter = methodType(void.class, actualArrayType, int.class, type, VarHandle.class);81MethodType compareAndSet = methodType(boolean.class, actualArrayType, int.class, type, type, VarHandle.class);82MethodType compareAndExchange = compareAndSet.changeReturnType(type);83MethodType getAndSet = setter.changeReturnType(type);84MethodType[] lookupTypes = populateMTs(getter, setter, compareAndSet, compareAndExchange, getAndSet);8586/* References use the type Object, so these MethodTypes need to be specialized to the initial type. */87MethodType[] exactTypes = lookupTypes;88if (!isPrimitiveType) {89MethodType exactGetter = methodType(initType, arrayType, int.class, VarHandle.class);90MethodType exactSetter = methodType(void.class, arrayType, int.class, initType, VarHandle.class);91MethodType exactCompareAndSet = methodType(boolean.class, arrayType, int.class, initType, initType, VarHandle.class);92MethodType exactCompareAndExchange = exactCompareAndSet.changeReturnType(initType);93MethodType exactGetAndSet = exactSetter.changeReturnType(initType);94exactTypes = populateMTs(exactGetter, exactSetter, exactCompareAndSet, exactCompareAndExchange, exactGetAndSet);95}96return populateMHs(operationsClass, lookupTypes, exactTypes);97}9899/**100* Constructs a VarHandle that can access elements of an array101*102* @param arrayType The array type (i.e. not the componentType) this VarHandle will access.103*/104ArrayVarHandle(Class<?> arrayType) {105super(arrayType.getComponentType(), new Class<?>[] {arrayType, int.class}, populateMHs(arrayType), 0);106}107108/*[IF JAVA_SPEC_VERSION >= 12]*/109@Override110public Optional<VarHandleDesc> describeConstable() {111VarHandleDesc result = null;112/* coordinateTypes[0] contains array type */113Optional<ClassDesc> descOp = coordinateTypes[0].describeConstable();114if (descOp.isPresent()) {115result = VarHandleDesc.ofArray(descOp.get());116}117return Optional.ofNullable(result);118}119/*[ENDIF] JAVA_SPEC_VERSION >= 12 */120121/*[IF JAVA_SPEC_VERSION >= 16]*/122public VarHandle withInvokeExactBehavior() {123throw OpenJDKCompileStub.OpenJDKCompileStubThrowError();124}125126public VarHandle withInvokeBehavior() {127throw OpenJDKCompileStub.OpenJDKCompileStubThrowError();128}129/*[ENDIF] JAVA_SPEC_VERSION >= 16 */130131/**132* Type specific methods used by array element VarHandle methods.133*/134@SuppressWarnings("unused")135static class ArrayVarHandleOperations extends VarHandleOperations {136static final void boundsCheck(int arrayLength, long index) {137if ((index < 0) || (index >= arrayLength)) {138throw newArrayIndexOutOfBoundsException(arrayLength, index);139}140}141142static final long computeOffset(int index, int baseOffset, int indexScale) {143return baseOffset + ((long)index * indexScale);144}145146private static final ArrayIndexOutOfBoundsException newArrayIndexOutOfBoundsException(int arrayLength, long index) {147/*[MSG "K0622", "Index {0}, array length {1}."]*/148return new ArrayIndexOutOfBoundsException(com.ibm.oti.util.Msg.getString("K0622", java.lang.Long.toString(index), Integer.toString(arrayLength))); //$NON-NLS-1$149}150151static final void storeCheck(Object value, Class<?> fieldType) {152if (null != value) {153Class<?> actualType = value.getClass();154if (!fieldType.isAssignableFrom(actualType)) {155throw newArrayStoreException(fieldType, actualType);156}157}158}159160private static final ArrayStoreException newArrayStoreException(Class<?> fieldType, Class<?> actualType) {161/*[MSG "K0630", "Incorrect type - expected {0}, was {1}."]*/162return new ArrayStoreException(com.ibm.oti.util.Msg.getString("K0630", fieldType, actualType)); //$NON-NLS-1$163}164165static final class OpObject extends ArrayVarHandleOperations {166private static final int BASE_OFFSET = _unsafe.arrayBaseOffset(Object[].class);167private static final int INDEX_SCALE = _unsafe.arrayIndexScale(Object[].class);168169private static final long computeOffset(int index) {170return computeOffset(index, BASE_OFFSET, INDEX_SCALE);171}172173private static final Object get(Object receiver, int index, VarHandle varHandle) {174receiver.getClass();175boundsCheck(((Object[])receiver).length, index);176return _unsafe.getObject(receiver, computeOffset(index));177}178179private static final void set(Object receiver, int index, Object value, VarHandle varHandle) {180receiver.getClass();181boundsCheck(((Object[])receiver).length, index);182storeCheck(value, receiver.getClass().getComponentType());183_unsafe.putObject(receiver, computeOffset(index), value);184}185186private static final Object getVolatile(Object receiver, int index, VarHandle varHandle) {187receiver.getClass();188boundsCheck(((Object[])receiver).length, index);189return _unsafe.getObjectVolatile(receiver, computeOffset(index));190}191192private static final void setVolatile(Object receiver, int index, Object value, VarHandle varHandle) {193receiver.getClass();194boundsCheck(((Object[])receiver).length, index);195storeCheck(value, receiver.getClass().getComponentType());196_unsafe.putObjectVolatile(receiver, computeOffset(index), value);197}198199private static final Object getOpaque(Object receiver, int index, VarHandle varHandle) {200receiver.getClass();201boundsCheck(((Object[])receiver).length, index);202return _unsafe.getObjectOpaque(receiver, computeOffset(index));203}204205private static final void setOpaque(Object receiver, int index, Object value, VarHandle varHandle) {206receiver.getClass();207boundsCheck(((Object[])receiver).length, index);208storeCheck(value, receiver.getClass().getComponentType());209_unsafe.putObjectOpaque(receiver, computeOffset(index), value);210}211212private static final Object getAcquire(Object receiver, int index, VarHandle varHandle) {213receiver.getClass();214boundsCheck(((Object[])receiver).length, index);215return _unsafe.getObjectAcquire(receiver, computeOffset(index));216}217218private static final void setRelease(Object receiver, int index, Object value, VarHandle varHandle) {219receiver.getClass();220boundsCheck(((Object[])receiver).length, index);221storeCheck(value, receiver.getClass().getComponentType());222_unsafe.putObjectRelease(receiver, computeOffset(index), value);223}224225private static final boolean compareAndSet(Object receiver, int index, Object testValue, Object newValue, VarHandle varHandle) {226receiver.getClass();227boundsCheck(((Object[])receiver).length, index);228storeCheck(newValue, receiver.getClass().getComponentType());229/*[IF Sidecar19-SE-OpenJ9]*/230return _unsafe.compareAndSetObject(receiver, computeOffset(index), testValue, newValue);231/*[ELSE]232return _unsafe.compareAndSwapObject(receiver, computeOffset(index), testValue, newValue);233/*[ENDIF]*/234}235236private static final Object compareAndExchange(Object receiver, int index, Object testValue, Object newValue, VarHandle varHandle) {237receiver.getClass();238boundsCheck(((Object[])receiver).length, index);239storeCheck(newValue, receiver.getClass().getComponentType());240/*[IF Sidecar19-SE-OpenJ9]*/241return _unsafe.compareAndExchangeObject(receiver, computeOffset(index), testValue, newValue);242/*[ELSE]243return _unsafe.compareAndExchangeObjectVolatile(receiver, computeOffset(index), testValue, newValue);244/*[ENDIF]*/245}246247private static final Object compareAndExchangeAcquire(Object receiver, int index, Object testValue, Object newValue, VarHandle varHandle) {248receiver.getClass();249boundsCheck(((Object[])receiver).length, index);250storeCheck(newValue, receiver.getClass().getComponentType());251return _unsafe.compareAndExchangeObjectAcquire(receiver, computeOffset(index), testValue, newValue);252}253254private static final Object compareAndExchangeRelease(Object receiver, int index, Object testValue, Object newValue, VarHandle varHandle) {255receiver.getClass();256boundsCheck(((Object[])receiver).length, index);257storeCheck(newValue, receiver.getClass().getComponentType());258return _unsafe.compareAndExchangeObjectRelease(receiver, computeOffset(index), testValue, newValue);259}260261private static final boolean weakCompareAndSet(Object receiver, int index, Object testValue, Object newValue, VarHandle varHandle) {262receiver.getClass();263boundsCheck(((Object[])receiver).length, index);264storeCheck(newValue, receiver.getClass().getComponentType());265/*[IF Sidecar19-SE-OpenJ9]*/266return _unsafe.weakCompareAndSetObjectPlain(receiver, computeOffset(index), testValue, newValue);267/*[ELSE]268return _unsafe.weakCompareAndSwapObject(receiver, computeOffset(index), testValue, newValue);269/*[ENDIF]*/270}271272private static final boolean weakCompareAndSetAcquire(Object receiver, int index, Object testValue, Object newValue, VarHandle varHandle) {273receiver.getClass();274boundsCheck(((Object[])receiver).length, index);275storeCheck(newValue, receiver.getClass().getComponentType());276/*[IF Sidecar19-SE-OpenJ9]*/277return _unsafe.weakCompareAndSetObjectAcquire(receiver, computeOffset(index), testValue, newValue);278/*[ELSE]279return _unsafe.weakCompareAndSwapObjectAcquire(receiver, computeOffset(index), testValue, newValue);280/*[ENDIF]*/281}282283private static final boolean weakCompareAndSetRelease(Object receiver, int index, Object testValue, Object newValue, VarHandle varHandle) {284receiver.getClass();285boundsCheck(((Object[])receiver).length, index);286storeCheck(newValue, receiver.getClass().getComponentType());287/*[IF Sidecar19-SE-OpenJ9]*/288return _unsafe.weakCompareAndSetObjectRelease(receiver, computeOffset(index), testValue, newValue);289/*[ELSE]290return _unsafe.weakCompareAndSwapObjectRelease(receiver, computeOffset(index), testValue, newValue);291/*[ENDIF]*/292}293294private static final boolean weakCompareAndSetPlain(Object receiver, int index, Object testValue, Object newValue, VarHandle varHandle) {295receiver.getClass();296boundsCheck(((Object[])receiver).length, index);297storeCheck(newValue, receiver.getClass().getComponentType());298/*[IF Sidecar19-SE-OpenJ9]*/299return _unsafe.weakCompareAndSetObjectPlain(receiver, computeOffset(index), testValue, newValue);300/*[ELSE]301return _unsafe.weakCompareAndSwapObject(receiver, computeOffset(index), testValue, newValue);302/*[ENDIF]*/303}304305private static final Object getAndSet(Object receiver, int index, Object value, VarHandle varHandle) {306receiver.getClass();307boundsCheck(((Object[])receiver).length, index);308storeCheck(value, receiver.getClass().getComponentType());309return _unsafe.getAndSetObject(receiver, computeOffset(index), value);310}311312private static final Object getAndSetAcquire(Object receiver, int index, Object value, VarHandle varHandle) {313receiver.getClass();314boundsCheck(((Object[])receiver).length, index);315storeCheck(value, receiver.getClass().getComponentType());316return _unsafe.getAndSetObjectAcquire(receiver, computeOffset(index), value);317}318319private static final Object getAndSetRelease(Object receiver, int index, Object value, VarHandle varHandle) {320receiver.getClass();321boundsCheck(((Object[])receiver).length, index);322storeCheck(value, receiver.getClass().getComponentType());323return _unsafe.getAndSetObjectRelease(receiver, computeOffset(index), value);324}325326private static final Object getAndAdd(Object receiver, int index, Object value, VarHandle varHandle) {327throw operationNotSupported(varHandle);328}329330private static final Object getAndAddAcquire(Object receiver, int index, Object value, VarHandle varHandle) {331throw operationNotSupported(varHandle);332}333334private static final Object getAndAddRelease(Object receiver, int index, Object value, VarHandle varHandle) {335throw operationNotSupported(varHandle);336}337338private static final Object getAndBitwiseAnd(Object receiver, int index, Object value, VarHandle varHandle) {339throw operationNotSupported(varHandle);340}341342private static final Object getAndBitwiseAndAcquire(Object receiver, int index, Object value, VarHandle varHandle) {343throw operationNotSupported(varHandle);344}345346private static final Object getAndBitwiseAndRelease(Object receiver, int index, Object value, VarHandle varHandle) {347throw operationNotSupported(varHandle);348}349350private static final Object getAndBitwiseOr(Object receiver, int index, Object value, VarHandle varHandle) {351throw operationNotSupported(varHandle);352}353354private static final Object getAndBitwiseOrAcquire(Object receiver, int index, Object value, VarHandle varHandle) {355throw operationNotSupported(varHandle);356}357358private static final Object getAndBitwiseOrRelease(Object receiver, int index, Object value, VarHandle varHandle) {359throw operationNotSupported(varHandle);360}361362private static final Object getAndBitwiseXor(Object receiver, int index, Object value, VarHandle varHandle) {363throw operationNotSupported(varHandle);364}365366private static final Object getAndBitwiseXorAcquire(Object receiver, int index, Object value, VarHandle varHandle) {367throw operationNotSupported(varHandle);368}369370private static final Object getAndBitwiseXorRelease(Object receiver, int index, Object value, VarHandle varHandle) {371throw operationNotSupported(varHandle);372}373}374375static final class OpByte extends ArrayVarHandleOperations {376private static final int BASE_OFFSET = _unsafe.arrayBaseOffset(byte[].class);377private static final int INDEX_SCALE = _unsafe.arrayIndexScale(byte[].class);378379private static final long computeOffset(int index) {380return computeOffset(index, BASE_OFFSET, INDEX_SCALE);381}382383private static final byte get(byte[] receiver, int index, VarHandle varHandle) {384receiver.getClass();385boundsCheck(receiver.length, index);386return _unsafe.getByte(receiver, computeOffset(index));387}388389private static final void set(byte[] receiver, int index, byte value, VarHandle varHandle) {390receiver.getClass();391boundsCheck(receiver.length, index);392_unsafe.putByte(receiver, computeOffset(index), value);393}394395private static final byte getVolatile(byte[] receiver, int index, VarHandle varHandle) {396receiver.getClass();397boundsCheck(receiver.length, index);398return _unsafe.getByteVolatile(receiver, computeOffset(index));399}400401private static final void setVolatile(byte[] receiver, int index, byte value, VarHandle varHandle) {402receiver.getClass();403boundsCheck(receiver.length, index);404_unsafe.putByteVolatile(receiver, computeOffset(index), value);405}406407private static final byte getOpaque(byte[] receiver, int index, VarHandle varHandle) {408receiver.getClass();409boundsCheck(receiver.length, index);410return _unsafe.getByteOpaque(receiver, computeOffset(index));411}412413private static final void setOpaque(byte[] receiver, int index, byte value, VarHandle varHandle) {414receiver.getClass();415boundsCheck(receiver.length, index);416_unsafe.putByteOpaque(receiver, computeOffset(index), value);417}418419private static final byte getAcquire(byte[] receiver, int index, VarHandle varHandle) {420receiver.getClass();421boundsCheck(receiver.length, index);422return _unsafe.getByteAcquire(receiver, computeOffset(index));423}424425private static final void setRelease(byte[] receiver, int index, byte value, VarHandle varHandle) {426receiver.getClass();427boundsCheck(receiver.length, index);428_unsafe.putByteRelease(receiver, computeOffset(index), value);429}430431private static final boolean compareAndSet(byte[] receiver, int index, byte testValue, byte newValue, VarHandle varHandle) {432receiver.getClass();433boundsCheck(receiver.length, index);434/*[IF Sidecar19-SE-OpenJ9]*/435return _unsafe.compareAndSetByte(receiver, computeOffset(index), testValue, newValue);436/*[ELSE]437return _unsafe.compareAndSwapByte(receiver, computeOffset(index), testValue, newValue);438/*[ENDIF]*/439}440441private static final byte compareAndExchange(byte[] receiver, int index, byte testValue, byte newValue, VarHandle varHandle) {442receiver.getClass();443boundsCheck(receiver.length, index);444/*[IF Sidecar19-SE-OpenJ9]*/445return _unsafe.compareAndExchangeByte(receiver, computeOffset(index), testValue, newValue);446/*[ELSE]447return _unsafe.compareAndExchangeByteVolatile(receiver, computeOffset(index), testValue, newValue);448/*[ENDIF]*/449}450451private static final byte compareAndExchangeAcquire(byte[] receiver, int index, byte testValue, byte newValue, VarHandle varHandle) {452receiver.getClass();453boundsCheck(receiver.length, index);454return _unsafe.compareAndExchangeByteAcquire(receiver, computeOffset(index), testValue, newValue);455}456457private static final byte compareAndExchangeRelease(byte[] receiver, int index, byte testValue, byte newValue, VarHandle varHandle) {458receiver.getClass();459boundsCheck(receiver.length, index);460return _unsafe.compareAndExchangeByteRelease(receiver, computeOffset(index), testValue, newValue);461}462463private static final boolean weakCompareAndSet(byte[] receiver, int index, byte testValue, byte newValue, VarHandle varHandle) {464receiver.getClass();465boundsCheck(receiver.length, index);466/*[IF Sidecar19-SE-OpenJ9]*/467return _unsafe.weakCompareAndSetBytePlain(receiver, computeOffset(index), testValue, newValue);468/*[ELSE]469return _unsafe.weakCompareAndSwapByte(receiver, computeOffset(index), testValue, newValue);470/*[ENDIF]*/471}472473private static final boolean weakCompareAndSetAcquire(byte[] receiver, int index, byte testValue, byte newValue, VarHandle varHandle) {474receiver.getClass();475boundsCheck(receiver.length, index);476/*[IF Sidecar19-SE-OpenJ9]*/477return _unsafe.weakCompareAndSetByteAcquire(receiver, computeOffset(index), testValue, newValue);478/*[ELSE]479return _unsafe.weakCompareAndSwapByteAcquire(receiver, computeOffset(index), testValue, newValue);480/*[ENDIF]*/481}482483private static final boolean weakCompareAndSetRelease(byte[] receiver, int index, byte testValue, byte newValue, VarHandle varHandle) {484receiver.getClass();485boundsCheck(receiver.length, index);486/*[IF Sidecar19-SE-OpenJ9]*/487return _unsafe.weakCompareAndSetByteRelease(receiver, computeOffset(index), testValue, newValue);488/*[ELSE]489return _unsafe.weakCompareAndSwapByteRelease(receiver, computeOffset(index), testValue, newValue);490/*[ENDIF]*/491}492493private static final boolean weakCompareAndSetPlain(byte[] receiver, int index, byte testValue, byte newValue, VarHandle varHandle) {494receiver.getClass();495boundsCheck(receiver.length, index);496/*[IF Sidecar19-SE-OpenJ9]*/497return _unsafe.weakCompareAndSetBytePlain(receiver, computeOffset(index), testValue, newValue);498/*[ELSE]499return _unsafe.weakCompareAndSwapByte(receiver, computeOffset(index), testValue, newValue);500/*[ENDIF]*/501}502503private static final byte getAndSet(byte[] receiver, int index, byte value, VarHandle varHandle) {504receiver.getClass();505boundsCheck(receiver.length, index);506return _unsafe.getAndSetByte(receiver, computeOffset(index), value);507}508509private static final byte getAndSetAcquire(byte[] receiver, int index, byte value, VarHandle varHandle) {510receiver.getClass();511boundsCheck(receiver.length, index);512return _unsafe.getAndSetByteAcquire(receiver, computeOffset(index), value);513}514515private static final byte getAndSetRelease(byte[] receiver, int index, byte value, VarHandle varHandle) {516receiver.getClass();517boundsCheck(receiver.length, index);518return _unsafe.getAndSetByteRelease(receiver, computeOffset(index), value);519}520521private static final byte getAndAdd(byte[] receiver, int index, byte value, VarHandle varHandle) {522receiver.getClass();523boundsCheck(receiver.length, index);524return _unsafe.getAndAddByte(receiver, computeOffset(index), value);525}526527private static final byte getAndAddAcquire(byte[] receiver, int index, byte value, VarHandle varHandle) {528receiver.getClass();529boundsCheck(receiver.length, index);530return _unsafe.getAndAddByteAcquire(receiver, computeOffset(index), value);531}532533private static final byte getAndAddRelease(byte[] receiver, int index, byte value, VarHandle varHandle) {534receiver.getClass();535boundsCheck(receiver.length, index);536return _unsafe.getAndAddByteRelease(receiver, computeOffset(index), value);537}538539private static final byte getAndBitwiseAnd(byte[] receiver, int index, byte value, VarHandle varHandle) {540receiver.getClass();541boundsCheck(receiver.length, index);542return _unsafe.getAndBitwiseAndByte(receiver, computeOffset(index), value);543}544545private static final byte getAndBitwiseAndAcquire(byte[] receiver, int index, byte value, VarHandle varHandle) {546receiver.getClass();547boundsCheck(receiver.length, index);548return _unsafe.getAndBitwiseAndByteAcquire(receiver, computeOffset(index), value);549}550551private static final byte getAndBitwiseAndRelease(byte[] receiver, int index, byte value, VarHandle varHandle) {552receiver.getClass();553boundsCheck(receiver.length, index);554return _unsafe.getAndBitwiseAndByteRelease(receiver, computeOffset(index), value);555}556557private static final byte getAndBitwiseOr(byte[] receiver, int index, byte value, VarHandle varHandle) {558receiver.getClass();559boundsCheck(receiver.length, index);560return _unsafe.getAndBitwiseOrByte(receiver, computeOffset(index), value);561}562563private static final byte getAndBitwiseOrAcquire(byte[] receiver, int index, byte value, VarHandle varHandle) {564receiver.getClass();565boundsCheck(receiver.length, index);566return _unsafe.getAndBitwiseOrByteAcquire(receiver, computeOffset(index), value);567}568569private static final byte getAndBitwiseOrRelease(byte[] receiver, int index, byte value, VarHandle varHandle) {570receiver.getClass();571boundsCheck(receiver.length, index);572return _unsafe.getAndBitwiseOrByteRelease(receiver, computeOffset(index), value);573}574575private static final byte getAndBitwiseXor(byte[] receiver, int index, byte value, VarHandle varHandle) {576receiver.getClass();577boundsCheck(receiver.length, index);578return _unsafe.getAndBitwiseXorByte(receiver, computeOffset(index), value);579}580581private static final byte getAndBitwiseXorAcquire(byte[] receiver, int index, byte value, VarHandle varHandle) {582receiver.getClass();583boundsCheck(receiver.length, index);584return _unsafe.getAndBitwiseXorByteAcquire(receiver, computeOffset(index), value);585}586587private static final byte getAndBitwiseXorRelease(byte[] receiver, int index, byte value, VarHandle varHandle) {588receiver.getClass();589boundsCheck(receiver.length, index);590return _unsafe.getAndBitwiseXorByteRelease(receiver, computeOffset(index), value);591}592}593594static final class OpChar extends ArrayVarHandleOperations {595private static final int BASE_OFFSET = _unsafe.arrayBaseOffset(char[].class);596private static final int INDEX_SCALE = _unsafe.arrayIndexScale(char[].class);597598private static final long computeOffset(int index) {599return computeOffset(index, BASE_OFFSET, INDEX_SCALE);600}601602private static final char get(char[] receiver, int index, VarHandle varHandle) {603receiver.getClass();604boundsCheck(receiver.length, index);605return _unsafe.getChar(receiver, computeOffset(index));606}607608private static final void set(char[] receiver, int index, char value, VarHandle varHandle) {609receiver.getClass();610boundsCheck(receiver.length, index);611_unsafe.putChar(receiver, computeOffset(index), value);612}613614private static final char getVolatile(char[] receiver, int index, VarHandle varHandle) {615receiver.getClass();616boundsCheck(receiver.length, index);617return _unsafe.getCharVolatile(receiver, computeOffset(index));618}619620private static final void setVolatile(char[] receiver, int index, char value, VarHandle varHandle) {621receiver.getClass();622boundsCheck(receiver.length, index);623_unsafe.putCharVolatile(receiver, computeOffset(index), value);624}625626private static final char getOpaque(char[] receiver, int index, VarHandle varHandle) {627receiver.getClass();628boundsCheck(receiver.length, index);629return _unsafe.getCharOpaque(receiver, computeOffset(index));630}631632private static final void setOpaque(char[] receiver, int index, char value, VarHandle varHandle) {633receiver.getClass();634boundsCheck(receiver.length, index);635_unsafe.putCharOpaque(receiver, computeOffset(index), value);636}637638private static final char getAcquire(char[] receiver, int index, VarHandle varHandle) {639receiver.getClass();640boundsCheck(receiver.length, index);641return _unsafe.getCharAcquire(receiver, computeOffset(index));642}643644private static final void setRelease(char[] receiver, int index, char value, VarHandle varHandle) {645receiver.getClass();646boundsCheck(receiver.length, index);647_unsafe.putCharRelease(receiver, computeOffset(index), value);648}649650private static final boolean compareAndSet(char[] receiver, int index, char testValue, char newValue, VarHandle varHandle) {651receiver.getClass();652boundsCheck(receiver.length, index);653/*[IF Sidecar19-SE-OpenJ9]*/654return _unsafe.compareAndSetChar(receiver, computeOffset(index), testValue, newValue);655/*[ELSE]656return _unsafe.compareAndSwapChar(receiver, computeOffset(index), testValue, newValue);657/*[ENDIF]*/658}659660private static final char compareAndExchange(char[] receiver, int index, char testValue, char newValue, VarHandle varHandle) {661receiver.getClass();662boundsCheck(receiver.length, index);663/*[IF Sidecar19-SE-OpenJ9]*/664return _unsafe.compareAndExchangeChar(receiver, computeOffset(index), testValue, newValue);665/*[ELSE]666return _unsafe.compareAndExchangeCharVolatile(receiver, computeOffset(index), testValue, newValue);667/*[ENDIF]*/668}669670private static final char compareAndExchangeAcquire(char[] receiver, int index, char testValue, char newValue, VarHandle varHandle) {671receiver.getClass();672boundsCheck(receiver.length, index);673return _unsafe.compareAndExchangeCharAcquire(receiver, computeOffset(index), testValue, newValue);674}675676private static final char compareAndExchangeRelease(char[] receiver, int index, char testValue, char newValue, VarHandle varHandle) {677receiver.getClass();678boundsCheck(receiver.length, index);679return _unsafe.compareAndExchangeCharRelease(receiver, computeOffset(index), testValue, newValue);680}681682private static final boolean weakCompareAndSet(char[] receiver, int index, char testValue, char newValue, VarHandle varHandle) {683receiver.getClass();684boundsCheck(receiver.length, index);685/*[IF Sidecar19-SE-OpenJ9]*/686return _unsafe.weakCompareAndSetCharPlain(receiver, computeOffset(index), testValue, newValue);687/*[ELSE]688return _unsafe.weakCompareAndSwapChar(receiver, computeOffset(index), testValue, newValue);689/*[ENDIF]*/690}691692private static final boolean weakCompareAndSetAcquire(char[] receiver, int index, char testValue, char newValue, VarHandle varHandle) {693receiver.getClass();694boundsCheck(receiver.length, index);695/*[IF Sidecar19-SE-OpenJ9]*/696return _unsafe.weakCompareAndSetCharAcquire(receiver, computeOffset(index), testValue, newValue);697/*[ELSE]698return _unsafe.weakCompareAndSwapCharAcquire(receiver, computeOffset(index), testValue, newValue);699/*[ENDIF]*/700}701702private static final boolean weakCompareAndSetRelease(char[] receiver, int index, char testValue, char newValue, VarHandle varHandle) {703receiver.getClass();704boundsCheck(receiver.length, index);705/*[IF Sidecar19-SE-OpenJ9]*/706return _unsafe.weakCompareAndSetCharRelease(receiver, computeOffset(index), testValue, newValue);707/*[ELSE]708return _unsafe.weakCompareAndSwapCharRelease(receiver, computeOffset(index), testValue, newValue);709/*[ENDIF]*/710}711712private static final boolean weakCompareAndSetPlain(char[] receiver, int index, char testValue, char newValue, VarHandle varHandle) {713receiver.getClass();714boundsCheck(receiver.length, index);715/*[IF Sidecar19-SE-OpenJ9]*/716return _unsafe.weakCompareAndSetCharPlain(receiver, computeOffset(index), testValue, newValue);717/*[ELSE]718return _unsafe.weakCompareAndSwapChar(receiver, computeOffset(index), testValue, newValue);719/*[ENDIF]*/720}721722private static final char getAndSet(char[] receiver, int index, char value, VarHandle varHandle) {723receiver.getClass();724boundsCheck(receiver.length, index);725return _unsafe.getAndSetChar(receiver, computeOffset(index), value);726}727728private static final char getAndSetAcquire(char[] receiver, int index, char value, VarHandle varHandle) {729receiver.getClass();730boundsCheck(receiver.length, index);731return _unsafe.getAndSetCharAcquire(receiver, computeOffset(index), value);732}733734private static final char getAndSetRelease(char[] receiver, int index, char value, VarHandle varHandle) {735receiver.getClass();736boundsCheck(receiver.length, index);737return _unsafe.getAndSetCharRelease(receiver, computeOffset(index), value);738}739740private static final char getAndAdd(char[] receiver, int index, char value, VarHandle varHandle) {741receiver.getClass();742boundsCheck(receiver.length, index);743return _unsafe.getAndAddChar(receiver, computeOffset(index), value);744}745746private static final char getAndAddAcquire(char[] receiver, int index, char value, VarHandle varHandle) {747receiver.getClass();748boundsCheck(receiver.length, index);749return _unsafe.getAndAddCharAcquire(receiver, computeOffset(index), value);750}751752private static final char getAndAddRelease(char[] receiver, int index, char value, VarHandle varHandle) {753receiver.getClass();754boundsCheck(receiver.length, index);755return _unsafe.getAndAddCharRelease(receiver, computeOffset(index), value);756}757758private static final char getAndBitwiseAnd(char[] receiver, int index, char value, VarHandle varHandle) {759receiver.getClass();760boundsCheck(receiver.length, index);761return _unsafe.getAndBitwiseAndChar(receiver, computeOffset(index), value);762}763764private static final char getAndBitwiseAndAcquire(char[] receiver, int index, char value, VarHandle varHandle) {765receiver.getClass();766boundsCheck(receiver.length, index);767return _unsafe.getAndBitwiseAndCharAcquire(receiver, computeOffset(index), value);768}769770private static final char getAndBitwiseAndRelease(char[] receiver, int index, char value, VarHandle varHandle) {771receiver.getClass();772boundsCheck(receiver.length, index);773return _unsafe.getAndBitwiseAndCharRelease(receiver, computeOffset(index), value);774}775776private static final char getAndBitwiseOr(char[] receiver, int index, char value, VarHandle varHandle) {777receiver.getClass();778boundsCheck(receiver.length, index);779return _unsafe.getAndBitwiseOrChar(receiver, computeOffset(index), value);780}781782private static final char getAndBitwiseOrAcquire(char[] receiver, int index, char value, VarHandle varHandle) {783receiver.getClass();784boundsCheck(receiver.length, index);785return _unsafe.getAndBitwiseOrCharAcquire(receiver, computeOffset(index), value);786}787788private static final char getAndBitwiseOrRelease(char[] receiver, int index, char value, VarHandle varHandle) {789receiver.getClass();790boundsCheck(receiver.length, index);791return _unsafe.getAndBitwiseOrCharRelease(receiver, computeOffset(index), value);792}793794private static final char getAndBitwiseXor(char[] receiver, int index, char value, VarHandle varHandle) {795receiver.getClass();796boundsCheck(receiver.length, index);797return _unsafe.getAndBitwiseXorChar(receiver, computeOffset(index), value);798}799800private static final char getAndBitwiseXorAcquire(char[] receiver, int index, char value, VarHandle varHandle) {801receiver.getClass();802boundsCheck(receiver.length, index);803return _unsafe.getAndBitwiseXorCharAcquire(receiver, computeOffset(index), value);804}805806private static final char getAndBitwiseXorRelease(char[] receiver, int index, char value, VarHandle varHandle) {807receiver.getClass();808boundsCheck(receiver.length, index);809return _unsafe.getAndBitwiseXorCharRelease(receiver, computeOffset(index), value);810}811}812813static final class OpDouble extends ArrayVarHandleOperations {814private static final int BASE_OFFSET = _unsafe.arrayBaseOffset(double[].class);815private static final int INDEX_SCALE = _unsafe.arrayIndexScale(double[].class);816817private static final long computeOffset(int index) {818return computeOffset(index, BASE_OFFSET, INDEX_SCALE);819}820821private static final double get(double[] receiver, int index, VarHandle varHandle) {822receiver.getClass();823boundsCheck(receiver.length, index);824return _unsafe.getDouble(receiver, computeOffset(index));825}826827private static final void set(double[] receiver, int index, double value, VarHandle varHandle) {828receiver.getClass();829boundsCheck(receiver.length, index);830_unsafe.putDouble(receiver, computeOffset(index), value);831}832833private static final double getVolatile(double[] receiver, int index, VarHandle varHandle) {834receiver.getClass();835boundsCheck(receiver.length, index);836return _unsafe.getDoubleVolatile(receiver, computeOffset(index));837}838839private static final void setVolatile(double[] receiver, int index, double value, VarHandle varHandle) {840receiver.getClass();841boundsCheck(receiver.length, index);842_unsafe.putDoubleVolatile(receiver, computeOffset(index), value);843}844845private static final double getOpaque(double[] receiver, int index, VarHandle varHandle) {846receiver.getClass();847boundsCheck(receiver.length, index);848return _unsafe.getDoubleOpaque(receiver, computeOffset(index));849}850851private static final void setOpaque(double[] receiver, int index, double value, VarHandle varHandle) {852receiver.getClass();853boundsCheck(receiver.length, index);854_unsafe.putDoubleOpaque(receiver, computeOffset(index), value);855}856857private static final double getAcquire(double[] receiver, int index, VarHandle varHandle) {858receiver.getClass();859boundsCheck(receiver.length, index);860return _unsafe.getDoubleAcquire(receiver, computeOffset(index));861}862863private static final void setRelease(double[] receiver, int index, double value, VarHandle varHandle) {864receiver.getClass();865boundsCheck(receiver.length, index);866_unsafe.putDoubleRelease(receiver, computeOffset(index), value);867}868869private static final boolean compareAndSet(double[] receiver, int index, double testValue, double newValue, VarHandle varHandle) {870receiver.getClass();871boundsCheck(receiver.length, index);872/*[IF Sidecar19-SE-OpenJ9]*/873return _unsafe.compareAndSetDouble(receiver, computeOffset(index), testValue, newValue);874/*[ELSE]875return _unsafe.compareAndSwapDouble(receiver, computeOffset(index), testValue, newValue);876/*[ENDIF]*/877}878879private static final double compareAndExchange(double[] receiver, int index, double testValue, double newValue, VarHandle varHandle) {880receiver.getClass();881boundsCheck(receiver.length, index);882/*[IF Sidecar19-SE-OpenJ9]*/883return _unsafe.compareAndExchangeDouble(receiver, computeOffset(index), testValue, newValue);884/*[ELSE]885return _unsafe.compareAndExchangeDoubleVolatile(receiver, computeOffset(index), testValue, newValue);886/*[ENDIF]*/887}888889private static final double compareAndExchangeAcquire(double[] receiver, int index, double testValue, double newValue, VarHandle varHandle) {890receiver.getClass();891boundsCheck(receiver.length, index);892return _unsafe.compareAndExchangeDoubleAcquire(receiver, computeOffset(index), testValue, newValue);893}894895private static final double compareAndExchangeRelease(double[] receiver, int index, double testValue, double newValue, VarHandle varHandle) {896receiver.getClass();897boundsCheck(receiver.length, index);898return _unsafe.compareAndExchangeDoubleRelease(receiver, computeOffset(index), testValue, newValue);899}900901private static final boolean weakCompareAndSet(double[] receiver, int index, double testValue, double newValue, VarHandle varHandle) {902receiver.getClass();903boundsCheck(receiver.length, index);904/*[IF Sidecar19-SE-OpenJ9]*/905return _unsafe.weakCompareAndSetDoublePlain(receiver, computeOffset(index), testValue, newValue);906/*[ELSE]907return _unsafe.weakCompareAndSwapDouble(receiver, computeOffset(index), testValue, newValue);908/*[ENDIF]*/909}910911private static final boolean weakCompareAndSetAcquire(double[] receiver, int index, double testValue, double newValue, VarHandle varHandle) {912receiver.getClass();913boundsCheck(receiver.length, index);914/*[IF Sidecar19-SE-OpenJ9]*/915return _unsafe.weakCompareAndSetDoubleAcquire(receiver, computeOffset(index), testValue, newValue);916/*[ELSE]917return _unsafe.weakCompareAndSwapDoubleAcquire(receiver, computeOffset(index), testValue, newValue);918/*[ENDIF]*/919}920921private static final boolean weakCompareAndSetRelease(double[] receiver, int index, double testValue, double newValue, VarHandle varHandle) {922receiver.getClass();923boundsCheck(receiver.length, index);924/*[IF Sidecar19-SE-OpenJ9]*/925return _unsafe.weakCompareAndSetDoubleRelease(receiver, computeOffset(index), testValue, newValue);926/*[ELSE]927return _unsafe.weakCompareAndSwapDoubleRelease(receiver, computeOffset(index), testValue, newValue);928/*[ENDIF]*/929}930931private static final boolean weakCompareAndSetPlain(double[] receiver, int index, double testValue, double newValue, VarHandle varHandle) {932receiver.getClass();933boundsCheck(receiver.length, index);934/*[IF Sidecar19-SE-OpenJ9]*/935return _unsafe.weakCompareAndSetDoublePlain(receiver, computeOffset(index), testValue, newValue);936/*[ELSE]937return _unsafe.weakCompareAndSwapDouble(receiver, computeOffset(index), testValue, newValue);938/*[ENDIF]*/939}940941private static final double getAndSet(double[] receiver, int index, double value, VarHandle varHandle) {942receiver.getClass();943boundsCheck(receiver.length, index);944return _unsafe.getAndSetDouble(receiver, computeOffset(index), value);945}946947private static final double getAndSetAcquire(double[] receiver, int index, double value, VarHandle varHandle) {948receiver.getClass();949boundsCheck(receiver.length, index);950return _unsafe.getAndSetDoubleAcquire(receiver, computeOffset(index), value);951}952953private static final double getAndSetRelease(double[] receiver, int index, double value, VarHandle varHandle) {954receiver.getClass();955boundsCheck(receiver.length, index);956return _unsafe.getAndSetDoubleRelease(receiver, computeOffset(index), value);957}958959private static final double getAndAdd(double[] receiver, int index, double value, VarHandle varHandle) {960receiver.getClass();961boundsCheck(receiver.length, index);962return _unsafe.getAndAddDouble(receiver, computeOffset(index), value);963}964965private static final double getAndAddAcquire(double[] receiver, int index, double value, VarHandle varHandle) {966receiver.getClass();967boundsCheck(receiver.length, index);968return _unsafe.getAndAddDoubleAcquire(receiver, computeOffset(index), value);969}970971private static final double getAndAddRelease(double[] receiver, int index, double value, VarHandle varHandle) {972receiver.getClass();973boundsCheck(receiver.length, index);974return _unsafe.getAndAddDoubleRelease(receiver, computeOffset(index), value);975}976977private static final double getAndBitwiseAnd(double[] receiver, int index, double value, VarHandle varHandle) {978throw operationNotSupported(varHandle);979}980981private static final double getAndBitwiseAndAcquire(double[] receiver, int index, double value, VarHandle varHandle) {982throw operationNotSupported(varHandle);983}984985private static final double getAndBitwiseAndRelease(double[] receiver, int index, double value, VarHandle varHandle) {986throw operationNotSupported(varHandle);987}988989private static final double getAndBitwiseOr(double[] receiver, int index, double value, VarHandle varHandle) {990throw operationNotSupported(varHandle);991}992993private static final double getAndBitwiseOrAcquire(double[] receiver, int index, double value, VarHandle varHandle) {994throw operationNotSupported(varHandle);995}996997private static final double getAndBitwiseOrRelease(double[] receiver, int index, double value, VarHandle varHandle) {998throw operationNotSupported(varHandle);999}10001001private static final double getAndBitwiseXor(double[] receiver, int index, double value, VarHandle varHandle) {1002throw operationNotSupported(varHandle);1003}10041005private static final double getAndBitwiseXorAcquire(double[] receiver, int index, double value, VarHandle varHandle) {1006throw operationNotSupported(varHandle);1007}10081009private static final double getAndBitwiseXorRelease(double[] receiver, int index, double value, VarHandle varHandle) {1010throw operationNotSupported(varHandle);1011}1012}10131014static final class OpFloat extends ArrayVarHandleOperations {1015private static final int BASE_OFFSET = _unsafe.arrayBaseOffset(float[].class);1016private static final int INDEX_SCALE = _unsafe.arrayIndexScale(float[].class);10171018private static final long computeOffset(int index) {1019return computeOffset(index, BASE_OFFSET, INDEX_SCALE);1020}10211022private static final float get(float[] receiver, int index, VarHandle varHandle) {1023receiver.getClass();1024boundsCheck(receiver.length, index);1025return _unsafe.getFloat(receiver, computeOffset(index));1026}10271028private static final void set(float[] receiver, int index, float value, VarHandle varHandle) {1029receiver.getClass();1030boundsCheck(receiver.length, index);1031_unsafe.putFloat(receiver, computeOffset(index), value);1032}10331034private static final float getVolatile(float[] receiver, int index, VarHandle varHandle) {1035receiver.getClass();1036boundsCheck(receiver.length, index);1037return _unsafe.getFloatVolatile(receiver, computeOffset(index));1038}10391040private static final void setVolatile(float[] receiver, int index, float value, VarHandle varHandle) {1041receiver.getClass();1042boundsCheck(receiver.length, index);1043_unsafe.putFloatVolatile(receiver, computeOffset(index), value);1044}10451046private static final float getOpaque(float[] receiver, int index, VarHandle varHandle) {1047receiver.getClass();1048boundsCheck(receiver.length, index);1049return _unsafe.getFloatOpaque(receiver, computeOffset(index));1050}10511052private static final void setOpaque(float[] receiver, int index, float value, VarHandle varHandle) {1053receiver.getClass();1054boundsCheck(receiver.length, index);1055_unsafe.putFloatOpaque(receiver, computeOffset(index), value);1056}10571058private static final float getAcquire(float[] receiver, int index, VarHandle varHandle) {1059receiver.getClass();1060boundsCheck(receiver.length, index);1061return _unsafe.getFloatAcquire(receiver, computeOffset(index));1062}10631064private static final void setRelease(float[] receiver, int index, float value, VarHandle varHandle) {1065receiver.getClass();1066boundsCheck(receiver.length, index);1067_unsafe.putFloatRelease(receiver, computeOffset(index), value);1068}10691070private static final boolean compareAndSet(float[] receiver, int index, float testValue, float newValue, VarHandle varHandle) {1071receiver.getClass();1072boundsCheck(receiver.length, index);1073/*[IF Sidecar19-SE-OpenJ9]*/1074return _unsafe.compareAndSetFloat(receiver, computeOffset(index), testValue, newValue);1075/*[ELSE]1076return _unsafe.compareAndSwapFloat(receiver, computeOffset(index), testValue, newValue);1077/*[ENDIF]*/1078}10791080private static final float compareAndExchange(float[] receiver, int index, float testValue, float newValue, VarHandle varHandle) {1081receiver.getClass();1082boundsCheck(receiver.length, index);1083/*[IF Sidecar19-SE-OpenJ9]*/1084return _unsafe.compareAndExchangeFloat(receiver, computeOffset(index), testValue, newValue);1085/*[ELSE]1086return _unsafe.compareAndExchangeFloatVolatile(receiver, computeOffset(index), testValue, newValue);1087/*[ENDIF]*/1088}10891090private static final float compareAndExchangeAcquire(float[] receiver, int index, float testValue, float newValue, VarHandle varHandle) {1091receiver.getClass();1092boundsCheck(receiver.length, index);1093return _unsafe.compareAndExchangeFloatAcquire(receiver, computeOffset(index), testValue, newValue);1094}10951096private static final float compareAndExchangeRelease(float[] receiver, int index, float testValue, float newValue, VarHandle varHandle) {1097receiver.getClass();1098boundsCheck(receiver.length, index);1099return _unsafe.compareAndExchangeFloatRelease(receiver, computeOffset(index), testValue, newValue);1100}11011102private static final boolean weakCompareAndSet(float[] receiver, int index, float testValue, float newValue, VarHandle varHandle) {1103receiver.getClass();1104boundsCheck(receiver.length, index);1105/*[IF Sidecar19-SE-OpenJ9]*/1106return _unsafe.weakCompareAndSetFloatPlain(receiver, computeOffset(index), testValue, newValue);1107/*[ELSE]1108return _unsafe.weakCompareAndSwapFloat(receiver, computeOffset(index), testValue, newValue);1109/*[ENDIF]*/1110}11111112private static final boolean weakCompareAndSetAcquire(float[] receiver, int index, float testValue, float newValue, VarHandle varHandle) {1113receiver.getClass();1114boundsCheck(receiver.length, index);1115/*[IF Sidecar19-SE-OpenJ9]*/1116return _unsafe.weakCompareAndSetFloatAcquire(receiver, computeOffset(index), testValue, newValue);1117/*[ELSE]1118return _unsafe.weakCompareAndSwapFloatAcquire(receiver, computeOffset(index), testValue, newValue);1119/*[ENDIF]*/1120}11211122private static final boolean weakCompareAndSetRelease(float[] receiver, int index, float testValue, float newValue, VarHandle varHandle) {1123receiver.getClass();1124boundsCheck(receiver.length, index);1125/*[IF Sidecar19-SE-OpenJ9]*/1126return _unsafe.weakCompareAndSetFloatRelease(receiver, computeOffset(index), testValue, newValue);1127/*[ELSE]1128return _unsafe.weakCompareAndSwapFloatRelease(receiver, computeOffset(index), testValue, newValue);1129/*[ENDIF]*/1130}11311132private static final boolean weakCompareAndSetPlain(float[] receiver, int index, float testValue, float newValue, VarHandle varHandle) {1133receiver.getClass();1134boundsCheck(receiver.length, index);1135/*[IF Sidecar19-SE-OpenJ9]*/1136return _unsafe.weakCompareAndSetFloatPlain(receiver, computeOffset(index), testValue, newValue);1137/*[ELSE]1138return _unsafe.weakCompareAndSwapFloat(receiver, computeOffset(index), testValue, newValue);1139/*[ENDIF]*/1140}11411142private static final float getAndSet(float[] receiver, int index, float value, VarHandle varHandle) {1143receiver.getClass();1144boundsCheck(receiver.length, index);1145return _unsafe.getAndSetFloat(receiver, computeOffset(index), value);1146}11471148private static final float getAndSetAcquire(float[] receiver, int index, float value, VarHandle varHandle) {1149receiver.getClass();1150boundsCheck(receiver.length, index);1151return _unsafe.getAndSetFloatAcquire(receiver, computeOffset(index), value);1152}11531154private static final float getAndSetRelease(float[] receiver, int index, float value, VarHandle varHandle) {1155receiver.getClass();1156boundsCheck(receiver.length, index);1157return _unsafe.getAndSetFloatRelease(receiver, computeOffset(index), value);1158}11591160private static final float getAndAdd(float[] receiver, int index, float value, VarHandle varHandle) {1161receiver.getClass();1162boundsCheck(receiver.length, index);1163return _unsafe.getAndAddFloat(receiver, computeOffset(index), value);1164}11651166private static final float getAndAddAcquire(float[] receiver, int index, float value, VarHandle varHandle) {1167receiver.getClass();1168boundsCheck(receiver.length, index);1169return _unsafe.getAndAddFloatAcquire(receiver, computeOffset(index), value);1170}11711172private static final float getAndAddRelease(float[] receiver, int index, float value, VarHandle varHandle) {1173receiver.getClass();1174boundsCheck(receiver.length, index);1175return _unsafe.getAndAddFloatRelease(receiver, computeOffset(index), value);1176}11771178private static final float getAndBitwiseAnd(float[] receiver, int index, float value, VarHandle varHandle) {1179throw operationNotSupported(varHandle);1180}11811182private static final float getAndBitwiseAndAcquire(float[] receiver, int index, float value, VarHandle varHandle) {1183throw operationNotSupported(varHandle);1184}11851186private static final float getAndBitwiseAndRelease(float[] receiver, int index, float value, VarHandle varHandle) {1187throw operationNotSupported(varHandle);1188}11891190private static final float getAndBitwiseOr(float[] receiver, int index, float value, VarHandle varHandle) {1191throw operationNotSupported(varHandle);1192}11931194private static final float getAndBitwiseOrAcquire(float[] receiver, int index, float value, VarHandle varHandle) {1195throw operationNotSupported(varHandle);1196}11971198private static final float getAndBitwiseOrRelease(float[] receiver, int index, float value, VarHandle varHandle) {1199throw operationNotSupported(varHandle);1200}12011202private static final float getAndBitwiseXor(float[] receiver, int index, float value, VarHandle varHandle) {1203throw operationNotSupported(varHandle);1204}12051206private static final float getAndBitwiseXorAcquire(float[] receiver, int index, float value, VarHandle varHandle) {1207throw operationNotSupported(varHandle);1208}12091210private static final float getAndBitwiseXorRelease(float[] receiver, int index, float value, VarHandle varHandle) {1211throw operationNotSupported(varHandle);1212}1213}12141215static final class OpInt extends ArrayVarHandleOperations {1216private static final int BASE_OFFSET = _unsafe.arrayBaseOffset(int[].class);1217private static final int INDEX_SCALE = _unsafe.arrayIndexScale(int[].class);12181219private static final long computeOffset(int index) {1220return computeOffset(index, BASE_OFFSET, INDEX_SCALE);1221}12221223private static final int get(int[] receiver, int index, VarHandle varHandle) {1224receiver.getClass();1225boundsCheck(receiver.length, index);1226return _unsafe.getInt(receiver, computeOffset(index));1227}12281229private static final void set(int[] receiver, int index, int value, VarHandle varHandle) {1230receiver.getClass();1231boundsCheck(receiver.length, index);1232_unsafe.putInt(receiver, computeOffset(index), value);1233}12341235private static final int getVolatile(int[] receiver, int index, VarHandle varHandle) {1236receiver.getClass();1237boundsCheck(receiver.length, index);1238return _unsafe.getIntVolatile(receiver, computeOffset(index));1239}12401241private static final void setVolatile(int[] receiver, int index, int value, VarHandle varHandle) {1242receiver.getClass();1243boundsCheck(receiver.length, index);1244_unsafe.putIntVolatile(receiver, computeOffset(index), value);1245}12461247private static final int getOpaque(int[] receiver, int index, VarHandle varHandle) {1248receiver.getClass();1249boundsCheck(receiver.length, index);1250return _unsafe.getIntOpaque(receiver, computeOffset(index));1251}12521253private static final void setOpaque(int[] receiver, int index, int value, VarHandle varHandle) {1254receiver.getClass();1255boundsCheck(receiver.length, index);1256_unsafe.putIntOpaque(receiver, computeOffset(index), value);1257}12581259private static final int getAcquire(int[] receiver, int index, VarHandle varHandle) {1260receiver.getClass();1261boundsCheck(receiver.length, index);1262return _unsafe.getIntAcquire(receiver, computeOffset(index));1263}12641265private static final void setRelease(int[] receiver, int index, int value, VarHandle varHandle) {1266receiver.getClass();1267boundsCheck(receiver.length, index);1268_unsafe.putIntRelease(receiver, computeOffset(index), value);1269}12701271private static final boolean compareAndSet(int[] receiver, int index, int testValue, int newValue, VarHandle varHandle) {1272receiver.getClass();1273boundsCheck(receiver.length, index);1274/*[IF Sidecar19-SE-OpenJ9]*/1275return _unsafe.compareAndSetInt(receiver, computeOffset(index), testValue, newValue);1276/*[ELSE]1277return _unsafe.compareAndSwapInt(receiver, computeOffset(index), testValue, newValue);1278/*[ENDIF]*/1279}12801281private static final int compareAndExchange(int[] receiver, int index, int testValue, int newValue, VarHandle varHandle) {1282receiver.getClass();1283boundsCheck(receiver.length, index);1284/*[IF Sidecar19-SE-OpenJ9]*/1285return _unsafe.compareAndExchangeInt(receiver, computeOffset(index), testValue, newValue);1286/*[ELSE]1287return _unsafe.compareAndExchangeIntVolatile(receiver, computeOffset(index), testValue, newValue);1288/*[ENDIF]*/1289}12901291private static final int compareAndExchangeAcquire(int[] receiver, int index, int testValue, int newValue, VarHandle varHandle) {1292receiver.getClass();1293boundsCheck(receiver.length, index);1294return _unsafe.compareAndExchangeIntAcquire(receiver, computeOffset(index), testValue, newValue);1295}12961297private static final int compareAndExchangeRelease(int[] receiver, int index, int testValue, int newValue, VarHandle varHandle) {1298receiver.getClass();1299boundsCheck(receiver.length, index);1300return _unsafe.compareAndExchangeIntRelease(receiver, computeOffset(index), testValue, newValue);1301}13021303private static final boolean weakCompareAndSet(int[] receiver, int index, int testValue, int newValue, VarHandle varHandle) {1304receiver.getClass();1305boundsCheck(receiver.length, index);1306/*[IF Sidecar19-SE-OpenJ9]*/1307return _unsafe.weakCompareAndSetIntPlain(receiver, computeOffset(index), testValue, newValue);1308/*[ELSE]1309return _unsafe.weakCompareAndSwapInt(receiver, computeOffset(index), testValue, newValue);1310/*[ENDIF]*/1311}13121313private static final boolean weakCompareAndSetAcquire(int[] receiver, int index, int testValue, int newValue, VarHandle varHandle) {1314receiver.getClass();1315boundsCheck(receiver.length, index);1316/*[IF Sidecar19-SE-OpenJ9]*/1317return _unsafe.weakCompareAndSetIntAcquire(receiver, computeOffset(index), testValue, newValue);1318/*[ELSE]1319return _unsafe.weakCompareAndSwapIntAcquire(receiver, computeOffset(index), testValue, newValue);1320/*[ENDIF]*/1321}13221323private static final boolean weakCompareAndSetRelease(int[] receiver, int index, int testValue, int newValue, VarHandle varHandle) {1324receiver.getClass();1325boundsCheck(receiver.length, index);1326/*[IF Sidecar19-SE-OpenJ9]*/1327return _unsafe.weakCompareAndSetIntRelease(receiver, computeOffset(index), testValue, newValue);1328/*[ELSE]1329return _unsafe.weakCompareAndSwapIntRelease(receiver, computeOffset(index), testValue, newValue);1330/*[ENDIF]*/1331}13321333private static final boolean weakCompareAndSetPlain(int[] receiver, int index, int testValue, int newValue, VarHandle varHandle) {1334receiver.getClass();1335boundsCheck(receiver.length, index);1336/*[IF Sidecar19-SE-OpenJ9]*/1337return _unsafe.weakCompareAndSetIntPlain(receiver, computeOffset(index), testValue, newValue);1338/*[ELSE]1339return _unsafe.weakCompareAndSwapInt(receiver, computeOffset(index), testValue, newValue);1340/*[ENDIF]*/1341}13421343private static final int getAndSet(int[] receiver, int index, int value, VarHandle varHandle) {1344receiver.getClass();1345boundsCheck(receiver.length, index);1346return _unsafe.getAndSetInt(receiver, computeOffset(index), value);1347}13481349private static final int getAndSetAcquire(int[] receiver, int index, int value, VarHandle varHandle) {1350receiver.getClass();1351boundsCheck(receiver.length, index);1352return _unsafe.getAndSetIntAcquire(receiver, computeOffset(index), value);1353}13541355private static final int getAndSetRelease(int[] receiver, int index, int value, VarHandle varHandle) {1356receiver.getClass();1357boundsCheck(receiver.length, index);1358return _unsafe.getAndSetIntRelease(receiver, computeOffset(index), value);1359}13601361private static final int getAndAdd(int[] receiver, int index, int value, VarHandle varHandle) {1362receiver.getClass();1363boundsCheck(receiver.length, index);1364return _unsafe.getAndAddInt(receiver, computeOffset(index), value);1365}13661367private static final int getAndAddAcquire(int[] receiver, int index, int value, VarHandle varHandle) {1368receiver.getClass();1369boundsCheck(receiver.length, index);1370return _unsafe.getAndAddIntAcquire(receiver, computeOffset(index), value);1371}13721373private static final int getAndAddRelease(int[] receiver, int index, int value, VarHandle varHandle) {1374receiver.getClass();1375boundsCheck(receiver.length, index);1376return _unsafe.getAndAddIntRelease(receiver, computeOffset(index), value);1377}13781379private static final int getAndBitwiseAnd(int[] receiver, int index, int value, VarHandle varHandle) {1380receiver.getClass();1381boundsCheck(receiver.length, index);1382return _unsafe.getAndBitwiseAndInt(receiver, computeOffset(index), value);1383}13841385private static final int getAndBitwiseAndAcquire(int[] receiver, int index, int value, VarHandle varHandle) {1386receiver.getClass();1387boundsCheck(receiver.length, index);1388return _unsafe.getAndBitwiseAndIntAcquire(receiver, computeOffset(index), value);1389}13901391private static final int getAndBitwiseAndRelease(int[] receiver, int index, int value, VarHandle varHandle) {1392receiver.getClass();1393boundsCheck(receiver.length, index);1394return _unsafe.getAndBitwiseAndIntRelease(receiver, computeOffset(index), value);1395}13961397private static final int getAndBitwiseOr(int[] receiver, int index, int value, VarHandle varHandle) {1398receiver.getClass();1399boundsCheck(receiver.length, index);1400return _unsafe.getAndBitwiseOrInt(receiver, computeOffset(index), value);1401}14021403private static final int getAndBitwiseOrAcquire(int[] receiver, int index, int value, VarHandle varHandle) {1404receiver.getClass();1405boundsCheck(receiver.length, index);1406return _unsafe.getAndBitwiseOrIntAcquire(receiver, computeOffset(index), value);1407}14081409private static final int getAndBitwiseOrRelease(int[] receiver, int index, int value, VarHandle varHandle) {1410receiver.getClass();1411boundsCheck(receiver.length, index);1412return _unsafe.getAndBitwiseOrIntRelease(receiver, computeOffset(index), value);1413}14141415private static final int getAndBitwiseXor(int[] receiver, int index, int value, VarHandle varHandle) {1416receiver.getClass();1417boundsCheck(receiver.length, index);1418return _unsafe.getAndBitwiseXorInt(receiver, computeOffset(index), value);1419}14201421private static final int getAndBitwiseXorAcquire(int[] receiver, int index, int value, VarHandle varHandle) {1422receiver.getClass();1423boundsCheck(receiver.length, index);1424return _unsafe.getAndBitwiseXorIntAcquire(receiver, computeOffset(index), value);1425}14261427private static final int getAndBitwiseXorRelease(int[] receiver, int index, int value, VarHandle varHandle) {1428receiver.getClass();1429boundsCheck(receiver.length, index);1430return _unsafe.getAndBitwiseXorIntRelease(receiver, computeOffset(index), value);1431}1432}14331434static final class OpLong extends ArrayVarHandleOperations {1435private static final int BASE_OFFSET = _unsafe.arrayBaseOffset(long[].class);1436private static final int INDEX_SCALE = _unsafe.arrayIndexScale(long[].class);14371438private static final long computeOffset(int index) {1439return computeOffset(index, BASE_OFFSET, INDEX_SCALE);1440}14411442private static final long get(long[] receiver, int index, VarHandle varHandle) {1443receiver.getClass();1444boundsCheck(receiver.length, index);1445return _unsafe.getLong(receiver, computeOffset(index));1446}14471448private static final void set(long[] receiver, int index, long value, VarHandle varHandle) {1449receiver.getClass();1450boundsCheck(receiver.length, index);1451_unsafe.putLong(receiver, computeOffset(index), value);1452}14531454private static final long getVolatile(long[] receiver, int index, VarHandle varHandle) {1455receiver.getClass();1456boundsCheck(receiver.length, index);1457return _unsafe.getLongVolatile(receiver, computeOffset(index));1458}14591460private static final void setVolatile(long[] receiver, int index, long value, VarHandle varHandle) {1461receiver.getClass();1462boundsCheck(receiver.length, index);1463_unsafe.putLongVolatile(receiver, computeOffset(index), value);1464}14651466private static final long getOpaque(long[] receiver, int index, VarHandle varHandle) {1467receiver.getClass();1468boundsCheck(receiver.length, index);1469return _unsafe.getLongOpaque(receiver, computeOffset(index));1470}14711472private static final void setOpaque(long[] receiver, int index, long value, VarHandle varHandle) {1473receiver.getClass();1474boundsCheck(receiver.length, index);1475_unsafe.putLongOpaque(receiver, computeOffset(index), value);1476}14771478private static final long getAcquire(long[] receiver, int index, VarHandle varHandle) {1479receiver.getClass();1480boundsCheck(receiver.length, index);1481return _unsafe.getLongAcquire(receiver, computeOffset(index));1482}14831484private static final void setRelease(long[] receiver, int index, long value, VarHandle varHandle) {1485receiver.getClass();1486boundsCheck(receiver.length, index);1487_unsafe.putLongRelease(receiver, computeOffset(index), value);1488}14891490private static final boolean compareAndSet(long[] receiver, int index, long testValue, long newValue, VarHandle varHandle) {1491receiver.getClass();1492boundsCheck(receiver.length, index);1493/*[IF Sidecar19-SE-OpenJ9]*/1494return _unsafe.compareAndSetLong(receiver, computeOffset(index), testValue, newValue);1495/*[ELSE]1496return _unsafe.compareAndSwapLong(receiver, computeOffset(index), testValue, newValue);1497/*[ENDIF]*/1498}14991500private static final long compareAndExchange(long[] receiver, int index, long testValue, long newValue, VarHandle varHandle) {1501receiver.getClass();1502boundsCheck(receiver.length, index);1503/*[IF Sidecar19-SE-OpenJ9]*/1504return _unsafe.compareAndExchangeLong(receiver, computeOffset(index), testValue, newValue);1505/*[ELSE]1506return _unsafe.compareAndExchangeLongVolatile(receiver, computeOffset(index), testValue, newValue);1507/*[ENDIF]*/1508}15091510private static final long compareAndExchangeAcquire(long[] receiver, int index, long testValue, long newValue, VarHandle varHandle) {1511receiver.getClass();1512boundsCheck(receiver.length, index);1513return _unsafe.compareAndExchangeLongAcquire(receiver, computeOffset(index), testValue, newValue);1514}15151516private static final long compareAndExchangeRelease(long[] receiver, int index, long testValue, long newValue, VarHandle varHandle) {1517receiver.getClass();1518boundsCheck(receiver.length, index);1519return _unsafe.compareAndExchangeLongRelease(receiver, computeOffset(index), testValue, newValue);1520}15211522private static final boolean weakCompareAndSet(long[] receiver, int index, long testValue, long newValue, VarHandle varHandle) {1523receiver.getClass();1524boundsCheck(receiver.length, index);1525/*[IF Sidecar19-SE-OpenJ9]*/1526return _unsafe.weakCompareAndSetLongPlain(receiver, computeOffset(index), testValue, newValue);1527/*[ELSE]1528return _unsafe.weakCompareAndSwapLong(receiver, computeOffset(index), testValue, newValue);1529/*[ENDIF]*/1530}15311532private static final boolean weakCompareAndSetAcquire(long[] receiver, int index, long testValue, long newValue, VarHandle varHandle) {1533receiver.getClass();1534boundsCheck(receiver.length, index);1535/*[IF Sidecar19-SE-OpenJ9]*/1536return _unsafe.weakCompareAndSetLongAcquire(receiver, computeOffset(index), testValue, newValue);1537/*[ELSE]1538return _unsafe.weakCompareAndSwapLongAcquire(receiver, computeOffset(index), testValue, newValue);1539/*[ENDIF]*/1540}15411542private static final boolean weakCompareAndSetRelease(long[] receiver, int index, long testValue, long newValue, VarHandle varHandle) {1543receiver.getClass();1544boundsCheck(receiver.length, index);1545/*[IF Sidecar19-SE-OpenJ9]*/1546return _unsafe.weakCompareAndSetLongRelease(receiver, computeOffset(index), testValue, newValue);1547/*[ELSE]1548return _unsafe.weakCompareAndSwapLongRelease(receiver, computeOffset(index), testValue, newValue);1549/*[ENDIF]*/1550}15511552private static final boolean weakCompareAndSetPlain(long[] receiver, int index, long testValue, long newValue, VarHandle varHandle) {1553receiver.getClass();1554boundsCheck(receiver.length, index);1555/*[IF Sidecar19-SE-OpenJ9]*/1556return _unsafe.weakCompareAndSetLongPlain(receiver, computeOffset(index), testValue, newValue);1557/*[ELSE]1558return _unsafe.weakCompareAndSwapLong(receiver, computeOffset(index), testValue, newValue);1559/*[ENDIF]*/1560}15611562private static final long getAndSet(long[] receiver, int index, long value, VarHandle varHandle) {1563receiver.getClass();1564boundsCheck(receiver.length, index);1565return _unsafe.getAndSetLong(receiver, computeOffset(index), value);1566}15671568private static final long getAndSetAcquire(long[] receiver, int index, long value, VarHandle varHandle) {1569receiver.getClass();1570boundsCheck(receiver.length, index);1571return _unsafe.getAndSetLongAcquire(receiver, computeOffset(index), value);1572}15731574private static final long getAndSetRelease(long[] receiver, int index, long value, VarHandle varHandle) {1575receiver.getClass();1576boundsCheck(receiver.length, index);1577return _unsafe.getAndSetLongRelease(receiver, computeOffset(index), value);1578}15791580private static final long getAndAdd(long[] receiver, int index, long value, VarHandle varHandle) {1581receiver.getClass();1582boundsCheck(receiver.length, index);1583return _unsafe.getAndAddLong(receiver, computeOffset(index), value);1584}15851586private static final long getAndAddAcquire(long[] receiver, int index, long value, VarHandle varHandle) {1587receiver.getClass();1588boundsCheck(receiver.length, index);1589return _unsafe.getAndAddLongAcquire(receiver, computeOffset(index), value);1590}15911592private static final long getAndAddRelease(long[] receiver, int index, long value, VarHandle varHandle) {1593receiver.getClass();1594boundsCheck(receiver.length, index);1595return _unsafe.getAndAddLongRelease(receiver, computeOffset(index), value);1596}15971598private static final long getAndBitwiseAnd(long[] receiver, int index, long value, VarHandle varHandle) {1599receiver.getClass();1600boundsCheck(receiver.length, index);1601return _unsafe.getAndBitwiseAndLong(receiver, computeOffset(index), value);1602}16031604private static final long getAndBitwiseAndAcquire(long[] receiver, int index, long value, VarHandle varHandle) {1605receiver.getClass();1606boundsCheck(receiver.length, index);1607return _unsafe.getAndBitwiseAndLongAcquire(receiver, computeOffset(index), value);1608}16091610private static final long getAndBitwiseAndRelease(long[] receiver, int index, long value, VarHandle varHandle) {1611receiver.getClass();1612boundsCheck(receiver.length, index);1613return _unsafe.getAndBitwiseAndLongRelease(receiver, computeOffset(index), value);1614}16151616private static final long getAndBitwiseOr(long[] receiver, int index, long value, VarHandle varHandle) {1617receiver.getClass();1618boundsCheck(receiver.length, index);1619return _unsafe.getAndBitwiseOrLong(receiver, computeOffset(index), value);1620}16211622private static final long getAndBitwiseOrAcquire(long[] receiver, int index, long value, VarHandle varHandle) {1623receiver.getClass();1624boundsCheck(receiver.length, index);1625return _unsafe.getAndBitwiseOrLongAcquire(receiver, computeOffset(index), value);1626}16271628private static final long getAndBitwiseOrRelease(long[] receiver, int index, long value, VarHandle varHandle) {1629receiver.getClass();1630boundsCheck(receiver.length, index);1631return _unsafe.getAndBitwiseOrLongRelease(receiver, computeOffset(index), value);1632}16331634private static final long getAndBitwiseXor(long[] receiver, int index, long value, VarHandle varHandle) {1635receiver.getClass();1636boundsCheck(receiver.length, index);1637return _unsafe.getAndBitwiseXorLong(receiver, computeOffset(index), value);1638}16391640private static final long getAndBitwiseXorAcquire(long[] receiver, int index, long value, VarHandle varHandle) {1641receiver.getClass();1642boundsCheck(receiver.length, index);1643return _unsafe.getAndBitwiseXorLongAcquire(receiver, computeOffset(index), value);1644}16451646private static final long getAndBitwiseXorRelease(long[] receiver, int index, long value, VarHandle varHandle) {1647receiver.getClass();1648boundsCheck(receiver.length, index);1649return _unsafe.getAndBitwiseXorLongRelease(receiver, computeOffset(index), value);1650}1651}16521653static final class OpShort extends ArrayVarHandleOperations {1654private static final int BASE_OFFSET = _unsafe.arrayBaseOffset(short[].class);1655private static final int INDEX_SCALE = _unsafe.arrayIndexScale(short[].class);16561657private static final long computeOffset(int index) {1658return computeOffset(index, BASE_OFFSET, INDEX_SCALE);1659}16601661private static final short get(short[] receiver, int index, VarHandle varHandle) {1662receiver.getClass();1663boundsCheck(receiver.length, index);1664return _unsafe.getShort(receiver, computeOffset(index));1665}16661667private static final void set(short[] receiver, int index, short value, VarHandle varHandle) {1668receiver.getClass();1669boundsCheck(receiver.length, index);1670_unsafe.putShort(receiver, computeOffset(index), value);1671}16721673private static final short getVolatile(short[] receiver, int index, VarHandle varHandle) {1674receiver.getClass();1675boundsCheck(receiver.length, index);1676return _unsafe.getShortVolatile(receiver, computeOffset(index));1677}16781679private static final void setVolatile(short[] receiver, int index, short value, VarHandle varHandle) {1680receiver.getClass();1681boundsCheck(receiver.length, index);1682_unsafe.putShortVolatile(receiver, computeOffset(index), value);1683}16841685private static final short getOpaque(short[] receiver, int index, VarHandle varHandle) {1686receiver.getClass();1687boundsCheck(receiver.length, index);1688return _unsafe.getShortOpaque(receiver, computeOffset(index));1689}16901691private static final void setOpaque(short[] receiver, int index, short value, VarHandle varHandle) {1692receiver.getClass();1693boundsCheck(receiver.length, index);1694_unsafe.putShortOpaque(receiver, computeOffset(index), value);1695}16961697private static final short getAcquire(short[] receiver, int index, VarHandle varHandle) {1698receiver.getClass();1699boundsCheck(receiver.length, index);1700return _unsafe.getShortAcquire(receiver, computeOffset(index));1701}17021703private static final void setRelease(short[] receiver, int index, short value, VarHandle varHandle) {1704receiver.getClass();1705boundsCheck(receiver.length, index);1706_unsafe.putShortRelease(receiver, computeOffset(index), value);1707}17081709private static final boolean compareAndSet(short[] receiver, int index, short testValue, short newValue, VarHandle varHandle) {1710receiver.getClass();1711boundsCheck(receiver.length, index);1712/*[IF Sidecar19-SE-OpenJ9]*/1713return _unsafe.compareAndSetShort(receiver, computeOffset(index), testValue, newValue);1714/*[ELSE]1715return _unsafe.compareAndSwapShort(receiver, computeOffset(index), testValue, newValue);1716/*[ENDIF]*/1717}17181719private static final short compareAndExchange(short[] receiver, int index, short testValue, short newValue, VarHandle varHandle) {1720receiver.getClass();1721boundsCheck(receiver.length, index);1722/*[IF Sidecar19-SE-OpenJ9]*/1723return _unsafe.compareAndExchangeShort(receiver, computeOffset(index), testValue, newValue);1724/*[ELSE]1725return _unsafe.compareAndExchangeShortVolatile(receiver, computeOffset(index), testValue, newValue);1726/*[ENDIF]*/1727}17281729private static final short compareAndExchangeAcquire(short[] receiver, int index, short testValue, short newValue, VarHandle varHandle) {1730receiver.getClass();1731boundsCheck(receiver.length, index);1732return _unsafe.compareAndExchangeShortAcquire(receiver, computeOffset(index), testValue, newValue);1733}17341735private static final short compareAndExchangeRelease(short[] receiver, int index, short testValue, short newValue, VarHandle varHandle) {1736receiver.getClass();1737boundsCheck(receiver.length, index);1738return _unsafe.compareAndExchangeShortRelease(receiver, computeOffset(index), testValue, newValue);1739}17401741private static final boolean weakCompareAndSet(short[] receiver, int index, short testValue, short newValue, VarHandle varHandle) {1742receiver.getClass();1743boundsCheck(receiver.length, index);1744/*[IF Sidecar19-SE-OpenJ9]*/1745return _unsafe.weakCompareAndSetShortPlain(receiver, computeOffset(index), testValue, newValue);1746/*[ELSE]1747return _unsafe.weakCompareAndSwapShort(receiver, computeOffset(index), testValue, newValue);1748/*[ENDIF]*/1749}17501751private static final boolean weakCompareAndSetAcquire(short[] receiver, int index, short testValue, short newValue, VarHandle varHandle) {1752receiver.getClass();1753boundsCheck(receiver.length, index);1754/*[IF Sidecar19-SE-OpenJ9]*/1755return _unsafe.weakCompareAndSetShortAcquire(receiver, computeOffset(index), testValue, newValue);1756/*[ELSE]1757return _unsafe.weakCompareAndSwapShortAcquire(receiver, computeOffset(index), testValue, newValue);1758/*[ENDIF]*/1759}17601761private static final boolean weakCompareAndSetRelease(short[] receiver, int index, short testValue, short newValue, VarHandle varHandle) {1762receiver.getClass();1763boundsCheck(receiver.length, index);1764/*[IF Sidecar19-SE-OpenJ9]*/1765return _unsafe.weakCompareAndSetShortRelease(receiver, computeOffset(index), testValue, newValue);1766/*[ELSE]1767return _unsafe.weakCompareAndSwapShortRelease(receiver, computeOffset(index), testValue, newValue);1768/*[ENDIF]*/1769}17701771private static final boolean weakCompareAndSetPlain(short[] receiver, int index, short testValue, short newValue, VarHandle varHandle) {1772receiver.getClass();1773boundsCheck(receiver.length, index);1774/*[IF Sidecar19-SE-OpenJ9]*/1775return _unsafe.weakCompareAndSetShortPlain(receiver, computeOffset(index), testValue, newValue);1776/*[ELSE]1777return _unsafe.weakCompareAndSwapShort(receiver, computeOffset(index), testValue, newValue);1778/*[ENDIF]*/1779}17801781private static final short getAndSet(short[] receiver, int index, short value, VarHandle varHandle) {1782receiver.getClass();1783boundsCheck(receiver.length, index);1784return _unsafe.getAndSetShort(receiver, computeOffset(index), value);1785}17861787private static final short getAndSetAcquire(short[] receiver, int index, short value, VarHandle varHandle) {1788receiver.getClass();1789boundsCheck(receiver.length, index);1790return _unsafe.getAndSetShortAcquire(receiver, computeOffset(index), value);1791}17921793private static final short getAndSetRelease(short[] receiver, int index, short value, VarHandle varHandle) {1794receiver.getClass();1795boundsCheck(receiver.length, index);1796return _unsafe.getAndSetShortRelease(receiver, computeOffset(index), value);1797}17981799private static final short getAndAdd(short[] receiver, int index, short value, VarHandle varHandle) {1800receiver.getClass();1801boundsCheck(receiver.length, index);1802return _unsafe.getAndAddShort(receiver, computeOffset(index), value);1803}18041805private static final short getAndAddAcquire(short[] receiver, int index, short value, VarHandle varHandle) {1806receiver.getClass();1807boundsCheck(receiver.length, index);1808return _unsafe.getAndAddShortAcquire(receiver, computeOffset(index), value);1809}18101811private static final short getAndAddRelease(short[] receiver, int index, short value, VarHandle varHandle) {1812receiver.getClass();1813boundsCheck(receiver.length, index);1814return _unsafe.getAndAddShortRelease(receiver, computeOffset(index), value);1815}18161817private static final short getAndBitwiseAnd(short[] receiver, int index, short value, VarHandle varHandle) {1818receiver.getClass();1819boundsCheck(receiver.length, index);1820return _unsafe.getAndBitwiseAndShort(receiver, computeOffset(index), value);1821}18221823private static final short getAndBitwiseAndAcquire(short[] receiver, int index, short value, VarHandle varHandle) {1824receiver.getClass();1825boundsCheck(receiver.length, index);1826return _unsafe.getAndBitwiseAndShortAcquire(receiver, computeOffset(index), value);1827}18281829private static final short getAndBitwiseAndRelease(short[] receiver, int index, short value, VarHandle varHandle) {1830receiver.getClass();1831boundsCheck(receiver.length, index);1832return _unsafe.getAndBitwiseAndShortRelease(receiver, computeOffset(index), value);1833}18341835private static final short getAndBitwiseOr(short[] receiver, int index, short value, VarHandle varHandle) {1836receiver.getClass();1837boundsCheck(receiver.length, index);1838return _unsafe.getAndBitwiseOrShort(receiver, computeOffset(index), value);1839}18401841private static final short getAndBitwiseOrAcquire(short[] receiver, int index, short value, VarHandle varHandle) {1842receiver.getClass();1843boundsCheck(receiver.length, index);1844return _unsafe.getAndBitwiseOrShortAcquire(receiver, computeOffset(index), value);1845}18461847private static final short getAndBitwiseOrRelease(short[] receiver, int index, short value, VarHandle varHandle) {1848receiver.getClass();1849boundsCheck(receiver.length, index);1850return _unsafe.getAndBitwiseOrShortRelease(receiver, computeOffset(index), value);1851}18521853private static final short getAndBitwiseXor(short[] receiver, int index, short value, VarHandle varHandle) {1854receiver.getClass();1855boundsCheck(receiver.length, index);1856return _unsafe.getAndBitwiseXorShort(receiver, computeOffset(index), value);1857}18581859private static final short getAndBitwiseXorAcquire(short[] receiver, int index, short value, VarHandle varHandle) {1860receiver.getClass();1861boundsCheck(receiver.length, index);1862return _unsafe.getAndBitwiseXorShortAcquire(receiver, computeOffset(index), value);1863}18641865private static final short getAndBitwiseXorRelease(short[] receiver, int index, short value, VarHandle varHandle) {1866receiver.getClass();1867boundsCheck(receiver.length, index);1868return _unsafe.getAndBitwiseXorShortRelease(receiver, computeOffset(index), value);1869}1870}18711872static final class OpBoolean extends ArrayVarHandleOperations {1873private static final int BASE_OFFSET = _unsafe.arrayBaseOffset(boolean[].class);1874private static final int INDEX_SCALE = _unsafe.arrayIndexScale(boolean[].class);18751876private static final long computeOffset(int index) {1877return computeOffset(index, BASE_OFFSET, INDEX_SCALE);1878}18791880private static final boolean get(boolean[] receiver, int index, VarHandle varHandle) {1881receiver.getClass();1882boundsCheck(receiver.length, index);1883return _unsafe.getBoolean(receiver, computeOffset(index));1884}18851886private static final void set(boolean[] receiver, int index, boolean value, VarHandle varHandle) {1887receiver.getClass();1888boundsCheck(receiver.length, index);1889_unsafe.putBoolean(receiver, computeOffset(index), value);1890}18911892private static final boolean getVolatile(boolean[] receiver, int index, VarHandle varHandle) {1893receiver.getClass();1894boundsCheck(receiver.length, index);1895return _unsafe.getBooleanVolatile(receiver, computeOffset(index));1896}18971898private static final void setVolatile(boolean[] receiver, int index, boolean value, VarHandle varHandle) {1899receiver.getClass();1900boundsCheck(receiver.length, index);1901_unsafe.putBooleanVolatile(receiver, computeOffset(index), value);1902}19031904private static final boolean getOpaque(boolean[] receiver, int index, VarHandle varHandle) {1905receiver.getClass();1906boundsCheck(receiver.length, index);1907return _unsafe.getBooleanOpaque(receiver, computeOffset(index));1908}19091910private static final void setOpaque(boolean[] receiver, int index, boolean value, VarHandle varHandle) {1911receiver.getClass();1912boundsCheck(receiver.length, index);1913_unsafe.putBooleanOpaque(receiver, computeOffset(index), value);1914}19151916private static final boolean getAcquire(boolean[] receiver, int index, VarHandle varHandle) {1917receiver.getClass();1918boundsCheck(receiver.length, index);1919return _unsafe.getBooleanAcquire(receiver, computeOffset(index));1920}19211922private static final void setRelease(boolean[] receiver, int index, boolean value, VarHandle varHandle) {1923receiver.getClass();1924boundsCheck(receiver.length, index);1925_unsafe.putBooleanRelease(receiver, computeOffset(index), value);1926}19271928private static final boolean compareAndSet(boolean[] receiver, int index, boolean testValue, boolean newValue, VarHandle varHandle) {1929receiver.getClass();1930boundsCheck(receiver.length, index);1931/*[IF Sidecar19-SE-OpenJ9]*/1932return _unsafe.compareAndSetBoolean(receiver, computeOffset(index), testValue, newValue);1933/*[ELSE]1934return _unsafe.compareAndSwapBoolean(receiver, computeOffset(index), testValue, newValue);1935/*[ENDIF]*/1936}19371938private static final boolean compareAndExchange(boolean[] receiver, int index, boolean testValue, boolean newValue, VarHandle varHandle) {1939receiver.getClass();1940boundsCheck(receiver.length, index);1941/*[IF Sidecar19-SE-OpenJ9]*/1942return _unsafe.compareAndExchangeBoolean(receiver, computeOffset(index), testValue, newValue);1943/*[ELSE]1944return _unsafe.compareAndExchangeBooleanVolatile(receiver, computeOffset(index), testValue, newValue);1945/*[ENDIF]*/1946}19471948private static final boolean compareAndExchangeAcquire(boolean[] receiver, int index, boolean testValue, boolean newValue, VarHandle varHandle) {1949receiver.getClass();1950boundsCheck(receiver.length, index);1951return _unsafe.compareAndExchangeBooleanAcquire(receiver, computeOffset(index), testValue, newValue);1952}19531954private static final boolean compareAndExchangeRelease(boolean[] receiver, int index, boolean testValue, boolean newValue, VarHandle varHandle) {1955receiver.getClass();1956boundsCheck(receiver.length, index);1957return _unsafe.compareAndExchangeBooleanRelease(receiver, computeOffset(index), testValue, newValue);1958}19591960private static final boolean weakCompareAndSet(boolean[] receiver, int index, boolean testValue, boolean newValue, VarHandle varHandle) {1961receiver.getClass();1962boundsCheck(receiver.length, index);1963/*[IF Sidecar19-SE-OpenJ9]*/1964return _unsafe.weakCompareAndSetBooleanPlain(receiver, computeOffset(index), testValue, newValue);1965/*[ELSE]1966return _unsafe.weakCompareAndSwapBoolean(receiver, computeOffset(index), testValue, newValue);1967/*[ENDIF]*/1968}19691970private static final boolean weakCompareAndSetAcquire(boolean[] receiver, int index, boolean testValue, boolean newValue, VarHandle varHandle) {1971receiver.getClass();1972boundsCheck(receiver.length, index);1973/*[IF Sidecar19-SE-OpenJ9]*/1974return _unsafe.weakCompareAndSetBooleanAcquire(receiver, computeOffset(index), testValue, newValue);1975/*[ELSE]1976return _unsafe.weakCompareAndSwapBooleanAcquire(receiver, computeOffset(index), testValue, newValue);1977/*[ENDIF]*/1978}19791980private static final boolean weakCompareAndSetRelease(boolean[] receiver, int index, boolean testValue, boolean newValue, VarHandle varHandle) {1981receiver.getClass();1982boundsCheck(receiver.length, index);1983/*[IF Sidecar19-SE-OpenJ9]*/1984return _unsafe.weakCompareAndSetBooleanRelease(receiver, computeOffset(index), testValue, newValue);1985/*[ELSE]1986return _unsafe.weakCompareAndSwapBooleanRelease(receiver, computeOffset(index), testValue, newValue);1987/*[ENDIF]*/1988}19891990private static final boolean weakCompareAndSetPlain(boolean[] receiver, int index, boolean testValue, boolean newValue, VarHandle varHandle) {1991receiver.getClass();1992boundsCheck(receiver.length, index);1993/*[IF Sidecar19-SE-OpenJ9]*/1994return _unsafe.weakCompareAndSetBooleanPlain(receiver, computeOffset(index), testValue, newValue);1995/*[ELSE]1996return _unsafe.weakCompareAndSwapBoolean(receiver, computeOffset(index), testValue, newValue);1997/*[ENDIF]*/1998}19992000private static final boolean getAndSet(boolean[] receiver, int index, boolean value, VarHandle varHandle) {2001receiver.getClass();2002boundsCheck(receiver.length, index);2003return _unsafe.getAndSetBoolean(receiver, computeOffset(index), value);2004}20052006private static final boolean getAndSetAcquire(boolean[] receiver, int index, boolean value, VarHandle varHandle) {2007receiver.getClass();2008boundsCheck(receiver.length, index);2009return _unsafe.getAndSetBooleanAcquire(receiver, computeOffset(index), value);2010}20112012private static final boolean getAndSetRelease(boolean[] receiver, int index, boolean value, VarHandle varHandle) {2013receiver.getClass();2014boundsCheck(receiver.length, index);2015return _unsafe.getAndSetBooleanRelease(receiver, computeOffset(index), value);2016}20172018private static final boolean getAndAdd(boolean[] receiver, int index, boolean value, VarHandle varHandle) {2019throw operationNotSupported(varHandle);2020}20212022private static final boolean getAndAddAcquire(boolean[] receiver, int index, boolean value, VarHandle varHandle) {2023throw operationNotSupported(varHandle);2024}20252026private static final boolean getAndAddRelease(boolean[] receiver, int index, boolean value, VarHandle varHandle) {2027throw operationNotSupported(varHandle);2028}20292030private static final boolean getAndBitwiseAnd(boolean[] receiver, int index, boolean value, VarHandle varHandle) {2031receiver.getClass();2032boundsCheck(receiver.length, index);2033return _unsafe.getAndBitwiseAndBoolean(receiver, computeOffset(index), value);2034}20352036private static final boolean getAndBitwiseAndAcquire(boolean[] receiver, int index, boolean value, VarHandle varHandle) {2037receiver.getClass();2038boundsCheck(receiver.length, index);2039return _unsafe.getAndBitwiseAndBooleanAcquire(receiver, computeOffset(index), value);2040}20412042private static final boolean getAndBitwiseAndRelease(boolean[] receiver, int index, boolean value, VarHandle varHandle) {2043receiver.getClass();2044boundsCheck(receiver.length, index);2045return _unsafe.getAndBitwiseAndBooleanRelease(receiver, computeOffset(index), value);2046}20472048private static final boolean getAndBitwiseOr(boolean[] receiver, int index, boolean value, VarHandle varHandle) {2049receiver.getClass();2050boundsCheck(receiver.length, index);2051return _unsafe.getAndBitwiseOrBoolean(receiver, computeOffset(index), value);2052}20532054private static final boolean getAndBitwiseOrAcquire(boolean[] receiver, int index, boolean value, VarHandle varHandle) {2055receiver.getClass();2056boundsCheck(receiver.length, index);2057return _unsafe.getAndBitwiseOrBooleanAcquire(receiver, computeOffset(index), value);2058}20592060private static final boolean getAndBitwiseOrRelease(boolean[] receiver, int index, boolean value, VarHandle varHandle) {2061receiver.getClass();2062boundsCheck(receiver.length, index);2063return _unsafe.getAndBitwiseOrBooleanRelease(receiver, computeOffset(index), value);2064}20652066private static final boolean getAndBitwiseXor(boolean[] receiver, int index, boolean value, VarHandle varHandle) {2067receiver.getClass();2068boundsCheck(receiver.length, index);2069return _unsafe.getAndBitwiseXorBoolean(receiver, computeOffset(index), value);2070}20712072private static final boolean getAndBitwiseXorAcquire(boolean[] receiver, int index, boolean value, VarHandle varHandle) {2073receiver.getClass();2074boundsCheck(receiver.length, index);2075return _unsafe.getAndBitwiseXorBooleanAcquire(receiver, computeOffset(index), value);2076}20772078private static final boolean getAndBitwiseXorRelease(boolean[] receiver, int index, boolean value, VarHandle varHandle) {2079receiver.getClass();2080boundsCheck(receiver.length, index);2081return _unsafe.getAndBitwiseXorBooleanRelease(receiver, computeOffset(index), value);2082}2083}2084}2085}208620872088