< prev index next >

src/java.base/share/classes/java/lang/invoke/X-VarHandle.java.template

Print this page

        

*** 1145,1150 **** --- 1145,1366 ---- } #end[Bitwise] static final VarForm FORM = new VarForm(Array.class, {#if[Object]?Object[].class:$type$[].class}, {#if[Object]?Object.class:$type$.class}, int.class); } + + #if[Object] + static final class ValueArray extends VarHandle { + final int abase; + final int ashift; + final Class<?> arrayType; + final Class<?> componentType; + + ValueArray(int abase, int ashift, Class<?> arrayType) { + super(ValueArray.FORM); + this.abase = abase; + this.ashift = ashift; + this.arrayType = arrayType; + this.componentType = arrayType.getComponentType(); + } + + @Override + final MethodType accessModeTypeUncached(AccessMode accessMode) { + return accessMode.at.accessModeType(arrayType, arrayType.getComponentType(), int.class); + } + + @ForceInline + static Object runtimeTypeCheck(ValueArray handle, Object[] oarray, Object value) { + if (handle.arrayType == oarray.getClass()) { + // Fast path: static array type same as argument array type + return handle.componentType.cast(Objects.requireNonNull(value)); + } else { + // Slow path: check value against argument array component type + return reflectiveTypeCheck(oarray, value); + } + } + + @ForceInline + static Object reflectiveTypeCheck(Object[] oarray, Object value) { + try { + return oarray.getClass().getComponentType().cast(Objects.requireNonNull(value)); + } catch (ClassCastException e) { + throw new ArrayStoreException(); + } + } + + @ForceInline + static $type$ get(ValueArray handle, Object oarray, int index) { + Object[] array = (Object[]) handle.arrayType.cast(oarray); + return array[index]; + } + + @ForceInline + static void set(ValueArray handle, Object oarray, int index, $type$ value) { + Object[] array = (Object[]) handle.arrayType.cast(oarray); + array[index] = handle.componentType.cast(Objects.requireNonNull(value)); + } + + @ForceInline + static $type$ getVolatile(ValueArray handle, Object oarray, int index) { + Object[] array = (Object[]) handle.arrayType.cast(oarray); + return UNSAFE.getValueVolatile(array, + (((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase, + handle.componentType); + } + + @ForceInline + static void setVolatile(ValueArray handle, Object oarray, int index, $type$ value) { + Object[] array = (Object[]) handle.arrayType.cast(oarray); + UNSAFE.putValueVolatile(array, + (((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase, + handle.componentType, + runtimeTypeCheck(handle, array, value)); + } + + @ForceInline + static $type$ getOpaque(ValueArray handle, Object oarray, int index) { + Object[] array = (Object[]) handle.arrayType.cast(oarray); + return UNSAFE.getValueOpaque(array, + (((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase, + handle.componentType); + } + + @ForceInline + static void setOpaque(ValueArray handle, Object oarray, int index, $type$ value) { + Object[] array = (Object[]) handle.arrayType.cast(oarray); + UNSAFE.putValueOpaque(array, + (((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase, + handle.componentType, + runtimeTypeCheck(handle, array, value)); + } + + @ForceInline + static $type$ getAcquire(ValueArray handle, Object oarray, int index) { + Object[] array = (Object[]) handle.arrayType.cast(oarray); + return UNSAFE.getValueAcquire(array, + (((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase, + handle.componentType); + } + + @ForceInline + static void setRelease(ValueArray handle, Object oarray, int index, $type$ value) { + Object[] array = (Object[]) handle.arrayType.cast(oarray); + UNSAFE.putValueRelease(array, + (((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase, + handle.componentType, + runtimeTypeCheck(handle, array, value)); + } + #if[CAS] + + @ForceInline + static boolean compareAndSet(ValueArray handle, Object oarray, int index, $type$ expected, $type$ value) { + Object[] array = (Object[]) handle.arrayType.cast(oarray); + return UNSAFE.compareAndSetValue(array, + (((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase, + handle.componentType, + handle.componentType.cast(Objects.requireNonNull(expected)), + runtimeTypeCheck(handle, array, value)); + } + + @ForceInline + static $type$ compareAndExchange(ValueArray handle, Object oarray, int index, $type$ expected, $type$ value) { + Object[] array = (Object[]) handle.arrayType.cast(oarray); + return UNSAFE.compareAndExchangeValue(array, + (((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase, + handle.componentType, + handle.componentType.cast(Objects.requireNonNull(expected)), + runtimeTypeCheck(handle, array, value)); + } + + @ForceInline + static $type$ compareAndExchangeAcquire(ValueArray handle, Object oarray, int index, $type$ expected, $type$ value) { + Object[] array = (Object[]) handle.arrayType.cast(oarray); + return UNSAFE.compareAndExchangeValueAcquire(array, + (((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase, + handle.componentType, + handle.componentType.cast(Objects.requireNonNull(expected)), + runtimeTypeCheck(handle, array, value)); + } + + @ForceInline + static $type$ compareAndExchangeRelease(ValueArray handle, Object oarray, int index, $type$ expected, $type$ value) { + Object[] array = (Object[]) handle.arrayType.cast(oarray); + return UNSAFE.compareAndExchangeValueRelease(array, + (((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase, + handle.componentType, + handle.componentType.cast(Objects.requireNonNull(expected)), + runtimeTypeCheck(handle, array, value)); + } + + @ForceInline + static boolean weakCompareAndSetPlain(ValueArray handle, Object oarray, int index, $type$ expected, $type$ value) { + Object[] array = (Object[]) handle.arrayType.cast(oarray); + return UNSAFE.weakCompareAndSetValuePlain(array, + (((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase, + handle.componentType, + handle.componentType.cast(Objects.requireNonNull(expected)), + runtimeTypeCheck(handle, array, value)); + } + + @ForceInline + static boolean weakCompareAndSet(ValueArray handle, Object oarray, int index, $type$ expected, $type$ value) { + Object[] array = (Object[]) handle.arrayType.cast(oarray); + return UNSAFE.weakCompareAndSetValue(array, + (((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase, + handle.componentType, + handle.componentType.cast(Objects.requireNonNull(expected)), + runtimeTypeCheck(handle, array, value)); + } + + @ForceInline + static boolean weakCompareAndSetAcquire(ValueArray handle, Object oarray, int index, $type$ expected, $type$ value) { + Object[] array = (Object[]) handle.arrayType.cast(oarray); + return UNSAFE.weakCompareAndSetValueAcquire(array, + (((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase, + handle.componentType, + handle.componentType.cast(Objects.requireNonNull(expected)), + runtimeTypeCheck(handle, array, value)); + } + + @ForceInline + static boolean weakCompareAndSetRelease(ValueArray handle, Object oarray, int index, $type$ expected, $type$ value) { + Object[] array = (Object[]) handle.arrayType.cast(oarray); + return UNSAFE.weakCompareAndSetValueRelease(array, + (((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase, + handle.componentType, + handle.componentType.cast(Objects.requireNonNull(expected)), + runtimeTypeCheck(handle, array, value)); + } + + @ForceInline + static $type$ getAndSet(ValueArray handle, Object oarray, int index, $type$ value) { + Object[] array = (Object[]) handle.arrayType.cast(oarray); + return UNSAFE.getAndSetValue(array, + (((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase, + handle.componentType, + runtimeTypeCheck(handle, array, value)); + } + + @ForceInline + static $type$ getAndSetAcquire(ValueArray handle, Object oarray, int index, $type$ value) { + Object[] array = (Object[]) handle.arrayType.cast(oarray); + return UNSAFE.getAndSetValueAcquire(array, + (((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase, + handle.componentType, + runtimeTypeCheck(handle, array, value)); + } + + @ForceInline + static $type$ getAndSetRelease(ValueArray handle, Object oarray, int index, $type$ value) { + Object[] array = (Object[]) handle.arrayType.cast(oarray); + return UNSAFE.getAndSetValueRelease(array, + (((long) Preconditions.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase, + handle.componentType, + runtimeTypeCheck(handle, array, value)); + } + #end[CAS] + + static final VarForm FORM = new VarForm(ValueArray.class, {#if[Object]?Object[].class:$type$[].class}, {#if[Object]?Object.class:$type$.class}, int.class); + } + #end[Object] }
< prev index next >