< prev index next >
src/java.base/share/classes/java/lang/invoke/X-VarHandle.java.template
Print this page
@@ -87,127 +87,141 @@
static final VarForm FORM = new VarForm(FieldInstanceReadOnly.class, Object.class, $type$.class);
}
static final class FieldInstanceReadWrite extends FieldInstanceReadOnly {
-
- FieldInstanceReadWrite(Class<?> receiverType, long fieldOffset{#if[Object]?, Class<?> fieldType}) {
+#if[Object]
+ final boolean needsNullCheck;
+#end[Object]
+ FieldInstanceReadWrite(Class<?> receiverType, long fieldOffset{#if[Object]?, Class<?> fieldType, boolean nullable}) {
super(receiverType, fieldOffset{#if[Object]?, fieldType}, FieldInstanceReadWrite.FORM);
+#if[Object]
+ this.needsNullCheck = !nullable;
+#end[Object]
}
+#if[Object]
+ @ForceInline
+ static Object checkCast(FieldInstanceReadWrite handle, $type$ value) {
+ if (handle.needsNullCheck)
+ Objects.requireNonNull(value);
+ return handle.fieldType.cast(value);
+ }
+#end[Object]
+
@ForceInline
static void set(FieldInstanceReadWrite handle, Object holder, $type$ value) {
UNSAFE.put$Type$(Objects.requireNonNull(handle.receiverType.cast(holder)),
handle.fieldOffset,
- {#if[Object]?handle.fieldType.cast(value):value});
+ {#if[Object]?checkCast(handle, value):value});
}
@ForceInline
static void setVolatile(FieldInstanceReadWrite handle, Object holder, $type$ value) {
UNSAFE.put$Type$Volatile(Objects.requireNonNull(handle.receiverType.cast(holder)),
handle.fieldOffset,
- {#if[Object]?handle.fieldType.cast(value):value});
+ {#if[Object]?checkCast(handle, value):value});
}
@ForceInline
static void setOpaque(FieldInstanceReadWrite handle, Object holder, $type$ value) {
UNSAFE.put$Type$Opaque(Objects.requireNonNull(handle.receiverType.cast(holder)),
handle.fieldOffset,
- {#if[Object]?handle.fieldType.cast(value):value});
+ {#if[Object]?checkCast(handle, value):value});
}
@ForceInline
static void setRelease(FieldInstanceReadWrite handle, Object holder, $type$ value) {
UNSAFE.put$Type$Release(Objects.requireNonNull(handle.receiverType.cast(holder)),
handle.fieldOffset,
- {#if[Object]?handle.fieldType.cast(value):value});
+ {#if[Object]?checkCast(handle, value):value});
}
#if[CAS]
@ForceInline
static boolean compareAndSet(FieldInstanceReadWrite handle, Object holder, $type$ expected, $type$ value) {
return UNSAFE.compareAndSet$Type$(Objects.requireNonNull(handle.receiverType.cast(holder)),
handle.fieldOffset,
{#if[Object]?handle.fieldType.cast(expected):expected},
- {#if[Object]?handle.fieldType.cast(value):value});
+ {#if[Object]?checkCast(handle, value):value});
}
@ForceInline
static $type$ compareAndExchange(FieldInstanceReadWrite handle, Object holder, $type$ expected, $type$ value) {
return UNSAFE.compareAndExchange$Type$(Objects.requireNonNull(handle.receiverType.cast(holder)),
handle.fieldOffset,
{#if[Object]?handle.fieldType.cast(expected):expected},
- {#if[Object]?handle.fieldType.cast(value):value});
+ {#if[Object]?checkCast(handle, value):value});
}
@ForceInline
static $type$ compareAndExchangeAcquire(FieldInstanceReadWrite handle, Object holder, $type$ expected, $type$ value) {
return UNSAFE.compareAndExchange$Type$Acquire(Objects.requireNonNull(handle.receiverType.cast(holder)),
handle.fieldOffset,
{#if[Object]?handle.fieldType.cast(expected):expected},
- {#if[Object]?handle.fieldType.cast(value):value});
+ {#if[Object]?checkCast(handle, value):value});
}
@ForceInline
static $type$ compareAndExchangeRelease(FieldInstanceReadWrite handle, Object holder, $type$ expected, $type$ value) {
return UNSAFE.compareAndExchange$Type$Release(Objects.requireNonNull(handle.receiverType.cast(holder)),
handle.fieldOffset,
{#if[Object]?handle.fieldType.cast(expected):expected},
- {#if[Object]?handle.fieldType.cast(value):value});
+ {#if[Object]?checkCast(handle, value):value});
}
@ForceInline
static boolean weakCompareAndSetPlain(FieldInstanceReadWrite handle, Object holder, $type$ expected, $type$ value) {
return UNSAFE.weakCompareAndSet$Type$Plain(Objects.requireNonNull(handle.receiverType.cast(holder)),
handle.fieldOffset,
{#if[Object]?handle.fieldType.cast(expected):expected},
- {#if[Object]?handle.fieldType.cast(value):value});
+ {#if[Object]?checkCast(handle, value):value});
}
@ForceInline
static boolean weakCompareAndSet(FieldInstanceReadWrite handle, Object holder, $type$ expected, $type$ value) {
return UNSAFE.weakCompareAndSet$Type$(Objects.requireNonNull(handle.receiverType.cast(holder)),
handle.fieldOffset,
{#if[Object]?handle.fieldType.cast(expected):expected},
- {#if[Object]?handle.fieldType.cast(value):value});
+ {#if[Object]?checkCast(handle, value):value});
}
@ForceInline
static boolean weakCompareAndSetAcquire(FieldInstanceReadWrite handle, Object holder, $type$ expected, $type$ value) {
return UNSAFE.weakCompareAndSet$Type$Acquire(Objects.requireNonNull(handle.receiverType.cast(holder)),
handle.fieldOffset,
{#if[Object]?handle.fieldType.cast(expected):expected},
- {#if[Object]?handle.fieldType.cast(value):value});
+ {#if[Object]?checkCast(handle, value):value});
}
@ForceInline
static boolean weakCompareAndSetRelease(FieldInstanceReadWrite handle, Object holder, $type$ expected, $type$ value) {
return UNSAFE.weakCompareAndSet$Type$Release(Objects.requireNonNull(handle.receiverType.cast(holder)),
handle.fieldOffset,
{#if[Object]?handle.fieldType.cast(expected):expected},
- {#if[Object]?handle.fieldType.cast(value):value});
+ {#if[Object]?checkCast(handle, value):value});
}
@ForceInline
static $type$ getAndSet(FieldInstanceReadWrite handle, Object holder, $type$ value) {
return UNSAFE.getAndSet$Type$(Objects.requireNonNull(handle.receiverType.cast(holder)),
handle.fieldOffset,
- {#if[Object]?handle.fieldType.cast(value):value});
+ {#if[Object]?checkCast(handle, value):value});
}
@ForceInline
static $type$ getAndSetAcquire(FieldInstanceReadWrite handle, Object holder, $type$ value) {
return UNSAFE.getAndSet$Type$Acquire(Objects.requireNonNull(handle.receiverType.cast(holder)),
handle.fieldOffset,
- {#if[Object]?handle.fieldType.cast(value):value});
+ {#if[Object]?checkCast(handle, value):value});
}
@ForceInline
static $type$ getAndSetRelease(FieldInstanceReadWrite handle, Object holder, $type$ value) {
return UNSAFE.getAndSet$Type$Release(Objects.requireNonNull(handle.receiverType.cast(holder)),
handle.fieldOffset,
- {#if[Object]?handle.fieldType.cast(value):value});
+ {#if[Object]?checkCast(handle, value):value});
}
#end[CAS]
#if[AtomicAdd]
@ForceInline
@@ -354,128 +368,141 @@
static final VarForm FORM = new VarForm(FieldStaticReadOnly.class, null, $type$.class);
}
static final class FieldStaticReadWrite extends FieldStaticReadOnly {
-
- FieldStaticReadWrite(Object base, long fieldOffset{#if[Object]?, Class<?> fieldType}) {
+#if[Object]
+ final boolean needsNullCheck;
+#end[Object]
+ FieldStaticReadWrite(Object base, long fieldOffset{#if[Object]?, Class<?> fieldType, boolean nullable}) {
super(base, fieldOffset{#if[Object]?, fieldType}, FieldStaticReadWrite.FORM);
+#if[Object]
+ this.needsNullCheck = !nullable;
+#end[Object]
+ }
+
+#if[Object]
+ static Object checkCast(FieldStaticReadWrite handle, $type$ value) {
+ if (handle.needsNullCheck)
+ Objects.requireNonNull(value);
+ return handle.fieldType.cast(value);
}
+#end[Object]
@ForceInline
static void set(FieldStaticReadWrite handle, $type$ value) {
UNSAFE.put$Type$(handle.base,
handle.fieldOffset,
- {#if[Object]?handle.fieldType.cast(value):value});
+ {#if[Object]?checkCast(handle, value):value});
}
@ForceInline
static void setVolatile(FieldStaticReadWrite handle, $type$ value) {
UNSAFE.put$Type$Volatile(handle.base,
handle.fieldOffset,
- {#if[Object]?handle.fieldType.cast(value):value});
+ {#if[Object]?checkCast(handle, value):value});
}
@ForceInline
static void setOpaque(FieldStaticReadWrite handle, $type$ value) {
UNSAFE.put$Type$Opaque(handle.base,
handle.fieldOffset,
- {#if[Object]?handle.fieldType.cast(value):value});
+ {#if[Object]?checkCast(handle, value):value});
}
@ForceInline
static void setRelease(FieldStaticReadWrite handle, $type$ value) {
UNSAFE.put$Type$Release(handle.base,
handle.fieldOffset,
- {#if[Object]?handle.fieldType.cast(value):value});
+ {#if[Object]?checkCast(handle, value):value});
}
#if[CAS]
@ForceInline
static boolean compareAndSet(FieldStaticReadWrite handle, $type$ expected, $type$ value) {
return UNSAFE.compareAndSet$Type$(handle.base,
handle.fieldOffset,
{#if[Object]?handle.fieldType.cast(expected):expected},
- {#if[Object]?handle.fieldType.cast(value):value});
+ {#if[Object]?checkCast(handle, value):value});
}
@ForceInline
static $type$ compareAndExchange(FieldStaticReadWrite handle, $type$ expected, $type$ value) {
return UNSAFE.compareAndExchange$Type$(handle.base,
handle.fieldOffset,
{#if[Object]?handle.fieldType.cast(expected):expected},
- {#if[Object]?handle.fieldType.cast(value):value});
+ {#if[Object]?checkCast(handle, value):value});
}
@ForceInline
static $type$ compareAndExchangeAcquire(FieldStaticReadWrite handle, $type$ expected, $type$ value) {
return UNSAFE.compareAndExchange$Type$Acquire(handle.base,
handle.fieldOffset,
{#if[Object]?handle.fieldType.cast(expected):expected},
- {#if[Object]?handle.fieldType.cast(value):value});
+ {#if[Object]?checkCast(handle, value):value});
}
@ForceInline
static $type$ compareAndExchangeRelease(FieldStaticReadWrite handle, $type$ expected, $type$ value) {
return UNSAFE.compareAndExchange$Type$Release(handle.base,
handle.fieldOffset,
{#if[Object]?handle.fieldType.cast(expected):expected},
- {#if[Object]?handle.fieldType.cast(value):value});
+ {#if[Object]?checkCast(handle, value):value});
}
@ForceInline
static boolean weakCompareAndSetPlain(FieldStaticReadWrite handle, $type$ expected, $type$ value) {
return UNSAFE.weakCompareAndSet$Type$Plain(handle.base,
handle.fieldOffset,
{#if[Object]?handle.fieldType.cast(expected):expected},
- {#if[Object]?handle.fieldType.cast(value):value});
+ {#if[Object]?checkCast(handle, value):value});
}
@ForceInline
static boolean weakCompareAndSet(FieldStaticReadWrite handle, $type$ expected, $type$ value) {
return UNSAFE.weakCompareAndSet$Type$(handle.base,
handle.fieldOffset,
{#if[Object]?handle.fieldType.cast(expected):expected},
- {#if[Object]?handle.fieldType.cast(value):value});
+ {#if[Object]?checkCast(handle, value):value});
}
@ForceInline
static boolean weakCompareAndSetAcquire(FieldStaticReadWrite handle, $type$ expected, $type$ value) {
return UNSAFE.weakCompareAndSet$Type$Acquire(handle.base,
handle.fieldOffset,
{#if[Object]?handle.fieldType.cast(expected):expected},
- {#if[Object]?handle.fieldType.cast(value):value});
+ {#if[Object]?checkCast(handle, value):value});
}
@ForceInline
static boolean weakCompareAndSetRelease(FieldStaticReadWrite handle, $type$ expected, $type$ value) {
return UNSAFE.weakCompareAndSet$Type$Release(handle.base,
handle.fieldOffset,
{#if[Object]?handle.fieldType.cast(expected):expected},
- {#if[Object]?handle.fieldType.cast(value):value});
+ {#if[Object]?checkCast(handle, value):value});
}
@ForceInline
static $type$ getAndSet(FieldStaticReadWrite handle, $type$ value) {
return UNSAFE.getAndSet$Type$(handle.base,
handle.fieldOffset,
- {#if[Object]?handle.fieldType.cast(value):value});
+ {#if[Object]?checkCast(handle, value):value});
}
@ForceInline
static $type$ getAndSetAcquire(FieldStaticReadWrite handle, $type$ value) {
return UNSAFE.getAndSet$Type$Acquire(handle.base,
handle.fieldOffset,
- {#if[Object]?handle.fieldType.cast(value):value});
+ {#if[Object]?checkCast(handle, value):value});
}
@ForceInline
static $type$ getAndSetRelease(FieldStaticReadWrite handle, $type$ value) {
return UNSAFE.getAndSet$Type$Release(handle.base,
handle.fieldOffset,
- {#if[Object]?handle.fieldType.cast(value):value});
+ {#if[Object]?checkCast(handle, value):value});
}
#end[CAS]
#if[AtomicAdd]
@ForceInline
< prev index next >