de instrucciones JVM ALOAD_0 en los 'principales' puntos método para 'args' en lugar de 'esto'?

StackOverflow https://stackoverflow.com/questions/4641416

Pregunta

Estoy tratando de implementar un subconjunto de Java para un estudio académico. Bien, estoy en las últimas etapas (generación de código) y escribí un programa muy simple para ver cómo se manejan argumentos del método:

class Main {
    public static void main(String[] args) {
        System.out.println(args.length);
    }
}

Entonces me lo construyó, y corrió 'Main.class' a través de un desensamblador en línea que encontré en: http://www.cs.cornell.edu/People/egs/kimera /disassembler.html

Me sale el siguiente implementación para el método 'principal': (La salida desmontada está en Jasmin)

.method public static main([Ljava/lang/String;)V
    .limit locals 1
    .limit stack 2

    getstatic   java/lang/System/out Ljava/io/PrintStream;
    aload_0
    arraylength
    invokevirtual   java/io/PrintStream.println(I)V
    return
.end method

Mi problema con esto es:
1. aload_0 se supone que empuje 'esto' en la pila (eso es lo que parece a la especificación JVM dicen)
2. arraylength se supone que devolver la longitud de la matriz cuya referencia está en la parte superior-de-pila

Así que en mi opinión la combinación de 1 y 2 deberían ni siquiera trabajo.

¿Cómo / por qué está funcionando? O es el buggy desensamblador y el código de bytes real es algo más?

¿Fue útil?

Solución

aload_0 se supone que empujar 'esto' en la pila

No del todo ... aload_0 lee el primer argumento de referencia (o, más en general, la primera variable de referencia local) del método y lo empuja en la pila.

En funciones miembro, la primera variable local pasa a ser la referencia this.

Pero main no es una función miembro, que es un estática función de lo que no hay argumento this, y el verdadero primer argumento del método es args.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top