# HG changeset patch # User vromero # Date 1371223509 -3600 # Node ID 6b48ebae2569eff137d4edf7a69ca1893178b328 # Parent 7fe655cad9b1a05980d56a6988872ad83fa2b842 8016569: javac, add new flag for polymorphic method signatures Reviewed-by: jjg Contributed-by: maurizio.cimadamore@oracle.com diff -r 7fe655cad9b1 -r 6b48ebae2569 src/share/classes/com/sun/tools/javac/code/Flags.java --- a/src/share/classes/com/sun/tools/javac/code/Flags.java Tue Jun 11 09:59:34 2013 +0100 +++ b/src/share/classes/com/sun/tools/javac/code/Flags.java Fri Jun 14 16:25:09 2013 +0100 @@ -278,6 +278,11 @@ */ public static final long BAD_OVERRIDE = 1L<<45; + /** + * Flag that indicates a signature polymorphic method (292). + */ + public static final long SIGNATURE_POLYMORPHIC = 1L<<46; + /** Modifier masks. */ public static final int diff -r 7fe655cad9b1 -r 6b48ebae2569 src/share/classes/com/sun/tools/javac/code/Symbol.java --- a/src/share/classes/com/sun/tools/javac/code/Symbol.java Tue Jun 11 09:59:34 2013 +0100 +++ b/src/share/classes/com/sun/tools/javac/code/Symbol.java Fri Jun 14 16:25:09 2013 +0100 @@ -1537,25 +1537,6 @@ getKind() == ElementKind.INSTANCE_INIT; } - /** - * A polymorphic signature method (JLS SE 7, 8.4.1) is a method that - * (i) is declared in the java.lang.invoke.MethodHandle class, (ii) takes - * a single variable arity parameter (iii) whose declared type is Object[], - * (iv) has a return type of Object and (v) is native. - */ - public boolean isSignaturePolymorphic(Types types) { - List argtypes = type.getParameterTypes(); - Type firstElemType = argtypes.nonEmpty() ? - types.elemtype(argtypes.head) : - null; - return owner == types.syms.methodHandleType.tsym && - argtypes.length() == 1 && - firstElemType != null && - types.isSameType(firstElemType, types.syms.objectType) && - types.isSameType(type.getReturnType(), types.syms.objectType) && - (flags() & NATIVE) != 0; - } - public Attribute getDefaultValue() { return defaultValue; } diff -r 7fe655cad9b1 -r 6b48ebae2569 src/share/classes/com/sun/tools/javac/code/Types.java --- a/src/share/classes/com/sun/tools/javac/code/Types.java Tue Jun 11 09:59:34 2013 +0100 +++ b/src/share/classes/com/sun/tools/javac/code/Types.java Fri Jun 14 16:25:09 2013 +0100 @@ -951,6 +951,22 @@ } /** + * A polymorphic signature method (JLS SE 7, 8.4.1) is a method that + * (i) is declared in the java.lang.invoke.MethodHandle class, (ii) takes + * a single variable arity parameter (iii) whose declared type is Object[], + * (iv) has a return type of Object and (v) is native. + */ + public boolean isSignaturePolymorphic(MethodSymbol msym) { + List argtypes = msym.type.getParameterTypes(); + return (msym.flags_field & NATIVE) != 0 && + msym.owner == syms.methodHandleType.tsym && + argtypes.tail.tail == null && + argtypes.head.hasTag(TypeTag.ARRAY) && + msym.type.getReturnType().tsym == syms.objectType.tsym && + ((ArrayType)argtypes.head).elemtype.tsym == syms.objectType.tsym; + } + + /** * Is t the same type as s? */ public boolean isSameType(Type t, Type s) { diff -r 7fe655cad9b1 -r 6b48ebae2569 src/share/classes/com/sun/tools/javac/comp/Attr.java --- a/src/share/classes/com/sun/tools/javac/comp/Attr.java Tue Jun 11 09:59:34 2013 +0100 +++ b/src/share/classes/com/sun/tools/javac/comp/Attr.java Fri Jun 14 16:25:09 2013 +0100 @@ -3405,7 +3405,7 @@ Env env, ResultInfo resultInfo) { boolean isPolymorhicSignature = - sym.kind == MTH && ((MethodSymbol)sym.baseSymbol()).isSignaturePolymorphic(types); + (sym.baseSymbol().flags() & SIGNATURE_POLYMORPHIC) != 0; return isPolymorhicSignature ? checkSigPolyMethodId(tree, site, sym, env, resultInfo) : checkMethodIdInternal(tree, site, sym, env, resultInfo); diff -r 7fe655cad9b1 -r 6b48ebae2569 src/share/classes/com/sun/tools/javac/comp/Check.java --- a/src/share/classes/com/sun/tools/javac/comp/Check.java Tue Jun 11 09:59:34 2013 +0100 +++ b/src/share/classes/com/sun/tools/javac/comp/Check.java Fri Jun 14 16:25:09 2013 +0100 @@ -909,7 +909,7 @@ "unchecked.generic.array.creation", argtype); } - if (!((MethodSymbol)sym.baseSymbol()).isSignaturePolymorphic(types)) { + if ((sym.baseSymbol().flags() & SIGNATURE_POLYMORPHIC) == 0) { TreeInfo.setVarargsElement(env.tree, types.elemtype(argtype)); } } diff -r 7fe655cad9b1 -r 6b48ebae2569 src/share/classes/com/sun/tools/javac/comp/MemberEnter.java --- a/src/share/classes/com/sun/tools/javac/comp/MemberEnter.java Tue Jun 11 09:59:34 2013 +0100 +++ b/src/share/classes/com/sun/tools/javac/comp/MemberEnter.java Fri Jun 14 16:25:09 2013 +0100 @@ -560,6 +560,10 @@ chk.setDeferredLintHandler(prevLintHandler); } + if (types.isSignaturePolymorphic(m)) { + m.flags_field |= SIGNATURE_POLYMORPHIC; + } + // Set m.params ListBuffer params = new ListBuffer(); JCVariableDecl lastParam = null; diff -r 7fe655cad9b1 -r 6b48ebae2569 src/share/classes/com/sun/tools/javac/comp/Resolve.java --- a/src/share/classes/com/sun/tools/javac/comp/Resolve.java Tue Jun 11 09:59:34 2013 +0100 +++ b/src/share/classes/com/sun/tools/javac/comp/Resolve.java Fri Jun 14 16:25:09 2013 +0100 @@ -2267,7 +2267,7 @@ sym = super.access(env, pos, location, sym); } else if (allowMethodHandles) { MethodSymbol msym = (MethodSymbol)sym; - if (msym.isSignaturePolymorphic(types)) { + if ((msym.flags() & SIGNATURE_POLYMORPHIC) != 0) { return findPolymorphicSignatureInstance(env, sym, argtypes); } } diff -r 7fe655cad9b1 -r 6b48ebae2569 src/share/classes/com/sun/tools/javac/jvm/ClassReader.java --- a/src/share/classes/com/sun/tools/javac/jvm/ClassReader.java Tue Jun 11 09:59:34 2013 +0100 +++ b/src/share/classes/com/sun/tools/javac/jvm/ClassReader.java Fri Jun 14 16:25:09 2013 +0100 @@ -1985,6 +1985,9 @@ syms.methodClass); } MethodSymbol m = new MethodSymbol(flags, name, type, currentOwner); + if (types.isSignaturePolymorphic(m)) { + m.flags_field |= SIGNATURE_POLYMORPHIC; + } if (saveParameterNames) initParameterNames(m); Symbol prevOwner = currentOwner;