This commit is contained in:
Jesper Wilhelmsson 2018-04-06 19:16:33 +02:00
commit 9bfdee7c5a
451 changed files with 11174 additions and 5810 deletions

View file

@ -1047,7 +1047,8 @@ import static java.lang.invoke.MethodHandleStatics.newInternalError;
* If lookup fails or access is not permitted, null is returned.
* Otherwise a fresh copy of the given member is returned, with modifier bits filled in.
*/
private MemberName resolve(byte refKind, MemberName ref, Class<?> lookupClass) {
private MemberName resolve(byte refKind, MemberName ref, Class<?> lookupClass,
boolean speculativeResolve) {
MemberName m = ref.clone(); // JVM will side-effect the ref
assert(refKind == m.getReferenceKind());
try {
@ -1066,7 +1067,10 @@ import static java.lang.invoke.MethodHandleStatics.newInternalError;
//
// REFC view on PTYPES doesn't matter, since it is used only as a starting point for resolution and doesn't
// participate in method selection.
m = MethodHandleNatives.resolve(m, lookupClass);
m = MethodHandleNatives.resolve(m, lookupClass, speculativeResolve);
if (m == null && speculativeResolve) {
return null;
}
m.checkForTypeAlias(m.getDeclaringClass());
m.resolution = null;
} catch (ClassNotFoundException | LinkageError ex) {
@ -1091,7 +1095,7 @@ import static java.lang.invoke.MethodHandleStatics.newInternalError;
MemberName resolveOrFail(byte refKind, MemberName m, Class<?> lookupClass,
Class<NoSuchMemberException> nsmClass)
throws IllegalAccessException, NoSuchMemberException {
MemberName result = resolve(refKind, m, lookupClass);
MemberName result = resolve(refKind, m, lookupClass, false);
if (result.isResolved())
return result;
ReflectiveOperationException ex = result.makeAccessException();
@ -1106,8 +1110,8 @@ import static java.lang.invoke.MethodHandleStatics.newInternalError;
*/
public
MemberName resolveOrNull(byte refKind, MemberName m, Class<?> lookupClass) {
MemberName result = resolve(refKind, m, lookupClass);
if (result.isResolved())
MemberName result = resolve(refKind, m, lookupClass, true);
if (result != null && result.isResolved())
return result;
return null;
}

View file

@ -49,7 +49,8 @@ class MethodHandleNatives {
static native void init(MemberName self, Object ref);
static native void expand(MemberName self);
static native MemberName resolve(MemberName self, Class<?> caller) throws LinkageError, ClassNotFoundException;
static native MemberName resolve(MemberName self, Class<?> caller,
boolean speculativeResolve) throws LinkageError, ClassNotFoundException;
static native int getMembers(Class<?> defc, String matchName, String matchSig,
int matchFlags, Class<?> caller, int skip, MemberName[] results);