< prev index next >
src/jdk.compiler/share/classes/com/sun/tools/javac/code/Symbol.java
Print this page
@@ -1229,14 +1229,18 @@
}
public static class RootPackageSymbol extends PackageSymbol {
public final MissingInfoHandler missingInfoHandler;
+ public final boolean allowPrivateInvokeVirtual;
- public RootPackageSymbol(Name name, Symbol owner, MissingInfoHandler missingInfoHandler) {
+ public RootPackageSymbol(Name name, Symbol owner,
+ MissingInfoHandler missingInfoHandler,
+ boolean allowPrivateInvokeVirtual) {
super(name, owner);
this.missingInfoHandler = missingInfoHandler;
+ this.allowPrivateInvokeVirtual = allowPrivateInvokeVirtual;
}
}
/** A class for class symbols
@@ -2309,19 +2313,28 @@
if (refSym.isConstructor()) {
return ClassFile.REF_newInvokeSpecial;
} else {
if (refSym.isStatic()) {
return ClassFile.REF_invokeStatic;
+ } else if ((refSym.flags() & PRIVATE) != 0 && !allowPrivateInvokeVirtual()) {
+ return ClassFile.REF_invokeSpecial;
} else if (refSym.enclClass().isInterface()) {
return ClassFile.REF_invokeInterface;
} else {
return ClassFile.REF_invokeVirtual;
}
}
}
}
+ private boolean allowPrivateInvokeVirtual() {
+ Symbol rootPack = this;
+ while (rootPack != null && !(rootPack instanceof RootPackageSymbol)) {
+ rootPack = rootPack.owner;
+ }
+ return rootPack != null && ((RootPackageSymbol) rootPack).allowPrivateInvokeVirtual;
+ }
@Override
public int poolTag() {
return ClassFile.CONSTANT_MethodHandle;
}
< prev index next >