aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorbriangoetz <none@none>2013-10-29 12:45:18 -0400
committerbriangoetz <none@none>2013-10-29 12:45:18 -0400
commitd4b3814b6e9d060345d7e9068149d050fc1ee891 (patch)
tree7682c2db64f96f86f3a30307c23b6dec6ff84e37 /src
parent7204c6151ce4a5b8d8837dddfa4268e0f6ec0718 (diff)
8024633: Lambda linkage performance - initialize generated class earlier
Reviewed-by: briangoetz, rfield Contributed-by: sergey.kuksenko@oracle.com
Diffstat (limited to 'src')
-rw-r--r--src/share/classes/java/lang/invoke/InnerClassLambdaMetafactory.java21
1 files changed, 10 insertions, 11 deletions
diff --git a/src/share/classes/java/lang/invoke/InnerClassLambdaMetafactory.java b/src/share/classes/java/lang/invoke/InnerClassLambdaMetafactory.java
index a989ddf0b..a85c505c0 100644
--- a/src/share/classes/java/lang/invoke/InnerClassLambdaMetafactory.java
+++ b/src/share/classes/java/lang/invoke/InnerClassLambdaMetafactory.java
@@ -197,22 +197,20 @@ import static jdk.internal.org.objectweb.asm.Opcodes.*;
new PrivilegedAction<Constructor[]>() {
@Override
public Constructor[] run() {
- return innerClass.getDeclaredConstructors();
+ Constructor<?>[] ctrs = innerClass.getDeclaredConstructors();
+ if (ctrs.length == 1) {
+ // The lambda implementing inner class constructor is private, set
+ // it accessible (by us) before creating the constant sole instance
+ ctrs[0].setAccessible(true);
+ }
+ return ctrs;
}
- });
+ });
if (ctrs.length != 1) {
throw new LambdaConversionException("Expected one lambda constructor for "
+ innerClass.getCanonicalName() + ", got " + ctrs.length);
}
- // The lambda implementing inner class constructor is private, set
- // it accessible (by us) before creating the constant sole instance
- AccessController.doPrivileged(new PrivilegedAction<Void>() {
- @Override
- public Void run() {
- ctrs[0].setAccessible(true);
- return null;
- }
- });
+
try {
Object inst = ctrs[0].newInstance();
return new ConstantCallSite(MethodHandles.constant(samBase, inst));
@@ -222,6 +220,7 @@ import static jdk.internal.org.objectweb.asm.Opcodes.*;
}
} else {
try {
+ UNSAFE.ensureClassInitialized(innerClass);
return new ConstantCallSite(
MethodHandles.Lookup.IMPL_LOOKUP
.findStatic(innerClass, NAME_FACTORY, invokedType));