mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-27 14:54:52 +02:00
8232806: Introduce a system property to disable eager lambda initialization
Reviewed-by: briangoetz, mr, psandoz, forax
This commit is contained in:
parent
4fcd28bf54
commit
29f2d74173
3 changed files with 88 additions and 27 deletions
|
@ -29,6 +29,7 @@ import jdk.internal.org.objectweb.asm.*;
|
|||
import sun.invoke.util.BytecodeDescriptor;
|
||||
import jdk.internal.misc.Unsafe;
|
||||
import sun.security.action.GetPropertyAction;
|
||||
import sun.security.action.GetBooleanAction;
|
||||
|
||||
import java.io.FilePermission;
|
||||
import java.io.Serializable;
|
||||
|
@ -87,10 +88,15 @@ import static jdk.internal.org.objectweb.asm.Opcodes.*;
|
|||
// For dumping generated classes to disk, for debugging purposes
|
||||
private static final ProxyClassesDumper dumper;
|
||||
|
||||
private static final boolean disableEagerInitialization;
|
||||
|
||||
static {
|
||||
final String key = "jdk.internal.lambda.dumpProxyClasses";
|
||||
String path = GetPropertyAction.privilegedGetProperty(key);
|
||||
dumper = (null == path) ? null : ProxyClassesDumper.getInstance(path);
|
||||
final String dumpProxyClassesKey = "jdk.internal.lambda.dumpProxyClasses";
|
||||
String dumpPath = GetPropertyAction.privilegedGetProperty(dumpProxyClassesKey);
|
||||
dumper = (null == dumpPath) ? null : ProxyClassesDumper.getInstance(dumpPath);
|
||||
|
||||
final String disableEagerInitializationKey = "jdk.internal.lambda.disableEagerInitialization";
|
||||
disableEagerInitialization = GetBooleanAction.privilegedGetProperty(disableEagerInitializationKey);
|
||||
}
|
||||
|
||||
// See context values in AbstractValidatingLambdaMetafactory
|
||||
|
@ -187,7 +193,9 @@ import static jdk.internal.org.objectweb.asm.Opcodes.*;
|
|||
@Override
|
||||
CallSite buildCallSite() throws LambdaConversionException {
|
||||
final Class<?> innerClass = spinInnerClass();
|
||||
if (invokedType.parameterCount() == 0) {
|
||||
if (invokedType.parameterCount() == 0 && !disableEagerInitialization) {
|
||||
// In the case of a non-capturing lambda, we optimize linkage by pre-computing a single instance,
|
||||
// unless we've suppressed eager initialization
|
||||
final Constructor<?>[] ctrs = AccessController.doPrivileged(
|
||||
new PrivilegedAction<>() {
|
||||
@Override
|
||||
|
@ -215,7 +223,9 @@ import static jdk.internal.org.objectweb.asm.Opcodes.*;
|
|||
}
|
||||
} else {
|
||||
try {
|
||||
UNSAFE.ensureClassInitialized(innerClass);
|
||||
if (!disableEagerInitialization) {
|
||||
UNSAFE.ensureClassInitialized(innerClass);
|
||||
}
|
||||
return new ConstantCallSite(
|
||||
MethodHandles.Lookup.IMPL_LOOKUP
|
||||
.findStatic(innerClass, NAME_FACTORY, invokedType));
|
||||
|
@ -273,7 +283,7 @@ import static jdk.internal.org.objectweb.asm.Opcodes.*;
|
|||
|
||||
generateConstructor();
|
||||
|
||||
if (invokedType.parameterCount() != 0) {
|
||||
if (invokedType.parameterCount() != 0 || disableEagerInitialization) {
|
||||
generateFactory();
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue