On Fri, 17 Feb 2023 19:37:59 GMT, David M. Lloyd <[email protected]> wrote:
>> The class generated for lambda proxies is now defined as a hidden class.
>> This means that the counter, which was used to ensure a unique class name
>> and avoid clashes, is now redundant. In addition to performing redundant
>> work, this also impacts build reproducibility for native image generators
>> which might already have a strategy to cope with hidden classes but cannot
>> cope with indeterminate definition order for lambda proxy classes.
>>
>> This solves JDK-8292914 by making lambda proxy names always be stable
>> without any configuration needed. This would also replace #10024.
>
> David M. Lloyd has updated the pull request incrementally with two additional
> commits since the last revision:
>
> - Many tests have patterns for lambda class names; update them
> - Update comments and javadoc showin the old pattern
src/java.base/share/classes/java/lang/invoke/InnerClassLambdaMetafactory.java
line 370:
> 368: if (useImplMethodHandle) {
> 369: lookup =
> caller.defineHiddenClassWithClassData(classBytes, implementation,
> !disableEagerInitialization,
> 370: NESTMATE, STRONG);
nit: formatting - align this line to the first argument `classBytes` in L369.
src/java.base/share/classes/java/lang/invoke/InnerClassLambdaMetafactory.java
line 374:
> 372: lookup = caller.defineHiddenClass(classBytes,
> !disableEagerInitialization, NESTMATE, STRONG);
> 373: }
> 374: } catch (Throwable t) {
suggest to use try-finally in writing the file.
Lookup lookup = null;
try {
if (useImplMethodHandle) {
lookup = caller.defineHiddenClassWithClassData(classBytes,
implementation, !disableEagerInitialization,
NESTMATE,
STRONG);
} else {
lookup = caller.defineHiddenClass(classBytes,
!disableEagerInitialization, NESTMATE, STRONG);
}
} finally {
// If requested, dump out to a file for debugging purposes
if (dumper != null) {
final String name;
if (lookup != null) {
String definedName = lookup.lookupClass().getName();
int suffixIdx = definedName.lastIndexOf('/');
assert suffixIdx != -1;
name = lambdaClassName + '.' +
definedName.substring(suffixIdx + 1);
} else {
name = lambdaClassName + ".failed-" +
counter.incrementAndGet();
}
doDump(name, classBytes);
}
}
return lookup.lookupClass();
-------------
PR: https://git.openjdk.org/jdk/pull/12579