diff -r e28a06a3c5d9 -r 2827076dbf64 src/share/classes/com/sun/tools/javac/comp/Resolve.java --- a/src/share/classes/com/sun/tools/javac/comp/Resolve.java Mon Mar 26 15:28:22 2012 +0100 +++ b/src/share/classes/com/sun/tools/javac/comp/Resolve.java Mon Mar 26 15:28:49 2012 +0100 @@ -399,7 +399,6 @@ else { Symbol s2 = ((MethodSymbol)sym).implementation(site.tsym, types, true); return (s2 == null || s2 == sym || sym.owner == s2.owner || - s2.isPolymorphicSignatureGeneric() || !types.isSubSignature(types.memberType(site, s2), types.memberType(site, sym))); } } @@ -449,7 +448,6 @@ boolean useVarargs, Warner warn) throws Infer.InferenceException { - boolean polymorphicSignature = m.isPolymorphicSignatureGeneric() && allowMethodHandles; if (useVarargs && (m.flags() & VARARGS) == 0) throw inapplicableMethodException.setMessage(); Type mt = types.memberType(site, m); @@ -490,8 +488,7 @@ } // find out whether we need to go the slow route via infer - boolean instNeeded = tvars.tail != null || /*inlined: tvars.nonEmpty()*/ - polymorphicSignature; + boolean instNeeded = tvars.tail != null; /*inlined: tvars.nonEmpty()*/ for (List l = argtypes; l.tail != null/*inlined: l.nonEmpty()*/ && !instNeeded; l = l.tail) { @@ -499,9 +496,7 @@ } if (instNeeded) - return polymorphicSignature ? - infer.instantiatePolymorphicSignatureInstance(env, site, m.name, (MethodSymbol)m, argtypes) : - infer.instantiateMethod(env, + return infer.instantiateMethod(env, tvars, (MethodType)mt, m, @@ -1740,25 +1735,18 @@ steps = steps.tail; } if (sym.kind >= AMBIGUOUS) { - if (site.tsym.isPolymorphicSignatureGeneric()) { - //polymorphic receiver - synthesize new method symbol + //if nothing is found return the 'first' error + MethodResolutionPhase errPhase = + currentResolutionContext.firstErroneousResolutionPhase(); + sym = access(currentResolutionContext.resolutionCache.get(errPhase), + pos, location, site, name, true, argtypes, typeargtypes); + env.info.varArgs = errPhase.isVarargsRequired; + } else if (allowMethodHandles) { + MethodSymbol msym = (MethodSymbol)sym; + if (msym.isSignaturePolymorphic(types)) { env.info.varArgs = false; - sym = findPolymorphicSignatureInstance(env, - site, name, null, argtypes); + return findPolymorphicSignatureInstance(env, sym, argtypes); } - else { - //if nothing is found return the 'first' error - MethodResolutionPhase errPhase = - currentResolutionContext.firstErroneousResolutionPhase(); - sym = access(currentResolutionContext.resolutionCache.get(errPhase), - pos, location, site, name, true, argtypes, typeargtypes); - env.info.varArgs = errPhase.isVarargsRequired; - } - } else if (allowMethodHandles && sym.isPolymorphicSignatureGeneric()) { - //non-instantiated polymorphic signature - synthesize new method symbol - env.info.varArgs = false; - sym = findPolymorphicSignatureInstance(env, - site, name, (MethodSymbol)sym, argtypes); } return sym; } @@ -1771,40 +1759,25 @@ * Searches in a side table, not the main scope of the site. * This emulates the lookup process required by JSR 292 in JVM. * @param env Attribution environment - * @param site The original type from where the selection takes place. - * @param name The method's name. - * @param spMethod A template for the implicit method, or null. - * @param argtypes The required argument types. - * @param typeargtypes The required type arguments. + * @param spMethod signature polymorphic method - i.e. MH.invokeExact + * @param argtypes The required argument types */ - Symbol findPolymorphicSignatureInstance(Env env, Type site, - Name name, - MethodSymbol spMethod, // sig. poly. method or null if none + Symbol findPolymorphicSignatureInstance(Env env, + Symbol spMethod, List argtypes) { Type mtype = infer.instantiatePolymorphicSignatureInstance(env, - site, name, spMethod, argtypes); - long flags = ABSTRACT | HYPOTHETICAL | POLYMORPHIC_SIGNATURE | - (spMethod != null ? - spMethod.flags() & Flags.AccessFlags : - Flags.PUBLIC | Flags.STATIC); - Symbol m = null; - for (Scope.Entry e = polymorphicSignatureScope.lookup(name); - e.scope != null; - e = e.next()) { - Symbol sym = e.sym; - if (types.isSameType(mtype, sym.type) && - (sym.flags() & Flags.STATIC) == (flags & Flags.STATIC) && - types.isSameType(sym.owner.type, site)) { - m = sym; - break; + (MethodSymbol)spMethod, argtypes); + for (Symbol sym : polymorphicSignatureScope.getElementsByName(spMethod.name)) { + if (types.isSameType(mtype, sym.type)) { + return sym; } } - if (m == null) { - // create the desired method - m = new MethodSymbol(flags, name, mtype, site.tsym); - polymorphicSignatureScope.enter(m); - } - return m; + + // create the desired method + long flags = ABSTRACT | HYPOTHETICAL | spMethod.flags() & Flags.AccessFlags; + Symbol msym = new MethodSymbol(flags, spMethod.name, mtype, spMethod.owner); + polymorphicSignatureScope.enter(msym); + return msym; } /** Resolve a qualified method identifier, throw a fatal error if not