# HG changeset patch # User briangoetz # Date 1383065118 14400 # Node ID 9732816c9d17fc71e71536b8d2fe2e1c200580d5 # Parent 82ee370c3d7ea9d1032d78a9de7452c22dba9f28 8024633: Lambda linkage performance - initialize generated class earlier Reviewed-by: briangoetz, rfield Contributed-by: sergey.kuksenko@oracle.com diff -r 82ee370c3d7e -r 9732816c9d17 src/share/classes/java/lang/invoke/InnerClassLambdaMetafactory.java --- a/src/share/classes/java/lang/invoke/InnerClassLambdaMetafactory.java Thu Oct 31 10:37:08 2013 -0400 +++ b/src/share/classes/java/lang/invoke/InnerClassLambdaMetafactory.java Tue Oct 29 12:45:18 2013 -0400 @@ -197,22 +197,20 @@ new PrivilegedAction() { @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() { - @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 @@ } } else { try { + UNSAFE.ensureClassInitialized(innerClass); return new ConstantCallSite( MethodHandles.Lookup.IMPL_LOOKUP .findStatic(innerClass, NAME_FACTORY, invokedType));