< prev index next >
src/jdk.compiler/share/classes/com/sun/tools/javac/code/Symbol.java
Print this page
rev 58760 : 8238358: Implementation of JEP 371: Hidden Classes
Reviewed-by: alanb, cjplummer, coleenp, dholmes, dlong, forax, jlahoda, psandoz, plevart, vromero
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, jan.lahoda@oracle.com, amy.lu@oracle.com
*** 1229,1242 ****
}
public static class RootPackageSymbol extends PackageSymbol {
public final MissingInfoHandler missingInfoHandler;
! public RootPackageSymbol(Name name, Symbol owner, MissingInfoHandler missingInfoHandler) {
super(name, owner);
this.missingInfoHandler = missingInfoHandler;
}
}
/** A class for class symbols
--- 1229,1246 ----
}
public static class RootPackageSymbol extends PackageSymbol {
public final MissingInfoHandler missingInfoHandler;
+ public final boolean allowPrivateInvokeVirtual;
! 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,2329 ****
if (refSym.isConstructor()) {
return ClassFile.REF_newInvokeSpecial;
} else {
if (refSym.isStatic()) {
return ClassFile.REF_invokeStatic;
! } else if ((refSym.flags() & PRIVATE) != 0) {
return ClassFile.REF_invokeSpecial;
} else if (refSym.enclClass().isInterface()) {
return ClassFile.REF_invokeInterface;
} else {
return ClassFile.REF_invokeVirtual;
}
}
}
}
@Override
public int poolTag() {
return ClassFile.CONSTANT_MethodHandle;
}
--- 2313,2340 ----
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 >