istruzioni JVM ALOAD_0 nei 'principali' metodo punta a 'args' invece di 'questo'?
-
09-10-2019 - |
Domanda
Sto cercando di implementare un sottoinsieme di Java per uno studio accademico. Beh, sono nelle ultime fasi (la generazione di codice) e ho scritto un programma piuttosto semplice per vedere come metodo argomenti vengono trattati:
class Main {
public static void main(String[] args) {
System.out.println(args.length);
}
}
Poi ho costruito, e corse 'Main.class' attraverso un disassembler on-line ho trovato su: http://www.cs.cornell.edu/People/egs/kimera /disassembler.html
ottengo il seguente implementazione per il metodo 'main': (L'uscita smontato è 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
Il mio problema è:
1. aload_0
dovrebbe spingere 'questo' al catasta (questo è ciò che la JVM spec sembra dire)
2. arraylength
deve restituire la lunghezza della matrice cui riferimento è sulla parte superiore dello stack
Quindi, secondo me la combinazione di 1 e 2 non dovrebbe nemmeno lavoro.
come / perché sta funzionando? O è il passeggino disassemblatore e il bytecode reale è un'altra cosa?
Soluzione
aload_0 è supposto per spingere 'questo' al catasta ??p>
Non proprio ... aload_0
legge il Il primo argomento di riferimento (o, più in generale, la prima variabile di riferimento locale) del metodo e lo spinge nello stack.
In funzioni membro, la prima variabile locale sembra essere il riferimento this
.
Ma main
non è una funzione membro, si tratta di un static funzione in modo non v'è alcun argomento this
, e il vero primo argomento del metodo è args
.