2012-03-15 12 views
7

pracuję nad amatorskim implementacji JVM, a ja staram się upewnić, mam pokrycie testowe dla wszystkich rozkazy w spec. Dostałam go do kilku ostatnich, ale nop i swap zostały wymyka mi. Na przykład, oto prosta funkcja, która może wykorzystać swap:Jaki kod Java wymusi na javac 1.6 używanie opcodes 'swap' i 'nop'?

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

Ale kodu bajtowego produkowane przez javac 1.6 unika zamiana zamiast lokalnego przechowywania:

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 

pomysłów?

Odpowiedz

6

Brak. Specyfikacja języka Java nie zapewnia takich gwarancji. Możesz po prostu napisać własny kod bajtowy Java, używając Jasmin (asemblera kodu bajtowego).

+1

myślę asembler Krakatau byłaby bardziej przydatna do generowania przypadków testowych JVM, ponieważ obsługuje więcej niejasnych cechy formatu classfile że Jasmin nie. (Ujawnienie to napisałem). Ale jeśli chodzi o coś prostszego, Jasmin jest wystarczająco dobry. – Antimony

Powiązane problemy