mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-27 23:04:50 +02:00
8257241: CDS should not handle disableEagerInitialization for archived lambda proxy classes
Reviewed-by: iklam, redestad, mchung
This commit is contained in:
parent
7104400ad8
commit
3da30e991a
9 changed files with 260 additions and 50 deletions
|
@ -271,37 +271,37 @@ import static jdk.internal.org.objectweb.asm.Opcodes.*;
|
|||
* registers the lambda proxy class for including into the CDS archive.
|
||||
*/
|
||||
private Class<?> spinInnerClass() throws LambdaConversionException {
|
||||
// include lambda proxy class in CDS archive at dump time
|
||||
if (CDS.isDumpingArchive()) {
|
||||
Class<?> innerClass = generateInnerClass();
|
||||
LambdaProxyClassArchive.register(targetClass,
|
||||
samMethodName,
|
||||
invokedType,
|
||||
samMethodType,
|
||||
implMethod,
|
||||
instantiatedMethodType,
|
||||
isSerializable,
|
||||
markerInterfaces,
|
||||
additionalBridges,
|
||||
innerClass);
|
||||
return innerClass;
|
||||
}
|
||||
// CDS does not handle disableEagerInitialization.
|
||||
if (!disableEagerInitialization) {
|
||||
// include lambda proxy class in CDS archive at dump time
|
||||
if (CDS.isDumpingArchive()) {
|
||||
Class<?> innerClass = generateInnerClass();
|
||||
LambdaProxyClassArchive.register(targetClass,
|
||||
samMethodName,
|
||||
invokedType,
|
||||
samMethodType,
|
||||
implMethod,
|
||||
instantiatedMethodType,
|
||||
isSerializable,
|
||||
markerInterfaces,
|
||||
additionalBridges,
|
||||
innerClass);
|
||||
return innerClass;
|
||||
}
|
||||
|
||||
// load from CDS archive if present
|
||||
Class<?> innerClass = LambdaProxyClassArchive.find(targetClass,
|
||||
samMethodName,
|
||||
invokedType,
|
||||
samMethodType,
|
||||
implMethod,
|
||||
instantiatedMethodType,
|
||||
isSerializable,
|
||||
markerInterfaces,
|
||||
additionalBridges,
|
||||
!disableEagerInitialization);
|
||||
if (innerClass == null) {
|
||||
innerClass = generateInnerClass();
|
||||
// load from CDS archive if present
|
||||
Class<?> innerClass = LambdaProxyClassArchive.find(targetClass,
|
||||
samMethodName,
|
||||
invokedType,
|
||||
samMethodType,
|
||||
implMethod,
|
||||
instantiatedMethodType,
|
||||
isSerializable,
|
||||
markerInterfaces,
|
||||
additionalBridges);
|
||||
if (innerClass != null) return innerClass;
|
||||
}
|
||||
return innerClass;
|
||||
return generateInnerClass();
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -50,8 +50,7 @@ final class LambdaProxyClassArchive {
|
|||
MethodType invokedType,
|
||||
MethodType samMethodType,
|
||||
MemberName implMethod,
|
||||
MethodType instantiatedMethodType,
|
||||
boolean initialize);
|
||||
MethodType instantiatedMethodType);
|
||||
|
||||
/**
|
||||
* Registers the lambdaProxyClass into CDS archive.
|
||||
|
@ -101,16 +100,15 @@ final class LambdaProxyClassArchive {
|
|||
MethodType instantiatedMethodType,
|
||||
boolean isSerializable,
|
||||
Class<?>[] markerInterfaces,
|
||||
MethodType[] additionalBridges,
|
||||
boolean initialize) {
|
||||
MethodType[] additionalBridges) {
|
||||
if (CDS.isDumpingArchive())
|
||||
throw new IllegalStateException("cannot load class from CDS archive at dump time");
|
||||
|
||||
if (!loadedByBuiltinLoader(caller) || !initialize ||
|
||||
if (!loadedByBuiltinLoader(caller) ||
|
||||
!CDS.isSharingEnabled() || isSerializable || markerInterfaces.length > 0 || additionalBridges.length > 0)
|
||||
return null;
|
||||
|
||||
return findFromArchive(caller, invokedName, invokedType, samMethodType,
|
||||
implMethod.internalMemberName(), instantiatedMethodType, initialize);
|
||||
implMethod.internalMemberName(), instantiatedMethodType);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue