RFR: 8298590: Refactor LambdaForm constructors
Claes Redestad
redestad at openjdk.org
Wed Dec 14 11:30:20 UTC 2022
On Fri, 9 Dec 2022 18:02:53 GMT, Jorn Vernee <jvernee at openjdk.org> wrote:
> Refactor LambdaForm constructors into static factories.
>
> In the new code, there's only 1 constructor, which simply initializes all fields. Multiple factory methods are built on top of this, which add various argument validation/pre-processing and post processing of the constructed lambda forms.
>
> In the LambdaFrom class itself, it is easier to see which LF creation goes through which checks due to names of factory, or if all checks are bypassed by calling the constructor.
>
> New factories can easily be added that bypass all the checks in the existing factories and just call the root constructor if they so wish to (we likely want to add several for lazy lambda form resolution https://bugs.openjdk.org/browse/JDK-8288041).
>
> Additionally: replaced some default values literals with named constants so it's easy to see that it's just the default value for that arg at the call site.
LGTM. Nice to get rid of the in-flight side-effect of mutating `LambdaForm::names` in `normalize`, which seemed suspect as `names` is marked as `@Stable`.
src/java.base/share/classes/java/lang/invoke/LambdaForm.java line 347:
> 345: // root factory pre/post processing and calls simple cosntructor
> 346: private static LambdaForm create(int arity, Name[] names, int result, boolean forceInline, MethodHandle customized, Kind kind) {
> 347: names = names.clone();
Probably not important - and not for this RFE - but looking through the calls it seems that for some uses of `create` cloning the input array is superfluous. Maybe there's a very slight efficiency gain to be had here by making cloning the responsibility of the caller.
-------------
Marked as reviewed by redestad (Reviewer).
PR: https://git.openjdk.org/jdk/pull/11612
More information about the core-libs-dev
mailing list