deduplicating lambda methods

B. Blaser bsrbnd at gmail.com
Wed Mar 21 12:24:30 UTC 2018


On 19 March 2018 at 22:31, Maurizio Cimadamore
<maurizio.cimadamore at oracle.com> wrote:
>
> [...]
>
> Also, a side note: we have learned during condy-folding that rewriting trees
> is not always the right approach - if you are compiling with -g, you might
> need the trees to remain in place (as you want the compiler to perform less
> aggressive folding) - so I'm not sure the compiler will always be able to
> rely on constants to be rewritten in the constant folding phase.
>
> Maurizio

This makes me think we could disable dedup with '-g' to preserve full
debug-ability (as next), is this partially what you meant?

Bernard


$ diff -u ./src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java.r03
./src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java
--- ./src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java.r03
   2018-03-21 12:51:14.338021489 +0100
+++ ./src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java
   2018-03-21 12:51:56.209495093 +0100
@@ -113,6 +113,8 @@
     /** force serializable representation, for stress testing **/
     private final boolean forceSerializable;

+    private final boolean debug;
+
     /** Flag for alternate metafactories indicating the lambda object
is intended to be serializable */
     public static final int FLAG_SERIALIZABLE = 1 << 0;

@@ -149,6 +151,7 @@
         dumpLambdaToMethodStats =
options.isSet("debug.dumpLambdaToMethodStats");
         attr = Attr.instance(context);
         forceSerializable = options.isSet("forceSerializable");
+        debug = options.isSet(Option.G) ||
options.isSet(Option.G_CUSTOM, "source");
     }
     // </editor-fold>

@@ -365,7 +368,7 @@
         lambdaDecl.body = translate(makeLambdaBody(tree, lambdaDecl));

         boolean dedupe = false;
-        if (!localContext.isSerializable()) {
+        if (!localContext.isSerializable() && !debug) {
             DedupedLambda dedupedLambda = new
DedupedLambda(lambdaDecl.sym, lambdaDecl.body);
             DedupedLambda existing =
kInfo.dedupedLambdas.putIfAbsent(dedupedLambda, dedupedLambda);
             if (existing != null) {


More information about the amber-dev mailing list