Почему следующий код преобразуется в новые инструкции + dup op в байт-коде Java?

Допустим, у меня есть класс Fraction :

class Fraction {
    ...

    /** Invert current fraction */
    public Fraction inverse() {
        return new Fraction(den,num);
    }

    ...
}

И вот каким оказывается байт-код вышеупомянутого метода:

 0 new #1 <xyzTestes/system/fraction/Fraction>
 3 dup
 4 aload_0
 5 getfield #16 <xyzTestes/system/fraction/Fraction.den>
 8 aload_0
 9 getfield #14 <xyzTestes/system/fraction/Fraction.num>
12 invokespecial #27 <xyzTestes/system/fraction/Fraction.<init>>
15 areturn

Я пытаюсь понять, почему инструкция в позиции 3 была помещена туда в первую очередь. Я бы сказал, что нам нужно сделать только следующее, чтобы это работало:

 new #1 <xyzTestes/system/fraction/Fraction>
 aload_0
 getfield #16 <xyzTestes/system/fraction/Fraction.den>
 aload_0
 getfield #14 <xyzTestes/system/fraction/Fraction.num>
 invokespecial #27 <xyzTestes/system/fraction/Fraction.<init>>
 areturn

Почему это не так?

8
задан devoured elysium 21 December 2011 в 18:35
поделиться