2012-03-15 12 views
7

Estoy trabajando en una implementación de JVM amateur, y estoy tratando de asegurarme de tener cobertura de prueba para todos los códigos de operación en la especificación. Lo he reducido a los últimos, pero me han eludido nop y swap. Por ejemplo, he aquí una función simple que podría utilizar swap:¿Qué código Java forzará a javac 1.6 a usar los códigos de operación 'swap' y 'nop'?

static int do_swap() { 
    int a = 56; 
    int b = 32; 
    return b%a; 
} 

Pero el código de bytes producido por javac 1.6 evita el intercambio en lugar de almacenamiento local:

static int do_swap(); 
    Code: 
    0: bipush 56 
    2: istore_0 
    3: bipush 32 
    5: istore_1 
    6: iload_1 
    7: iload_0 
    8: irem 
    9: ireturn 

¿Alguna idea?

Respuesta

6

Ninguno. La Especificación del lenguaje Java no proporciona tales garantías. Puede escribir su propio código de bytes Java usando Jasmin (un ensamblador de código de bytes).

+1

Creo que el ensamblador de Krakatau sería más útil para generar casos de prueba de JVM, ya que admite características más oscuras del formato de archivo de clase que Jasmin no. (Divulgación lo escribí). Pero para algo simple como este, Jasmin es lo suficientemente bueno. – Antimony

Cuestiones relacionadas