2012-03-15 6 views
7

Sto lavorando a un'implementazione JVM amatoriale, e sto cercando di assicurarmi di avere una copertura di test per tutti gli opcode nelle specifiche. L'ho raggiunto fino all'ultimo, ma lo nop e lo swap mi hanno eluso. Ad esempio, ecco una semplice funzione che potrebbe utilizzare swap:Quale codice Java imporrà a javac 1.6 di utilizzare gli opcodi 'swap' e 'nop'?

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

Ma il bytecode prodotto da javac 1.6 evita scambiando in luogo di memoria locale:

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 

Tutte le idee?

risposta

6

Nessuno. La specifica del linguaggio Java non fornisce tali garanzie. Puoi semplicemente scrivere il tuo bytecode Java usando Jasmin (un assemblatore bytecode).

+1

Penso che l'assemblatore Krakatau sarebbe più utile per generare casi di test JVM, dal momento che supporta funzioni più oscure del formato file di classe che Jasmin non ha. (Divulgazione l'ho scritto). Ma per qualcosa di semplice come questo, Jasmin è abbastanza buono. – Antimony

Problemi correlati