--- 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);
}
}
}