--- old/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Symbol.java 2020-03-30 11:59:56.000000000 -0700 +++ new/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Symbol.java 2020-03-30 11:59:56.000000000 -0700 @@ -1231,10 +1231,14 @@ 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; } } @@ -2311,6 +2315,8 @@ } 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 { @@ -2320,6 +2326,13 @@ } } + 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;