On Thu, 13 Oct 2022 21:53:47 GMT, Ioi Lam <ik...@openjdk.org> wrote:

> Please review this small optimization. As shown in the JBS issue, most of the 
> generated LambdaForm classes have a single ClassData, so we can get a small 
> footprint/speed improvement.

src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java line 
321:

> 319:     private MemberName loadMethod(byte[] classFile) {
> 320:         Class<?> invokerClass = LOOKUP.makeHiddenClassDefiner(className, 
> classFile, Set.of())
> 321:                                       .defineClass(true, 
> classDataValues());

Why not just put it in `classDataValues()` instead?


    Object classDataValues() {
        final List<ClassData> cd = classData;
        return switch(cd.size()) {
            case 0 -> null; // flatten for zero case
            case 1 -> cd.get(0).value; // flatten for single value case
            case 2 -> List.of(cd.get(0).value, cd.get(1).value);
            ...


And it also covers zero case for free.

src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java line 
389:

> 387:         mv.visitMethodInsn(Opcodes.INVOKESTATIC, 
> "java/lang/invoke/MethodHandles",
> 388:                            "classData", 
> "(Ljava/lang/Class;)Ljava/lang/Object;", false);
> 389:         if (classData.size() == 1) {

if (classData.size() < 2) {

It works for zero case, because `checkcast` always succeeds on nulls.

-------------

PR: https://git.openjdk.org/jdk/pull/10706

Reply via email to