langtools/src/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java
changeset 21892 8ab5aa58a900
parent 21496 2eb1bb11add1
child 22162 3b3e23e67329
equal deleted inserted replaced
21891:42435b2c96cf 21892:8ab5aa58a900
   355     public void visitReference(JCMemberReference tree) {
   355     public void visitReference(JCMemberReference tree) {
   356         ReferenceTranslationContext localContext = (ReferenceTranslationContext)context;
   356         ReferenceTranslationContext localContext = (ReferenceTranslationContext)context;
   357 
   357 
   358         //first determine the method symbol to be used to generate the sam instance
   358         //first determine the method symbol to be used to generate the sam instance
   359         //this is either the method reference symbol, or the bridged reference symbol
   359         //this is either the method reference symbol, or the bridged reference symbol
   360         Symbol refSym = localContext.needsBridge() ?
   360         Symbol refSym = localContext.needsBridge()
   361             localContext.bridgeSym :
   361                 ? localContext.bridgeSym
   362             tree.sym;
   362                 : localContext.isSignaturePolymorphic()
       
   363                 ? localContext.sigPolySym
       
   364                 : tree.sym;
   363 
   365 
   364         //build the bridge method, if needed
   366         //build the bridge method, if needed
   365         if (localContext.needsBridge()) {
   367         if (localContext.needsBridge()) {
   366             bridgeMemberReference(tree, localContext);
   368             bridgeMemberReference(tree, localContext);
   367         }
   369         }
  1993          */
  1995          */
  1994         private class ReferenceTranslationContext extends TranslationContext<JCMemberReference> {
  1996         private class ReferenceTranslationContext extends TranslationContext<JCMemberReference> {
  1995 
  1997 
  1996             final boolean isSuper;
  1998             final boolean isSuper;
  1997             final Symbol bridgeSym;
  1999             final Symbol bridgeSym;
       
  2000             final Symbol sigPolySym;
  1998 
  2001 
  1999             ReferenceTranslationContext(JCMemberReference tree) {
  2002             ReferenceTranslationContext(JCMemberReference tree) {
  2000                 super(tree);
  2003                 super(tree);
  2001                 this.isSuper = tree.hasKind(ReferenceKind.SUPER);
  2004                 this.isSuper = tree.hasKind(ReferenceKind.SUPER);
  2002                 this.bridgeSym = needsBridge()
  2005                 this.bridgeSym = needsBridge()
  2003                         ? makePrivateSyntheticMethod(isSuper ? 0 : STATIC,
  2006                         ? makePrivateSyntheticMethod(isSuper ? 0 : STATIC,
  2004                                               referenceBridgeName(), null,
  2007                                               referenceBridgeName(), null,
  2005                                               owner.enclClass())
  2008                                               owner.enclClass())
       
  2009                         : null;
       
  2010                 this.sigPolySym = isSignaturePolymorphic()
       
  2011                         ? makePrivateSyntheticMethod(tree.sym.flags(),
       
  2012                                               tree.sym.name,
       
  2013                                               bridgedRefSig(),
       
  2014                                               tree.sym.enclClass())
  2006                         : null;
  2015                         : null;
  2007                 if (dumpLambdaToMethodStats) {
  2016                 if (dumpLambdaToMethodStats) {
  2008                     String key = bridgeSym == null ?
  2017                     String key = bridgeSym == null ?
  2009                             "mref.stat" : "mref.stat.1";
  2018                             "mref.stat" : "mref.stat.1";
  2010                     log.note(tree, key, needsAltMetafactory(), bridgeSym);
  2019                     log.note(tree, key, needsAltMetafactory(), bridgeSym);
  2104                               types.erasure(tree.sym.enclClass().asType()),
  2113                               types.erasure(tree.sym.enclClass().asType()),
  2105                               types.erasure(owner.enclClass().asType()));
  2114                               types.erasure(owner.enclClass().asType()));
  2106             }
  2115             }
  2107 
  2116 
  2108             /**
  2117             /**
       
  2118              * Signature polymorphic methods need special handling.
       
  2119              * e.g. MethodHandle.invoke() MethodHandle.invokeExact()
       
  2120              */
       
  2121             final boolean isSignaturePolymorphic() {
       
  2122                 return  tree.sym.kind == MTH &&
       
  2123                         types.isSignaturePolymorphic((MethodSymbol)tree.sym);
       
  2124             }
       
  2125 
       
  2126             /**
  2109              * Does this reference needs a bridge (i.e. var args need to be
  2127              * Does this reference needs a bridge (i.e. var args need to be
  2110              * expanded or "super" is used)
  2128              * expanded or "super" is used)
  2111              */
  2129              */
  2112             final boolean needsBridge() {
  2130             final boolean needsBridge() {
  2113                 return isSuper || needsVarArgsConversion() || isArrayOp() ||
  2131                 return isSuper || needsVarArgsConversion() || isArrayOp() ||