ASM 5: al inicializar un ClassWriter, ¿cuál es la diferencia entre COMPUTE_MAXS y COMPUTE_FRAMES?

Soy el mantenedor de grappa . Este paquete genera analizadores en tiempo de ejecución a partir de código Java mediante el uso de ASM para generar una clase que amplía su clase de analizador.

Ya migré de ASM 4 a ASM 5, y de generar el código de bytes JVM 1.5 a generar el código de bytes JVM 1.6, y ahora solo he logrado que genere el código de bytes JVM 1.7 ... excepto que no tengo idea de por qué esto funciona.

Básicamente, hice lo siguiente:

  • Cambiar el argumento a los constructores ClassWriter; antes de eso era new ClassWriter(ClassWriter.COMPUTE_MAXS), y ahora esnew ClassWriter(ClassWriter.COMPUTE_FRAMES)
  • Cambiar el primer argumento de cada llamada al .visit()método de Opcodes.V1_6a Opcodes.V1_7.

Ahora, por qué no entiendo por qué funciona por dos razones:

  • Tengo varias llamadas a MethodVisitors que dicen:

    mv.visitMaxs(0, 0); // trigger automatic computing
    

    ¿Eso significa que estas instrucciones se pueden eliminar?

  • Al principio solo intenté y agregué el COMPUTE_FRAMESargumento a los ClassWriterconstructores, pero falló en un punto para una de mis pruebas en las que declaro:

    static class TestJoinParser
        extends EventBusParser<Object>
    {
        protected final JoinMatcherBuilder builder
            = join('a').using('b');
    }
    

    Y el error fue:

    java.lang.ClassFormatError: Arguments can't fit into locals
    

    Dado que es un campo de instancia, supongo que tiene que ver con ese argumento particular que se inicializa en el constructor.

De todos modos, todas mis pruebas ahora funcionan, estoy en el proceso de probar pruebas más pesadas, etc. Pero como mi objetivo es ir más lejos, me gustaría entender al menos un poco por qué mis modificaciones funcionaron en absoluto ... .

Respuesta 1

Me preguntaba sobre una cosa que ayer me vino a la mente. Pido disculpas de antemano por el título engañoso, pero realmente no sé cómo titularlo. Bueno, supongamos que somos dos objetos ObjA ...

Intentaba incluir bibliotecas nativas en un archivo jar. Aunque encontré cómo debería hacerse, hay algo que falta. Este es el archivo de manifiesto. Versión Manifiesto: 1.0 Clase-Ruta:. ...

Estoy tratando de convertir Joda LocalDate a Joda LocalDateTime, para eso estoy usando el método toLocalDateTime (LocalTime.MIDNIGHT), a partir de ahora funciona bien, por ejemplo: para el joda Localdate dado ...

Tengo un código que no se pudo compilar con JDK 7 pero logró compilar con JDK 8. Para resumir el código real: la interfaz A {...} clase B implementa A {...} público vacío AAA (Lista <A> lista) {....