Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
8297757: VarHandles.getStaticFieldFromBaseAndOffset should get the re…
…ceiver type from VarHandle

Reviewed-by: psandoz, alanb
  • Loading branch information
Mandy Chung committed Jan 20, 2023
1 parent e803855 commit facd415
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 33 deletions.
40 changes: 19 additions & 21 deletions src/java.base/share/classes/java/lang/invoke/VarHandles.java
Expand Up @@ -118,48 +118,48 @@ else if (type == double.class) {
long foffset = MethodHandleNatives.staticFieldOffset(f);
if (!type.isPrimitive()) {
return maybeAdapt(f.isFinal() && !isWriteAllowedOnFinalFields
? new VarHandleReferences.FieldStaticReadOnly(base, foffset, type)
: new VarHandleReferences.FieldStaticReadWrite(base, foffset, type));
? new VarHandleReferences.FieldStaticReadOnly(refc, base, foffset, type)
: new VarHandleReferences.FieldStaticReadWrite(refc, base, foffset, type));
}
else if (type == boolean.class) {
return maybeAdapt(f.isFinal() && !isWriteAllowedOnFinalFields
? new VarHandleBooleans.FieldStaticReadOnly(base, foffset)
: new VarHandleBooleans.FieldStaticReadWrite(base, foffset));
? new VarHandleBooleans.FieldStaticReadOnly(refc, base, foffset)
: new VarHandleBooleans.FieldStaticReadWrite(refc, base, foffset));
}
else if (type == byte.class) {
return maybeAdapt(f.isFinal() && !isWriteAllowedOnFinalFields
? new VarHandleBytes.FieldStaticReadOnly(base, foffset)
: new VarHandleBytes.FieldStaticReadWrite(base, foffset));
? new VarHandleBytes.FieldStaticReadOnly(refc, base, foffset)
: new VarHandleBytes.FieldStaticReadWrite(refc, base, foffset));
}
else if (type == short.class) {
return maybeAdapt(f.isFinal() && !isWriteAllowedOnFinalFields
? new VarHandleShorts.FieldStaticReadOnly(base, foffset)
: new VarHandleShorts.FieldStaticReadWrite(base, foffset));
? new VarHandleShorts.FieldStaticReadOnly(refc, base, foffset)
: new VarHandleShorts.FieldStaticReadWrite(refc, base, foffset));
}
else if (type == char.class) {
return maybeAdapt(f.isFinal() && !isWriteAllowedOnFinalFields
? new VarHandleChars.FieldStaticReadOnly(base, foffset)
: new VarHandleChars.FieldStaticReadWrite(base, foffset));
? new VarHandleChars.FieldStaticReadOnly(refc, base, foffset)
: new VarHandleChars.FieldStaticReadWrite(refc, base, foffset));
}
else if (type == int.class) {
return maybeAdapt(f.isFinal() && !isWriteAllowedOnFinalFields
? new VarHandleInts.FieldStaticReadOnly(base, foffset)
: new VarHandleInts.FieldStaticReadWrite(base, foffset));
? new VarHandleInts.FieldStaticReadOnly(refc, base, foffset)
: new VarHandleInts.FieldStaticReadWrite(refc, base, foffset));
}
else if (type == long.class) {
return maybeAdapt(f.isFinal() && !isWriteAllowedOnFinalFields
? new VarHandleLongs.FieldStaticReadOnly(base, foffset)
: new VarHandleLongs.FieldStaticReadWrite(base, foffset));
? new VarHandleLongs.FieldStaticReadOnly(refc, base, foffset)
: new VarHandleLongs.FieldStaticReadWrite(refc, base, foffset));
}
else if (type == float.class) {
return maybeAdapt(f.isFinal() && !isWriteAllowedOnFinalFields
? new VarHandleFloats.FieldStaticReadOnly(base, foffset)
: new VarHandleFloats.FieldStaticReadWrite(base, foffset));
? new VarHandleFloats.FieldStaticReadOnly(refc, base, foffset)
: new VarHandleFloats.FieldStaticReadWrite(refc, base, foffset));
}
else if (type == double.class) {
return maybeAdapt(f.isFinal() && !isWriteAllowedOnFinalFields
? new VarHandleDoubles.FieldStaticReadOnly(base, foffset)
: new VarHandleDoubles.FieldStaticReadWrite(base, foffset));
? new VarHandleDoubles.FieldStaticReadOnly(refc, base, foffset)
: new VarHandleDoubles.FieldStaticReadWrite(refc, base, foffset));
}
else {
throw new UnsupportedOperationException();
Expand All @@ -183,11 +183,9 @@ static Field getFieldFromReceiverAndOffset(Class<?> receiverType,
}

// Required by instance static field handles
static Field getStaticFieldFromBaseAndOffset(Object base,
static Field getStaticFieldFromBaseAndOffset(Class<?> receiverType,
long offset,
Class<?> fieldType) {
// @@@ This is a little fragile assuming the base is the class
Class<?> receiverType = (Class<?>) base;
for (Field f : receiverType.getDeclaredFields()) {
if (!Modifier.isStatic(f.getModifiers())) continue;

Expand Down
Expand Up @@ -382,19 +382,21 @@ final class VarHandle$Type$s {


static sealed class FieldStaticReadOnly extends VarHandle {
final Class<?> receiverType;
final Object base;
final long fieldOffset;
#if[Object]
final Class<?> fieldType;
#end[Object]

FieldStaticReadOnly(Object base, long fieldOffset{#if[Object]?, Class<?> fieldType}) {
this(base, fieldOffset{#if[Object]?, fieldType}, FieldStaticReadOnly.FORM, false);
FieldStaticReadOnly(Class<?> receiverType, Object base, long fieldOffset{#if[Object]?, Class<?> fieldType}) {
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) {
super(form, exact);
this.receiverType = receiverType;
this.base = base;
this.fieldOffset = fieldOffset;
#if[Object]
Expand All @@ -406,14 +408,14 @@ final class VarHandle$Type$s {
public FieldStaticReadOnly withInvokeExactBehavior() {
return hasInvokeExactBehavior()
? this
: new FieldStaticReadOnly(base, fieldOffset{#if[Object]?, fieldType}, vform, true);
: new FieldStaticReadOnly(receiverType, base, fieldOffset{#if[Object]?, fieldType}, vform, true);
}

@Override
public FieldStaticReadOnly withInvokeBehavior() {
return !hasInvokeExactBehavior()
? this
: new FieldStaticReadOnly(base, fieldOffset{#if[Object]?, fieldType}, vform, false);
: new FieldStaticReadOnly(receiverType, base, fieldOffset{#if[Object]?, fieldType}, vform, false);
}

@Override
Expand All @@ -424,7 +426,7 @@ final class VarHandle$Type$s {

// Reflect on this VarHandle to extract the field name
var staticField = VarHandles.getStaticFieldFromBaseAndOffset(
base, fieldOffset, {#if[Object]?fieldType:$type$.class});
receiverType, fieldOffset, {#if[Object]?fieldType:$type$.class});
var receiverTypeRef = staticField.getDeclaringClass().describeConstable();
if (!receiverTypeRef.isPresent())
return Optional.empty();
Expand Down Expand Up @@ -469,27 +471,27 @@ final class VarHandle$Type$s {

static final class FieldStaticReadWrite extends FieldStaticReadOnly {

FieldStaticReadWrite(Object base, long fieldOffset{#if[Object]?, Class<?> fieldType}) {
this(base, fieldOffset{#if[Object]?, fieldType}, false);
FieldStaticReadWrite(Class<?> receiverType, Object base, long fieldOffset{#if[Object]?, Class<?> fieldType}) {
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) {
super(base, fieldOffset{#if[Object]?, fieldType}, FieldStaticReadWrite.FORM, exact);
super(receiverType, base, fieldOffset{#if[Object]?, fieldType}, FieldStaticReadWrite.FORM, exact);
}

@Override
public FieldStaticReadWrite withInvokeExactBehavior() {
return hasInvokeExactBehavior()
? this
: new FieldStaticReadWrite(base, fieldOffset{#if[Object]?, fieldType}, true);
: new FieldStaticReadWrite(receiverType, base, fieldOffset{#if[Object]?, fieldType}, true);
}

@Override
public FieldStaticReadWrite withInvokeBehavior() {
return !hasInvokeExactBehavior()
? this
: new FieldStaticReadWrite(base, fieldOffset{#if[Object]?, fieldType}, false);
: new FieldStaticReadWrite(receiverType, base, fieldOffset{#if[Object]?, fieldType}, false);
}

@ForceInline
Expand Down

1 comment on commit facd415

@openjdk-notifier
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.