Warum übersetzt sich der folgende Code in eine neue + dup-Op-Anweisung in Java-Bytecode?

8

Sagen wir, ich habe eine Klasse Fraction :

%Vor%

Und das ist der Bytecode der obigen Methode:

%Vor%

Ich versuche zu verstehen, warum der Unterricht an Position 3 überhaupt dorthin gebracht wurde. Ich würde sagen, wir müssten nur Folgendes tun, damit es funktioniert:

%Vor%

Warum ist das nicht so?

    
devoured elysium 21.12.2011, 18:35
quelle

2 Antworten

10

Wenn der Bytecode für den Konstruktor gestartet wird, gibt es kein Fraction-Objekt. Der Befehl new weist dem Heap ein Objekt Fraction (nicht initialisiert) zu und hinterlässt auf dem Stapel einen Verweis darauf. Die Anweisung dup ist so, dass eine Referenz verwendet werden kann, um <init> und die zweite für areturn am Ende aufzurufen.

    
Ted Hopp 21.12.2011, 18:40
quelle
8

Ihr Bytecode ist falsch. Lassen Sie uns durchgehen:

%Vor%

Stack : Fraction instance (nicht initialisiert, nur ein Zeiger auf den Speicher)

%Vor%

Stapel : Fraction (noch nicht initialisiert), this

%Vor%

Stapel : Fraction (noch nicht initialisiert), this.den

%Vor%

Stack : Fraction (noch nicht initialisiert), this.den , this.num

%Vor%

Stapel :

Das ist entscheidend. Bei allen invoke -Methoden muss der Stapel this + alle Argumente enthalten. Sowohl this als auch Argumente werden vom Stapel genommen. Nach dem Aufruf wird nur ein Rückgabewert (falls vorhanden) auf den Stack gelegt. <init> hat einen void Rückgabetyp.

Das heißt, Sie rufen:

%Vor%

Auf einem leeren Stapel blenden Sie die JVM aus.

    
Tomasz Nurkiewicz 21.12.2011 18:45
quelle

Tags und Links