[code-reflection] RFR: Simplify code generation for quotable lambdas not to require duplicate capture argument lists

Maurizio Cimadamore mcimadamore at openjdk.org
Fri Oct 4 17:02:10 UTC 2024


When translating quotable lambdas/method references, we generate two captured argument lists:

* the captured arguments to be used by the functional interface implementation;
* the captured arguments to be used by the quotable implementation

In most cases these two captured lists are identical, except for cosmetic differences.
This is even more true after the backend of javac underwent significant rearchitecture, to better support the Flexible Constructor Bodies feature.

This PR simplifies `ReflectMethods` so that a visitor now computes all the required captured variables upfront.
The captured variables are then inserted in the quoted block, so that the rest of `BodyScanner` will be able to resolve references to such variables w/o the need for ad-hoc logic.

One complication is that, under this new regime, we can no longer afford to treat captured variables whose value is constant (e.g. `final int k = 100`) as if they were true captures.
This is because neither `Lower` nor `LambdaToMethod` capture constant variables. Since we're reusing the same dynamic arguments as `LambdaToMethod` we need to make sure that `ReflectMethods` also does not capture constant arguments.
Special logic to avoid capture of constant arguments is baked into the new visitor.

I have also added a check in the visitor, so that if, inside a quotable lambda, we see a creation of a local class that is declared outside the lambda, an unsupported exception is thrown.

I will followup with a separate fix to deal with these cases.

-------------

Commit messages:
 - Disable unsupported quotable lambdas
 - Remove dead code
 - Simplify metafactory not to required duplicate captured args
 - Simplify functional expression trees
 - Cleanup code
 - Initial push

Changes: https://git.openjdk.org/babylon/pull/249/files
  Webrev: https://webrevs.openjdk.org/?repo=babylon&pr=249&range=00
  Stats: 205 lines in 8 files changed: 109 ins; 75 del; 21 mod
  Patch: https://git.openjdk.org/babylon/pull/249.diff
  Fetch: git fetch https://git.openjdk.org/babylon.git pull/249/head:pull/249

PR: https://git.openjdk.org/babylon/pull/249


More information about the babylon-dev mailing list