ASM (de ObjectWeb) no calcular correctamente aunque MaxStack ClassWriter (COMPUTE_MAX + COMPUTE_STACK) se establece

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

Pregunta

Me estoy haciendo ClassVerifyErrors esperados cuando se intenta cargar una clase que he generado mediante ASM. En una inspección posterior que puedo ver que la JVM es correcta y que el método está hablando tiene un valor no válido MAX_STACK. Lo extraño es que estoy usando el auto calcular la pila y las opciones locales máx así que esto no debería ser un problema ... El método con la opción no válida es muy simple y sin embargo el resultado es malo código de bytes.

He escrito una clase con el método previsto y se compara mi asm genera la clase en contra de lo javac produce y los códigos de bytes Enfrentamiento con ser el único error de la pila máximo es 0, lo que es malo, mientras que javac establece un valor de 2.

Id como para no tener que calcular tha pila max / locales mí mismo.

¿Fue útil?

Solución

pila Max y cálculo de la magnitud pueden producir resultados erróneos si el código de bytes no es válido. Puede comprobar que mediante la ejecución de código generado A través del CheckClassAdapter.

Por ejemplo,

  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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top