<!DOCTYPE html><html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<p>Hi Egor,<br>
I confirm that this change is deliberate. There were several
changes required to make JEP 513 (Flexible Constructor Bodies)
work. Some of these changes resulted in significant rewrites of
the compiler backend (to move lambda translation ahead of inner
class translation). The bulk of the work (and some history) is
here:</p>
<p><a class="moz-txt-link-freetext" href="https://github.com/openjdk/jdk/pull/19836">https://github.com/openjdk/jdk/pull/19836</a></p>
<p>This change created some compatibility issues for serializable
lambdas, which were later addressed here:</p>
<p><a class="moz-txt-link-freetext" href="https://github.com/openjdk/jdk/pull/20349">https://github.com/openjdk/jdk/pull/20349</a></p>
<p>This latter change dropped a lot of accidental complexity from
the javac LambdaToInner pass, and that meant making the logic for
computing the names serializable and non-serializable lambdas more
robust.</p>
<p>This meant that, unfortunately, the (unspecified) name of some
non-serializable lambda changed. This compatibility issue is
described in the associated CSR:</p>
<p><a class="moz-txt-link-freetext" href="https://bugs.openjdk.org/browse/JDK-8337558">https://bugs.openjdk.org/browse/JDK-8337558</a></p>
<p>The difference you see is caused by when the name of the
translated lambda method is generated -- it used to be computed
_after_ the end of the lambda body, now it is computed _before_.
This means that as soon as we see the outermost lambda for `r3` we
give it the first number -- then the nested lambda for `r4` gets
the second number.</p>
<p>This allows us to avoid having to "patch" the names of the
translated symbols, which minimizes the amount of mutation in our
code, making it less brittle. So, unless there's a big reason as
to why these names should go back the way they were, we'd like to
keep the code the way it is :-)<br>
</p>
<p>Cheers<br>
Maurizio<br>
</p>
<div class="moz-cite-prefix">On 11/07/2025 16:08, Egor Ushakov
wrote:<br>
</div>
<blockquote type="cite" cite="mid:71f259c7-a64e-4550-ae4d-b28b8ed0c792@jetbrains.com">
Hi everyone!<br>
<br>
it looks like in jdk 24 compiler started naming lambda methods
slightly differently,<br>
consider the code:<br>
<div style="background-color:#ffffff;color:#080808">
<pre style="font-family:'Source Code Pro',monospace;font-size:12,0pt;"><span style="color:#0033b3;">public class </span><span style="color:#000000;">Lambdas1 </span>{
<span style="color:#0033b3;">public static void </span><span style="color:#00627a;">main</span>(<span style="color:#000000;">String</span>[] <span style="color:#000000;">args</span>) {
<span style="color:#000000;">Runnable r3 </span>= () -> {
<span style="color:#000000;">Runnable r4 </span>= () -> <span style="color:#000000;">System</span>.<span style="color:#871094;font-style:italic;">out</span>.println(<span style="color:#0033b3;">new </span>Exception().getStackTrace()[<span style="color:#1750eb;">0</span>]);
<span style="color:#000000;">r4</span>.run();
<span style="color:#000000;">System</span>.<span style="color:#871094;font-style:italic;">out</span>.println(<span style="color:#0033b3;">new </span>Exception().getStackTrace()[<span style="color:#1750eb;">0</span>]);
};
<span style="color:#000000;">r3</span>.run();
}
}
</pre>
with jdk 23 the output is:<br>
Lambdas1.lambda$main$<b>0</b>(Lambdas1.java:7)<br>
Lambdas1.lambda$main$<b>1</b>(Lambdas1.java:9)<br>
<br>
</div>
with jdk 24:<br>
Lambdas1.lambda$main$<b>1</b>(Lambdas1.java:4)<br>
Lambdas1.lambda$main$<b>0</b>(Lambdas1.java:6)<br>
<br>
I know that this is not specified anywhere, but Intellij IDEA
relied on this and it caused issues with debugger features:<br>
<a class="moz-txt-link-freetext" href="https://youtrack.jetbrains.com/issue/IDEA-375811" moz-do-not-send="true">https://youtrack.jetbrains.com/issue/IDEA-375811</a><br>
<br>
Was this change really intended? Could anyone please point me to
the fix that caused this?<br>
<br>
Thanks!<br>
Egor<br>
</blockquote>
</body>
</html>