known translation issues related to JEP 482

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Thu Jun 13 17:05:10 UTC 2024


On 13/06/2024 15:31, Archie Cobbs wrote:
> Hi Maurizio,
>
> On Thu, Jun 13, 2024 at 5:50 AM Maurizio Cimadamore 
> <maurizio.cimadamore at oracle.com> wrote:
>
>     There's also a second, more subtle, implementation issue, which
>     I'm in the process of evaluating as we speak. It seems to me that
>     the ordering of the compiler steps Lower and LambdaToMethod is
>     backwards.
>
>
> Ah! That helps clarify things for me. Thanks for your analysis.
>
> -Archie
>
> -- 
> Archie L. Cobbs

Here's a first draft of the work to move LambdaToMethod after Lower:

https://github.com/mcimadamore/jdk/pull/new/cleanup_capture

Things went considerably smooth, given the depth of the surgery. Some 
notable facts:

1. now LambdaToMethod deals with separate classes, not a single toplevel 
one (as it now occurs _after_ lowering)
2. Lower needs a to override `visitLambda`, so that it can properly 
lower the lambda return expressions
3. The code to "desugars" complex method references into lambdas has 
been moved from LambdaToMethod to Lower (so that we can fixup references 
to inner classes etc.)
4. The method reference receiver of desugared lambda expression is now 
stashed into the JCLambda AST (as LambdaToMethod will need that later)
5. the lambda deserialization method generated by LambdaToMethod 
contains string in switch, and implicitly requires boxing, so we need to 
explictly lower that
6. some code generated by Lower is not stable, so lambda deduplication 
fails in new ways

The nice thing about this cleanup is that a ton of questionable stuff 
just disappears:

* no need to have a "lambdaTranslationMap" in Lower. This was only 
needed when a lambda expression anticipated capture later required from 
Lower but that did not appear in the source code (yet)
* no need to have "typesUnderConstruction" (and associated visitors) in 
LambdaToMethod. As now lambda translation occurs _after_ inner class 
translation, LambdaToMethod can expect that references to enclosing 
instances have already been figured out by Lower
* no more need to "guess" captured values for local classes inside a 
lambda - the required captured values are now made explicit in the AST. 
This means we don't need to run a modified FreeVarCollector inside 
LambdaToMethod

All this means is that stuff like this:

https://bugs.openjdk.org/browse/JDK-8334037

Just works. And, if we make improvements in Lower to fix the issues with 
local and anonymous classes and inaccessible enclosing instances, then 
LambdaToMethod will work w/o any manual adjustment required.

Of course, this is a biggie piece of work, so I don't think we should do 
it for 23, as we're already past RDP1. More testing is also needed. But, 
a promising start.

Cheers
Maurizio

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/amber-dev/attachments/20240613/c767d9aa/attachment.htm>


More information about the amber-dev mailing list