# HG changeset patch # User redestad # Date 1527684388 -7200 # Node ID 02934b0d661b82b7fe1052a04998d2091352e08d # Parent d5331b94f821509140368c168cb910578ef67fc3 8203886: Invoke LambdaMetafactory::altMetafactory exactly from the BootstrapMethodInvoker Reviewed-by: mchung diff -r d5331b94f821 -r 02934b0d661b src/java.base/share/classes/java/lang/invoke/BootstrapMethodInvoker.java --- a/src/java.base/share/classes/java/lang/invoke/BootstrapMethodInvoker.java Wed May 30 11:39:26 2018 +0200 +++ b/src/java.base/share/classes/java/lang/invoke/BootstrapMethodInvoker.java Wed May 30 14:46:28 2018 +0200 @@ -134,6 +134,8 @@ String recipe = (String)argv[0]; Object[] shiftedArgs = Arrays.copyOfRange(argv, 1, argv.length); result = (CallSite)bootstrapMethod.invokeExact(caller, name, (MethodType)type, recipe, shiftedArgs); + } else if (isLambdaMetafactoryAltMetafactoryBSM(bsmType)) { + result = (CallSite)bootstrapMethod.invokeExact(caller, name, (MethodType)type, argv); } else { switch (argv.length) { case 0: @@ -286,6 +288,9 @@ private static final MethodType LMF_INDY_MT = MethodType.methodType(CallSite.class, Lookup.class, String.class, MethodType.class, MethodType.class, MethodHandle.class, MethodType.class); + private static final MethodType LMF_ALT_MT = MethodType.methodType(CallSite.class, + Lookup.class, String.class, MethodType.class, Object[].class); + private static final MethodType LMF_CONDY_MT = MethodType.methodType(Object.class, Lookup.class, String.class, Class.class, MethodType.class, MethodHandle.class, MethodType.class); @@ -319,6 +324,15 @@ return bsmType == LMF_INDY_MT; } + /** + * @return true iff the BSM method type exactly matches + * {@see java.lang.invoke.LambdaMetafactory#altMetafactory( + * MethodHandles.Lookup,String,MethodType,Object[])} + */ + private static boolean isLambdaMetafactoryAltMetafactoryBSM(MethodType bsmType) { + return bsmType == LMF_ALT_MT; + } + /** The JVM produces java.lang.Integer values to box * CONSTANT_Integer boxes but does not intern them. * Let's intern them. This is slightly wrong for