ASM (de ObjectWeb) não calcular MaxStack correctamente mesmo ClassWriter (COMPUTE_MAX + COMPUTE_STACK) está definido
-
19-09-2019 - |
Pergunta
Estou ficando ClassVerifyErrors esperados ao tentar carregar uma classe i têm gerado usando ASM. Durante a inspeção que eu posso ver que a JVM está correto e que o método está falando tem um valor MAX_STACK inválido. A estranha coisa é estou usando a calcular auto pilha e opções locais máximo para que isso não deve ser um problema ... O método com a opção inválida é muito simples e ainda assim o resultado é ruim bytecode.
Eu escrevi uma classe com o método pretendido e comparados meu asm classe gerada contra o javac produz e os códigos de byte matchup com o único erro sendo a pilha máximo é 0, o que está errado, enquanto javac define um valor de 2.
Id como para evitar ter que calcular tha max pilha / locals mim mesmo.
Solução
Max pilha e cálculo variável pode produzir resultados errados se bytecode não é válido. Você pode verificar que, executando código gerado através do CheckClassAdapter.
Por exemplo,
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
// generate code into cw instance...
PrintWriter pw = new PrintWriter(System.out);
CheckClassAdapter.verify(new ClassReader(cw.toByteArray()), true, pw);