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 gestiti:L'istruzione JVM ALOAD_0 nel metodo 'main' punta a 'args' invece di 'this'?
class Main {
public static void main(String[] args) {
System.out.println(args.length);
}
}
Poi ho costruito, e corsi 'Main.class' attraverso un on-line disassembler ho trovato su: http://www.cs.cornell.edu/People/egs/kimera/disassembler.html
ottengo la seguente implementazione per il metodo 'main': (l'uscita è smontato in 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
si suppone spingere 'questo' al pacco (questo è ciò che le specifiche JVM sembra dire)
2. arraylength
dovrebbe restituire la lunghezza della matrice cui riferimento è sulla parte superiore dello stack
Quindi secondo me la combinazione di 1 & 2 non dovrebbe nemmeno funzionare.
Come/perché funziona? Oppure il disassemblatore è buggato e il codice byte attuale è un'altra cosa?
+1. this.foo (x, y) è veramente Foo.foo (this, x, y) – grinch
Questo vale per i metodi statici * all *? –
@ dohaqatar7 Sì. –