ClassRemapper fails to transform Calcite 1.36.0 SqlFunctions
I'm sorry I can't minimize this issue further, I'm using asm via sbt-assembly to perform class shading on some of our libraries. When upgrading from calcite 1.35.0 to 1.36.0.
I noticed that class shading failed with:
java.lang.ArrayIndexOutOfBoundsException: Index 65536 out of bounds for length 297
at org.objectweb.asm.ClassReader.readLabel(ClassReader.java:2695)
at org.objectweb.asm.ClassReader.createLabel(ClassReader.java:2711)
I first reproduced the issue with Scala's fork of jarjar: https://github.com/eed3si9n/jarjar-abrams/pull/45
But then I noticed that it's most likely a asm bug and made more minimization to limit myself to asm: https://github.com/MasseGuillaume/asm-remapper-bug
In the issue template, you mention CheckClassAdapter
, I gave it a shot and it's indeed an error with labels:
java.lang.IllegalArgumentException: Invalid end label (must be visited first)
at org.objectweb.asm.util.CheckMethodAdapter.checkLabel(CheckMethodAdapter.java:1453)
at org.objectweb.asm.util.CheckMethodAdapter.visitLocalVariableAnnotation(CheckMethodAdapter.java:996)
at org.objectweb.asm.MethodVisitor.visitLocalVariableAnnotation(MethodVisitor.java:757)
at org.objectweb.asm.commons.MethodRemapper.visitLocalVariableAnnotation(MethodRemapper.java:257)
at org.objectweb.asm.ClassReader.readCode(ClassReader.java:2614)
at org.objectweb.asm.ClassReader.readMethod(ClassReader.java:1515)
at org.objectweb.asm.ClassReader.accept(ClassReader.java:745)
at org.objectweb.asm.ClassReader.accept(ClassReader.java:425)
at remapper.bug.RemapperTest.remapper(RemapperTest.java:42)
I don't think it's because of how I use asm (maybe I'm wrong):
byte[] bytecode = Files.readAllBytes(Paths.get("../SqlFunctions.class"));
Remapper remapper = new Remapper() {};
ClassReader classReader = new ClassReader(bytecode);
ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_MAXS);
ClassVisitor classVisitor = new CheckClassAdapter(classWriter);
ClassRemapper classRemapper = new ClassRemapper(classVisitor, remapper);
classReader.accept(classRemapper, ClassReader.EXPAND_FRAMES);
byte[] outputBytecode = classWriter.toByteArray();
ClassReader classReader2 = new ClassReader(outputBytecode);
ClassWriter classWriter2 = new ClassWriter(ClassWriter.COMPUTE_MAXS);
ClassVisitor visitor = new ClassVisitor(Opcodes.ASM9, classWriter2) {};
classReader2.accept(visitor, ClassReader.EXPAND_FRAMES);