ASM (de ObjectWeb) não calcular MaxStack correctamente mesmo ClassWriter (COMPUTE_MAX + COMPUTE_STACK) está definido

StackOverflow https://stackoverflow.com/questions/2235493

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.

Foi útil?

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);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top