src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java
changeset 50181 f854b76b6a0c
parent 49577 faf02d65df7d
child 50250 04f9bb270ab8
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java	Fri May 18 14:51:06 2018 +0200
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java	Fri May 18 09:22:31 2018 -0700
@@ -72,6 +72,8 @@
 import javax.lang.model.element.ElementKind;
 import javax.lang.model.type.TypeKind;
 
+import com.sun.tools.javac.code.Type.IntersectionClassType;
+import com.sun.tools.javac.code.Types.FunctionDescriptorLookupError;
 import com.sun.tools.javac.main.Option;
 
 /**
@@ -929,7 +931,7 @@
                         : expressionNew();
 
                 JCLambda slam = make.Lambda(params.toList(), expr);
-                slam.targets = tree.targets;
+                slam.target = tree.target;
                 slam.type = tree.type;
                 slam.pos = tree.pos;
                 return slam;
@@ -1111,7 +1113,7 @@
             int refKind, Symbol refSym, List<JCExpression> indy_args) {
         JCFunctionalExpression tree = context.tree;
         //determine the static bsm args
-        MethodSymbol samSym = (MethodSymbol) types.findDescriptorSymbol(tree.type.tsym);
+        MethodSymbol samSym = (MethodSymbol) types.findDescriptorSymbol(tree.target.tsym);
         List<Object> staticArgs = List.of(
                 typeToMethodType(samSym.type),
                 new Pool.MethodHandle(refKind, refSym, types),
@@ -1134,8 +1136,13 @@
 
         if (context.needsAltMetafactory()) {
             ListBuffer<Object> markers = new ListBuffer<>();
-            for (Type t : tree.targets.tail) {
-                if (t.tsym != syms.serializableType.tsym) {
+            List<Type> targets = tree.target.isIntersection() ?
+                    types.directSupertypes(tree.target) :
+                    List.nil();
+            for (Type t : targets) {
+                t = types.erasure(t);
+                if (t.tsym != syms.serializableType.tsym &&
+                    t.tsym != syms.objectType.tsym) {
                     markers.append(t.tsym);
                 }
             }
@@ -1903,13 +1910,13 @@
                 this.depth = frameStack.size() - 1;
                 this.prev = context();
                 ClassSymbol csym =
-                        types.makeFunctionalInterfaceClass(attrEnv, names.empty, tree.targets, ABSTRACT | INTERFACE);
+                        types.makeFunctionalInterfaceClass(attrEnv, names.empty, tree.target, ABSTRACT | INTERFACE);
                 this.bridges = types.functionalInterfaceBridges(csym);
             }
 
             /** does this functional expression need to be created using alternate metafactory? */
             boolean needsAltMetafactory() {
-                return tree.targets.length() > 1 ||
+                return tree.target.isIntersection() ||
                         isSerializable() ||
                         bridges.length() > 1;
             }
@@ -1919,12 +1926,7 @@
                 if (forceSerializable) {
                     return true;
                 }
-                for (Type target : tree.targets) {
-                    if (types.asSuper(target, syms.serializableType.tsym) != null) {
-                        return true;
-                    }
-                }
-                return false;
+                return types.asSuper(tree.target, syms.serializableType.tsym) != null;
             }
 
             /**
@@ -2416,7 +2418,7 @@
             }
 
             Type bridgedRefSig() {
-                return types.erasure(types.findDescriptorSymbol(tree.targets.head.tsym).type);
+                return types.erasure(types.findDescriptorSymbol(tree.target.tsym).type);
             }
         }
     }