deduplicating lambda methods

B. Blaser bsrbnd at gmail.com
Fri Mar 30 16:29:26 UTC 2018


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

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