RFR: JDK-8242451 : ensure semantics of non-capturing lambdas are preserved independent of execution mode
Brian Goetz
brian.goetz at oracle.com
Tue Jun 23 18:38:09 UTC 2020
On 6/23/2020 2:08 PM, Gilles Duboscq wrote:
> In 8232806, a system property was introduce to disable eager initialization of the classes generated by the InnerClassLambdaMetafactory (`jdk.internal.lambda.disableEagerInitialization`).
>
> However, when `disableEagerInitialization` is true, even for non-capturing lambdas, the capturing lambda path that uses a method handle to the constructor is taken.
> This helps prevent eager initialization but also has the side effect of always returning a fresh instance of the lambda for every invocation instead of a singleton.
> While this is allowed by the specs, this might change the behaviour of some (incorrect) programs that assume a singleton is used for non-capturing lambdas.
I need to reiterate that such programs are broken, and coddling such
programs is likely to backfire in the long run. When we switch to using
inline classes for lambda proxies, for example, programs depending on
the identity of lambda proxies likely will break, and tough luck on
them. The JLS was exceedingly clear from day 1 that the identity
behavior of a lambda proxy is an implementation detail that should be
_expected_ to change.
All that said, the change here seems fairly restrained, and I understand
there are other motivations here. I have a few concerns, which I think
should be easily addressed:
- I would prefer not to use Lookup.IMPL_LOOKUP. We have been on a
campaign to _reduce_ the use of IMPL_LOOKUP in code like this, both
based on "principle of least privilege" as well as because we would like
to move this code out of JLI into `java.lang.invoke` as soon as
practical (this has been queued up behind some other changes). Is there
a translation strategy you can see that doesn't require IMPL_LOOKUP? It
seems reasonable to make the field accessible, since it is a cached
instance that is freely dispensed to anyone who asks anyway. The hidden
class generation produces a Lookup for the class as part of the process;
getting access to it might complicate the patch a little bit, but not
doing so is creating fresh technical debt in the way of a refactor we
have been trying to get to for a while.
- I'm having a hard time reconciling this patch against the JDK tip,
which incorporates the changes for Hidden Classes. Was this patch done
against an older version, or is this patch destined only for an update
release?
- Assuming we can resolve the above, I would like Mandy to review
these as she has most recently been in this code (eliminating the
dependence on `Unsafe::defineAnonymousClass` with the newly supported
"hidden classes.")
More information about the core-libs-dev
mailing list