Skip to content

Commit

Permalink
Get rid of MHInvoker & VHInvoker and make chain of references from Me…
Browse files Browse the repository at this point in the history
…thod/Constructor/Field -> XxxAccessor -> XxxHandle @Static
  • Loading branch information
plevart committed Sep 14, 2021
1 parent a2e4a1f commit 1a31508
Show file tree
Hide file tree
Showing 27 changed files with 431 additions and 1,308 deletions.
11 changes: 7 additions & 4 deletions src/java.base/share/classes/java/lang/reflect/Constructor.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
import jdk.internal.reflect.ConstructorAccessor;
import jdk.internal.reflect.Reflection;
import jdk.internal.vm.annotation.ForceInline;
import jdk.internal.vm.annotation.Stable;
import sun.reflect.annotation.TypeAnnotation;
import sun.reflect.annotation.TypeAnnotationParser;
import sun.reflect.generics.repository.ConstructorRepository;
Expand Down Expand Up @@ -95,7 +96,8 @@ ConstructorRepository getGenericInfo() {
return genericInfo; //return cached repository
}

private volatile ConstructorAccessor constructorAccessor;
@Stable
private ConstructorAccessor constructorAccessor;
// For sharing of ConstructorAccessors. This branching structure
// is currently only two levels deep (i.e., one root Constructor
// and potentially many Constructor objects pointing to it.)
Expand Down Expand Up @@ -489,7 +491,7 @@ T newInstanceWithCaller(Object[] args, boolean checkAccess, Class<?> caller)
if (checkAccess)
checkAccess(caller, clazz, clazz, modifiers);

ConstructorAccessor ca = constructorAccessor; // read volatile
ConstructorAccessor ca = constructorAccessor; // read @Stable
if (ca == null) {
ca = acquireConstructorAccessor();
}
Expand Down Expand Up @@ -531,8 +533,8 @@ private ConstructorAccessor acquireConstructorAccessor() {

// First check to see if one has been created yet, and take it
// if so.
ConstructorAccessor tmp = null;
if (root != null) tmp = root.getConstructorAccessor();
Constructor<?> root = this.root;
ConstructorAccessor tmp = root == null ? null : root.getConstructorAccessor();
if (tmp != null) {
constructorAccessor = tmp;
} else {
Expand Down Expand Up @@ -561,6 +563,7 @@ ConstructorAccessor getConstructorAccessor() {
void setConstructorAccessor(ConstructorAccessor accessor) {
constructorAccessor = accessor;
// Propagate up
Constructor<?> root = this.root;
if (root != null) {
root.setConstructorAccessor(accessor);
}
Expand Down
144 changes: 100 additions & 44 deletions src/java.base/share/classes/java/lang/reflect/Field.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import jdk.internal.reflect.FieldAccessor;
import jdk.internal.reflect.Reflection;
import jdk.internal.vm.annotation.ForceInline;
import jdk.internal.vm.annotation.Stable;
import sun.reflect.generics.repository.FieldRepository;
import sun.reflect.generics.factory.CoreReflectionFactory;
import sun.reflect.generics.factory.GenericsFactory;
Expand Down Expand Up @@ -65,6 +66,7 @@
public final
class Field extends AccessibleObject implements Member {

@Stable
private Class<?> clazz;
private int slot;
// This is guaranteed to be interned by the VM in the 1.4
Expand All @@ -79,8 +81,10 @@ class Field extends AccessibleObject implements Member {
private transient FieldRepository genericInfo;
private byte[] annotations;
// Cached field accessor created without override
@Stable
private FieldAccessor fieldAccessor;
// Cached field accessor created with override
@Stable
private FieldAccessor overrideFieldAccessor;
// For sharing of FieldAccessors. This branching structure is
// currently only two levels deep (i.e., one root Field and
Expand Down Expand Up @@ -421,8 +425,10 @@ public Object get(Object obj)
if (!override) {
Class<?> caller = Reflection.getCallerClass();
checkAccess(caller, obj);
return getFieldAccessor().get(obj);
} else {
return getOverrideFieldAccessor().get(obj);
}
return getFieldAccessor(obj).get(obj);
}

/**
Expand Down Expand Up @@ -455,8 +461,10 @@ public boolean getBoolean(Object obj)
if (!override) {
Class<?> caller = Reflection.getCallerClass();
checkAccess(caller, obj);
return getFieldAccessor().getBoolean(obj);
} else {
return getOverrideFieldAccessor().getBoolean(obj);
}
return getFieldAccessor(obj).getBoolean(obj);
}

/**
Expand Down Expand Up @@ -489,8 +497,10 @@ public byte getByte(Object obj)
if (!override) {
Class<?> caller = Reflection.getCallerClass();
checkAccess(caller, obj);
return getFieldAccessor().getByte(obj);
} else {
return getOverrideFieldAccessor().getByte(obj);
}
return getFieldAccessor(obj).getByte(obj);
}

/**
Expand Down Expand Up @@ -525,8 +535,10 @@ public char getChar(Object obj)
if (!override) {
Class<?> caller = Reflection.getCallerClass();
checkAccess(caller, obj);
return getFieldAccessor().getChar(obj);
} else {
return getOverrideFieldAccessor().getChar(obj);
}
return getFieldAccessor(obj).getChar(obj);
}

/**
Expand Down Expand Up @@ -561,8 +573,10 @@ public short getShort(Object obj)
if (!override) {
Class<?> caller = Reflection.getCallerClass();
checkAccess(caller, obj);
return getFieldAccessor().getShort(obj);
} else {
return getOverrideFieldAccessor().getShort(obj);
}
return getFieldAccessor(obj).getShort(obj);
}

/**
Expand Down Expand Up @@ -597,8 +611,10 @@ public int getInt(Object obj)
if (!override) {
Class<?> caller = Reflection.getCallerClass();
checkAccess(caller, obj);
return getFieldAccessor().getInt(obj);
} else {
return getOverrideFieldAccessor().getInt(obj);
}
return getFieldAccessor(obj).getInt(obj);
}

/**
Expand Down Expand Up @@ -633,8 +649,10 @@ public long getLong(Object obj)
if (!override) {
Class<?> caller = Reflection.getCallerClass();
checkAccess(caller, obj);
return getFieldAccessor().getLong(obj);
} else {
return getOverrideFieldAccessor().getLong(obj);
}
return getFieldAccessor(obj).getLong(obj);
}

/**
Expand Down Expand Up @@ -669,8 +687,10 @@ public float getFloat(Object obj)
if (!override) {
Class<?> caller = Reflection.getCallerClass();
checkAccess(caller, obj);
return getFieldAccessor().getFloat(obj);
} else {
return getOverrideFieldAccessor().getFloat(obj);
}
return getFieldAccessor(obj).getFloat(obj);
}

/**
Expand Down Expand Up @@ -705,8 +725,10 @@ public double getDouble(Object obj)
if (!override) {
Class<?> caller = Reflection.getCallerClass();
checkAccess(caller, obj);
return getFieldAccessor().getDouble(obj);
} else {
return getOverrideFieldAccessor().getDouble(obj);
}
return getFieldAccessor(obj).getDouble(obj);
}

/**
Expand Down Expand Up @@ -795,8 +817,10 @@ public void set(Object obj, Object value)
if (!override) {
Class<?> caller = Reflection.getCallerClass();
checkAccess(caller, obj);
getFieldAccessor().set(obj, value);
} else {
getOverrideFieldAccessor().set(obj, value);
}
getFieldAccessor(obj).set(obj, value);
}

/**
Expand Down Expand Up @@ -832,8 +856,10 @@ public void setBoolean(Object obj, boolean z)
if (!override) {
Class<?> caller = Reflection.getCallerClass();
checkAccess(caller, obj);
getFieldAccessor().setBoolean(obj, z);
} else {
getOverrideFieldAccessor().setBoolean(obj, z);
}
getFieldAccessor(obj).setBoolean(obj, z);
}

/**
Expand Down Expand Up @@ -869,8 +895,10 @@ public void setByte(Object obj, byte b)
if (!override) {
Class<?> caller = Reflection.getCallerClass();
checkAccess(caller, obj);
getFieldAccessor().setByte(obj, b);
} else {
getOverrideFieldAccessor().setByte(obj, b);
}
getFieldAccessor(obj).setByte(obj, b);
}

/**
Expand Down Expand Up @@ -906,8 +934,10 @@ public void setChar(Object obj, char c)
if (!override) {
Class<?> caller = Reflection.getCallerClass();
checkAccess(caller, obj);
getFieldAccessor().setChar(obj, c);
} else {
getOverrideFieldAccessor().setChar(obj, c);
}
getFieldAccessor(obj).setChar(obj, c);
}

/**
Expand Down Expand Up @@ -943,8 +973,10 @@ public void setShort(Object obj, short s)
if (!override) {
Class<?> caller = Reflection.getCallerClass();
checkAccess(caller, obj);
getFieldAccessor().setShort(obj, s);
} else {
getOverrideFieldAccessor().setShort(obj, s);
}
getFieldAccessor(obj).setShort(obj, s);
}

/**
Expand Down Expand Up @@ -980,8 +1012,10 @@ public void setInt(Object obj, int i)
if (!override) {
Class<?> caller = Reflection.getCallerClass();
checkAccess(caller, obj);
getFieldAccessor().setInt(obj, i);
} else {
getOverrideFieldAccessor().setInt(obj, i);
}
getFieldAccessor(obj).setInt(obj, i);
}

/**
Expand Down Expand Up @@ -1017,8 +1051,10 @@ public void setLong(Object obj, long l)
if (!override) {
Class<?> caller = Reflection.getCallerClass();
checkAccess(caller, obj);
getFieldAccessor().setLong(obj, l);
} else {
getOverrideFieldAccessor().setLong(obj, l);
}
getFieldAccessor(obj).setLong(obj, l);
}

/**
Expand Down Expand Up @@ -1054,8 +1090,10 @@ public void setFloat(Object obj, float f)
if (!override) {
Class<?> caller = Reflection.getCallerClass();
checkAccess(caller, obj);
getFieldAccessor().setFloat(obj, f);
} else {
getOverrideFieldAccessor().setFloat(obj, f);
}
getFieldAccessor(obj).setFloat(obj, f);
}

/**
Expand Down Expand Up @@ -1091,8 +1129,10 @@ public void setDouble(Object obj, double d)
if (!override) {
Class<?> caller = Reflection.getCallerClass();
checkAccess(caller, obj);
getFieldAccessor().setDouble(obj, d);
} else {
getOverrideFieldAccessor().setDouble(obj, d);
}
getFieldAccessor(obj).setDouble(obj, d);
}

// check access to field
Expand All @@ -1105,53 +1145,69 @@ private void checkAccess(Class<?> caller, Object obj)
}

// security check is done before calling this method
private FieldAccessor getFieldAccessor(Object obj)
throws IllegalAccessException
{
boolean ov = override;
FieldAccessor a = (ov) ? overrideFieldAccessor : fieldAccessor;
return (a != null) ? a : acquireFieldAccessor(ov);
private FieldAccessor getFieldAccessor() {
FieldAccessor a = fieldAccessor;
return (a != null) ? a : acquireFieldAccessor();
}

private FieldAccessor getOverrideFieldAccessor() {
FieldAccessor a = overrideFieldAccessor;
return (a != null) ? a : acquireOverrideFieldAccessor();
}

// NOTE that there is no synchronization used here. It is correct
// (though not efficient) to generate more than one FieldAccessor
// for a given Field. However, avoiding synchronization will
// probably make the implementation more scalable.
private FieldAccessor acquireFieldAccessor(boolean overrideFinalCheck) {
private FieldAccessor acquireFieldAccessor() {
// First check to see if one has been created yet, and take it
// if so
FieldAccessor tmp = null;
if (root != null) tmp = root.getFieldAccessor(overrideFinalCheck);
Field root = this.root;
FieldAccessor tmp = root == null ? null : root.fieldAccessor;
if (tmp != null) {
if (overrideFinalCheck)
overrideFieldAccessor = tmp;
else
fieldAccessor = tmp;
fieldAccessor = tmp;
} else {
// Otherwise fabricate one and propagate it up to the root
tmp = reflectionFactory.newFieldAccessor(this, overrideFinalCheck);
setFieldAccessor(tmp, overrideFinalCheck);
tmp = reflectionFactory.newFieldAccessor(this, false);
setFieldAccessor(tmp);
}
return tmp;
}

private FieldAccessor acquireOverrideFieldAccessor() {
// First check to see if one has been created yet, and take it
// if so
Field root = this.root;
FieldAccessor tmp = root == null ? null : root.overrideFieldAccessor;
if (tmp != null) {
overrideFieldAccessor = tmp;
} else {
// Otherwise fabricate one and propagate it up to the root
tmp = reflectionFactory.newFieldAccessor(this, true);
setOverrideFieldAccessor(tmp);
}
return tmp;
}

// Returns FieldAccessor for this Field object, not looking up
// the chain to the root
private FieldAccessor getFieldAccessor(boolean overrideFinalCheck) {
return (overrideFinalCheck)? overrideFieldAccessor : fieldAccessor;
// Sets the fieldAccessor for this Field object and
// (recursively) its root
private void setFieldAccessor(FieldAccessor accessor) {
fieldAccessor = accessor;
// Propagate up
Field root = this.root;
if (root != null) {
root.setFieldAccessor(accessor);
}
}

// Sets the FieldAccessor for this Field object and
// Sets the overrideFieldAccessor for this Field object and
// (recursively) its root
private void setFieldAccessor(FieldAccessor accessor, boolean overrideFinalCheck) {
if (overrideFinalCheck)
overrideFieldAccessor = accessor;
else
fieldAccessor = accessor;
private void setOverrideFieldAccessor(FieldAccessor accessor) {
overrideFieldAccessor = accessor;
// Propagate up
Field root = this.root;
if (root != null) {
root.setFieldAccessor(accessor, overrideFinalCheck);
root.setOverrideFieldAccessor(accessor);
}
}

Expand Down
Loading

0 comments on commit 1a31508

Please sign in to comment.