Digamos que tengo una clase Fraction
:¿Por qué el siguiente código se traduce en una nueva instrucción + dup op en bytecode java?
class Fraction {
...
/** Invert current fraction */
public Fraction inverse() {
return new Fraction(den,num);
}
...
}
Y esto es lo que el código de bytes del método anterior resulta ser:
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
Estoy tratando de entender por qué la instrucción en la posición 3 fue puesto allí en primer lugar. Yo diría que solo tendríamos que hacer lo siguiente para que funcione:
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
¿Por qué no es así?
invokespecial no pondrá una referencia a la Fracción en la pila, entonces? –
@devoured elysium '() V' devuelve' void' no 'Fraction'. –
Meh, tienes razón. –