< prev index next >
src/jdk.compiler/share/classes/com/sun/tools/javac/code/Symbol.java
Print this page
rev 58565 : 8238358: Implementation of JEP 371: Hidden Classes
Reviewed-by: duke
Contributed-by: mandy.chung@oracle.com, lois.foltan@oracle.com, david.holmes@oracle.com, harold.seigel@oracle.com, serguei.spitsyn@oracle.com, alex.buckley@oracle.com, jamsheed.c.m@oracle.com
rev 58568 : [mq]: hidden-class-4
@@ -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 >