< prev index next >
src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.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
*** 34,44 ****
import com.sun.tools.javac.tree.JCTree.*;
import com.sun.tools.javac.tree.JCTree.JCMemberReference.ReferenceKind;
import com.sun.tools.javac.tree.TreeMaker;
import com.sun.tools.javac.tree.TreeTranslator;
import com.sun.tools.javac.code.Attribute;
- import com.sun.tools.javac.code.Scope.WriteableScope;
import com.sun.tools.javac.code.Symbol;
import com.sun.tools.javac.code.Symbol.ClassSymbol;
import com.sun.tools.javac.code.Symbol.DynamicMethodSymbol;
import com.sun.tools.javac.code.Symbol.MethodSymbol;
import com.sun.tools.javac.code.Symbol.TypeSymbol;
--- 34,43 ----
*** 125,134 ****
--- 124,136 ----
private final boolean verboseDeduplication;
/** deduplicate lambda implementation methods */
private final boolean deduplicateLambdas;
+ /** lambda proxy is a dynamic nestmate */
+ private final boolean nestmateLambdas;
+
/** Flag for alternate metafactories indicating the lambda object is intended to be serializable */
public static final int FLAG_SERIALIZABLE = 1 << 0;
/** Flag for alternate metafactories indicating the lambda object has multiple targets */
public static final int FLAG_MARKERS = 1 << 1;
*** 166,175 ****
--- 168,178 ----
debugLinesOrVars = options.isSet(Option.G)
|| options.isSet(Option.G_CUSTOM, "lines")
|| options.isSet(Option.G_CUSTOM, "vars");
verboseDeduplication = options.isSet("debug.dumpLambdaToMethodDeduplication");
deduplicateLambdas = options.getBoolean("deduplicateLambdas", true);
+ nestmateLambdas = Target.instance(context).runtimeUseNestAccess();
}
// </editor-fold>
class DedupedLambda {
private final MethodSymbol symbol;
*** 2252,2265 ****
//code to always generate a method handle to an accessible method
return tree.ownerAccessible;
}
/**
! * The VM does not support access across nested classes (8010319).
! * Were that ever to change, this should be removed.
*/
boolean isPrivateInOtherClass() {
return (tree.sym.flags() & PRIVATE) != 0 &&
!types.isSameType(
types.erasure(tree.sym.enclClass().asType()),
types.erasure(owner.enclClass().asType()));
}
--- 2255,2271 ----
//code to always generate a method handle to an accessible method
return tree.ownerAccessible;
}
/**
! * This method should be called only when target release <= 14
! * where LambdaMetaFactory does not spin nestmate classes.
! *
! * This method should be removed when --release 14 is not supported.
*/
boolean isPrivateInOtherClass() {
+ assert !nestmateLambdas;
return (tree.sym.flags() & PRIVATE) != 0 &&
!types.isSameType(
types.erasure(tree.sym.enclClass().asType()),
types.erasure(owner.enclClass().asType()));
}
*** 2302,2312 ****
final boolean needsConversionToLambda() {
return interfaceParameterIsIntersectionOrUnionType() ||
isSuper ||
needsVarArgsConversion() ||
isArrayOp() ||
! isPrivateInOtherClass() ||
isProtectedInSuperClassOfEnclosingClassInOtherPackage() ||
!receiverAccessible() ||
(tree.getMode() == ReferenceMode.NEW &&
tree.kind != ReferenceKind.ARRAY_CTOR &&
(tree.sym.owner.isLocal() || tree.sym.owner.isInner()));
--- 2308,2318 ----
final boolean needsConversionToLambda() {
return interfaceParameterIsIntersectionOrUnionType() ||
isSuper ||
needsVarArgsConversion() ||
isArrayOp() ||
! (!nestmateLambdas && isPrivateInOtherClass()) ||
isProtectedInSuperClassOfEnclosingClassInOtherPackage() ||
!receiverAccessible() ||
(tree.getMode() == ReferenceMode.NEW &&
tree.kind != ReferenceKind.ARRAY_CTOR &&
(tree.sym.owner.isLocal() || tree.sym.owner.isInner()));
< prev index next >