mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-27 14:54:52 +02:00
8297757: VarHandles.getStaticFieldFromBaseAndOffset should get the receiver type from VarHandle
Reviewed-by: psandoz, alanb
This commit is contained in:
parent
e803855708
commit
facd41511b
2 changed files with 33 additions and 33 deletions
|
@ -118,48 +118,48 @@ final class VarHandles {
|
||||||
long foffset = MethodHandleNatives.staticFieldOffset(f);
|
long foffset = MethodHandleNatives.staticFieldOffset(f);
|
||||||
if (!type.isPrimitive()) {
|
if (!type.isPrimitive()) {
|
||||||
return maybeAdapt(f.isFinal() && !isWriteAllowedOnFinalFields
|
return maybeAdapt(f.isFinal() && !isWriteAllowedOnFinalFields
|
||||||
? new VarHandleReferences.FieldStaticReadOnly(base, foffset, type)
|
? new VarHandleReferences.FieldStaticReadOnly(refc, base, foffset, type)
|
||||||
: new VarHandleReferences.FieldStaticReadWrite(base, foffset, type));
|
: new VarHandleReferences.FieldStaticReadWrite(refc, base, foffset, type));
|
||||||
}
|
}
|
||||||
else if (type == boolean.class) {
|
else if (type == boolean.class) {
|
||||||
return maybeAdapt(f.isFinal() && !isWriteAllowedOnFinalFields
|
return maybeAdapt(f.isFinal() && !isWriteAllowedOnFinalFields
|
||||||
? new VarHandleBooleans.FieldStaticReadOnly(base, foffset)
|
? new VarHandleBooleans.FieldStaticReadOnly(refc, base, foffset)
|
||||||
: new VarHandleBooleans.FieldStaticReadWrite(base, foffset));
|
: new VarHandleBooleans.FieldStaticReadWrite(refc, base, foffset));
|
||||||
}
|
}
|
||||||
else if (type == byte.class) {
|
else if (type == byte.class) {
|
||||||
return maybeAdapt(f.isFinal() && !isWriteAllowedOnFinalFields
|
return maybeAdapt(f.isFinal() && !isWriteAllowedOnFinalFields
|
||||||
? new VarHandleBytes.FieldStaticReadOnly(base, foffset)
|
? new VarHandleBytes.FieldStaticReadOnly(refc, base, foffset)
|
||||||
: new VarHandleBytes.FieldStaticReadWrite(base, foffset));
|
: new VarHandleBytes.FieldStaticReadWrite(refc, base, foffset));
|
||||||
}
|
}
|
||||||
else if (type == short.class) {
|
else if (type == short.class) {
|
||||||
return maybeAdapt(f.isFinal() && !isWriteAllowedOnFinalFields
|
return maybeAdapt(f.isFinal() && !isWriteAllowedOnFinalFields
|
||||||
? new VarHandleShorts.FieldStaticReadOnly(base, foffset)
|
? new VarHandleShorts.FieldStaticReadOnly(refc, base, foffset)
|
||||||
: new VarHandleShorts.FieldStaticReadWrite(base, foffset));
|
: new VarHandleShorts.FieldStaticReadWrite(refc, base, foffset));
|
||||||
}
|
}
|
||||||
else if (type == char.class) {
|
else if (type == char.class) {
|
||||||
return maybeAdapt(f.isFinal() && !isWriteAllowedOnFinalFields
|
return maybeAdapt(f.isFinal() && !isWriteAllowedOnFinalFields
|
||||||
? new VarHandleChars.FieldStaticReadOnly(base, foffset)
|
? new VarHandleChars.FieldStaticReadOnly(refc, base, foffset)
|
||||||
: new VarHandleChars.FieldStaticReadWrite(base, foffset));
|
: new VarHandleChars.FieldStaticReadWrite(refc, base, foffset));
|
||||||
}
|
}
|
||||||
else if (type == int.class) {
|
else if (type == int.class) {
|
||||||
return maybeAdapt(f.isFinal() && !isWriteAllowedOnFinalFields
|
return maybeAdapt(f.isFinal() && !isWriteAllowedOnFinalFields
|
||||||
? new VarHandleInts.FieldStaticReadOnly(base, foffset)
|
? new VarHandleInts.FieldStaticReadOnly(refc, base, foffset)
|
||||||
: new VarHandleInts.FieldStaticReadWrite(base, foffset));
|
: new VarHandleInts.FieldStaticReadWrite(refc, base, foffset));
|
||||||
}
|
}
|
||||||
else if (type == long.class) {
|
else if (type == long.class) {
|
||||||
return maybeAdapt(f.isFinal() && !isWriteAllowedOnFinalFields
|
return maybeAdapt(f.isFinal() && !isWriteAllowedOnFinalFields
|
||||||
? new VarHandleLongs.FieldStaticReadOnly(base, foffset)
|
? new VarHandleLongs.FieldStaticReadOnly(refc, base, foffset)
|
||||||
: new VarHandleLongs.FieldStaticReadWrite(base, foffset));
|
: new VarHandleLongs.FieldStaticReadWrite(refc, base, foffset));
|
||||||
}
|
}
|
||||||
else if (type == float.class) {
|
else if (type == float.class) {
|
||||||
return maybeAdapt(f.isFinal() && !isWriteAllowedOnFinalFields
|
return maybeAdapt(f.isFinal() && !isWriteAllowedOnFinalFields
|
||||||
? new VarHandleFloats.FieldStaticReadOnly(base, foffset)
|
? new VarHandleFloats.FieldStaticReadOnly(refc, base, foffset)
|
||||||
: new VarHandleFloats.FieldStaticReadWrite(base, foffset));
|
: new VarHandleFloats.FieldStaticReadWrite(refc, base, foffset));
|
||||||
}
|
}
|
||||||
else if (type == double.class) {
|
else if (type == double.class) {
|
||||||
return maybeAdapt(f.isFinal() && !isWriteAllowedOnFinalFields
|
return maybeAdapt(f.isFinal() && !isWriteAllowedOnFinalFields
|
||||||
? new VarHandleDoubles.FieldStaticReadOnly(base, foffset)
|
? new VarHandleDoubles.FieldStaticReadOnly(refc, base, foffset)
|
||||||
: new VarHandleDoubles.FieldStaticReadWrite(base, foffset));
|
: new VarHandleDoubles.FieldStaticReadWrite(refc, base, foffset));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
throw new UnsupportedOperationException();
|
throw new UnsupportedOperationException();
|
||||||
|
@ -183,11 +183,9 @@ final class VarHandles {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Required by instance static field handles
|
// Required by instance static field handles
|
||||||
static Field getStaticFieldFromBaseAndOffset(Object base,
|
static Field getStaticFieldFromBaseAndOffset(Class<?> receiverType,
|
||||||
long offset,
|
long offset,
|
||||||
Class<?> fieldType) {
|
Class<?> fieldType) {
|
||||||
// @@@ This is a little fragile assuming the base is the class
|
|
||||||
Class<?> receiverType = (Class<?>) base;
|
|
||||||
for (Field f : receiverType.getDeclaredFields()) {
|
for (Field f : receiverType.getDeclaredFields()) {
|
||||||
if (!Modifier.isStatic(f.getModifiers())) continue;
|
if (!Modifier.isStatic(f.getModifiers())) continue;
|
||||||
|
|
||||||
|
|
|
@ -382,19 +382,21 @@ final class VarHandle$Type$s {
|
||||||
|
|
||||||
|
|
||||||
static sealed class FieldStaticReadOnly extends VarHandle {
|
static sealed class FieldStaticReadOnly extends VarHandle {
|
||||||
|
final Class<?> receiverType;
|
||||||
final Object base;
|
final Object base;
|
||||||
final long fieldOffset;
|
final long fieldOffset;
|
||||||
#if[Object]
|
#if[Object]
|
||||||
final Class<?> fieldType;
|
final Class<?> fieldType;
|
||||||
#end[Object]
|
#end[Object]
|
||||||
|
|
||||||
FieldStaticReadOnly(Object base, long fieldOffset{#if[Object]?, Class<?> fieldType}) {
|
FieldStaticReadOnly(Class<?> receiverType, Object base, long fieldOffset{#if[Object]?, Class<?> fieldType}) {
|
||||||
this(base, fieldOffset{#if[Object]?, fieldType}, FieldStaticReadOnly.FORM, false);
|
this(receiverType, base, fieldOffset{#if[Object]?, fieldType}, FieldStaticReadOnly.FORM, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected FieldStaticReadOnly(Object base, long fieldOffset{#if[Object]?, Class<?> fieldType},
|
protected FieldStaticReadOnly(Class<?> receiverType, Object base, long fieldOffset{#if[Object]?, Class<?> fieldType},
|
||||||
VarForm form, boolean exact) {
|
VarForm form, boolean exact) {
|
||||||
super(form, exact);
|
super(form, exact);
|
||||||
|
this.receiverType = receiverType;
|
||||||
this.base = base;
|
this.base = base;
|
||||||
this.fieldOffset = fieldOffset;
|
this.fieldOffset = fieldOffset;
|
||||||
#if[Object]
|
#if[Object]
|
||||||
|
@ -406,14 +408,14 @@ final class VarHandle$Type$s {
|
||||||
public FieldStaticReadOnly withInvokeExactBehavior() {
|
public FieldStaticReadOnly withInvokeExactBehavior() {
|
||||||
return hasInvokeExactBehavior()
|
return hasInvokeExactBehavior()
|
||||||
? this
|
? this
|
||||||
: new FieldStaticReadOnly(base, fieldOffset{#if[Object]?, fieldType}, vform, true);
|
: new FieldStaticReadOnly(receiverType, base, fieldOffset{#if[Object]?, fieldType}, vform, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public FieldStaticReadOnly withInvokeBehavior() {
|
public FieldStaticReadOnly withInvokeBehavior() {
|
||||||
return !hasInvokeExactBehavior()
|
return !hasInvokeExactBehavior()
|
||||||
? this
|
? this
|
||||||
: new FieldStaticReadOnly(base, fieldOffset{#if[Object]?, fieldType}, vform, false);
|
: new FieldStaticReadOnly(receiverType, base, fieldOffset{#if[Object]?, fieldType}, vform, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -424,7 +426,7 @@ final class VarHandle$Type$s {
|
||||||
|
|
||||||
// Reflect on this VarHandle to extract the field name
|
// Reflect on this VarHandle to extract the field name
|
||||||
var staticField = VarHandles.getStaticFieldFromBaseAndOffset(
|
var staticField = VarHandles.getStaticFieldFromBaseAndOffset(
|
||||||
base, fieldOffset, {#if[Object]?fieldType:$type$.class});
|
receiverType, fieldOffset, {#if[Object]?fieldType:$type$.class});
|
||||||
var receiverTypeRef = staticField.getDeclaringClass().describeConstable();
|
var receiverTypeRef = staticField.getDeclaringClass().describeConstable();
|
||||||
if (!receiverTypeRef.isPresent())
|
if (!receiverTypeRef.isPresent())
|
||||||
return Optional.empty();
|
return Optional.empty();
|
||||||
|
@ -469,27 +471,27 @@ final class VarHandle$Type$s {
|
||||||
|
|
||||||
static final class FieldStaticReadWrite extends FieldStaticReadOnly {
|
static final class FieldStaticReadWrite extends FieldStaticReadOnly {
|
||||||
|
|
||||||
FieldStaticReadWrite(Object base, long fieldOffset{#if[Object]?, Class<?> fieldType}) {
|
FieldStaticReadWrite(Class<?> receiverType, Object base, long fieldOffset{#if[Object]?, Class<?> fieldType}) {
|
||||||
this(base, fieldOffset{#if[Object]?, fieldType}, false);
|
this(receiverType, base, fieldOffset{#if[Object]?, fieldType}, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private FieldStaticReadWrite(Object base, long fieldOffset{#if[Object]?, Class<?> fieldType},
|
private FieldStaticReadWrite(Class<?> receiverType, Object base, long fieldOffset{#if[Object]?, Class<?> fieldType},
|
||||||
boolean exact) {
|
boolean exact) {
|
||||||
super(base, fieldOffset{#if[Object]?, fieldType}, FieldStaticReadWrite.FORM, exact);
|
super(receiverType, base, fieldOffset{#if[Object]?, fieldType}, FieldStaticReadWrite.FORM, exact);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public FieldStaticReadWrite withInvokeExactBehavior() {
|
public FieldStaticReadWrite withInvokeExactBehavior() {
|
||||||
return hasInvokeExactBehavior()
|
return hasInvokeExactBehavior()
|
||||||
? this
|
? this
|
||||||
: new FieldStaticReadWrite(base, fieldOffset{#if[Object]?, fieldType}, true);
|
: new FieldStaticReadWrite(receiverType, base, fieldOffset{#if[Object]?, fieldType}, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public FieldStaticReadWrite withInvokeBehavior() {
|
public FieldStaticReadWrite withInvokeBehavior() {
|
||||||
return !hasInvokeExactBehavior()
|
return !hasInvokeExactBehavior()
|
||||||
? this
|
? this
|
||||||
: new FieldStaticReadWrite(base, fieldOffset{#if[Object]?, fieldType}, false);
|
: new FieldStaticReadWrite(receiverType, base, fieldOffset{#if[Object]?, fieldType}, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ForceInline
|
@ForceInline
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue