deduplicating lambda methods
Vicente Romero
vicente.romero at oracle.com
Mon Apr 2 13:46:57 UTC 2018
I assume the two patches below should be folded right?
Vicente
On 03/31/2018 11:15 AM, B. Blaser wrote:
> On 30 March 2018 at 18:29, B. Blaser <bsrbnd at gmail.com> wrote:
>> On 29 March 2018 at 22:02, Maurizio Cimadamore
>> <maurizio.cimadamore at oracle.com> wrote:
>>> I wonder if there could be a way to reuse the logic in Pool::DynamicMethod -
>>> that code is essentially doing the same thing!
>>>
>>> Maurizio
>> Yes (as next), great!
>> All lambda tests are passing successfully but we'll have to re-run the
>> others which seem OK with the previous key.
>>
>> Bernard
> I've also updated the de-duplication test with meta-factory calls
> inside lambdas, as here under.
>
> Bernard
>
> diff -r 9925be430918
> test/langtools/tools/javac/lambda/deduplication/Deduplication.java
> --- a/test/langtools/tools/javac/lambda/deduplication/Deduplication.java
> Wed Mar 28 14:24:17 2018 +0100
> +++ b/test/langtools/tools/javac/lambda/deduplication/Deduplication.java
> Sat Mar 31 16:49:48 2018 +0200
> @@ -32,6 +32,12 @@
> void group(Object... xs) {}
>
> void test() {
> +
> + group(
> + (Runnable) () -> { ( (Runnable) () -> {} ).run(); },
> + (Runnable) () -> { ( (Runnable) () -> {} ).run(); }
> + );
> +
> group((Function<String, Integer>) x -> x.hashCode());
> group((Function<Object, Integer>) x -> x.hashCode());
>
>
>> diff -r 9925be430918
>> src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java
>> --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java
>> Wed Mar 28 14:24:17 2018 +0100
>> +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java
>> Fri Mar 30 18:11:49 2018 +0200
>> @@ -67,6 +67,7 @@
>> import static com.sun.tools.javac.code.Kinds.Kind.*;
>> import static com.sun.tools.javac.code.TypeTag.*;
>> import static com.sun.tools.javac.tree.JCTree.Tag.*;
>> +import static com.sun.tools.javac.jvm.Pool.DynamicMethod;
>>
>> import javax.lang.model.element.ElementKind;
>> import javax.lang.model.type.TypeKind;
>> @@ -226,6 +227,8 @@
>>
>> private Map<DedupedLambda, DedupedLambda> dedupedLambdas;
>>
>> + private Map<DynamicMethod, DynamicMethodSymbol> dynMethSyms =
>> new HashMap<>();
>> +
>> /**
>> * list of deserialization cases
>> */
>> @@ -1218,9 +1221,10 @@
>> (MethodSymbol)bsm,
>> indyType,
>> staticArgs.toArray());
>> -
>> JCFieldAccess qualifier =
>> make.Select(make.QualIdent(site.tsym), bsmName);
>> - qualifier.sym = dynSym;
>> + DynamicMethodSymbol existing = kInfo.dynMethSyms.putIfAbsent(
>> + new DynamicMethod(dynSym, types), dynSym);
>> + qualifier.sym = existing != null ? existing : dynSym;
>> qualifier.type = indyType.getReturnType();
>>
>> JCMethodInvocation proxyCall = make.Apply(List.nil(),
>> qualifier, indyArgs);
>> diff -r 9925be430918
>> src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/Pool.java
>> --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/Pool.java
>> Wed Mar 28 14:24:17 2018 +0100
>> +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/Pool.java
>> Fri Mar 30 18:11:49 2018 +0200
>> @@ -180,10 +180,10 @@
>> }
>> }
>>
>> - static class DynamicMethod extends Method {
>> + public static class DynamicMethod extends Method {
>> public Object[] uniqueStaticArgs;
>>
>> - DynamicMethod(DynamicMethodSymbol m, Types types) {
>> + public DynamicMethod(DynamicMethodSymbol m, Types types) {
>> super(m, types);
>> uniqueStaticArgs = getUniqueTypeArray(m.staticArgs, types);
>> }
More information about the amber-dev
mailing list