< 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 >