Comment compiler un constructeur de classe en XVM ?
Compiler un constructeur de classe : allouer le bloc de l'objet dans le tas et initialiser ses champs.
Compiler new Point(3, 7) pour la classe Point { int x; int y; Point(int x, int y){ this.x=x; this.y=y; } }.
Compiler un constructeur de classe : allouer le bloc de l'objet dans le tas et initialiser ses champs.
Le constructeur démarre par ALLOC(n+1) pour créer le bloc (n = nb champs). L'adresse (this) est stockée dans R. Chaque champ est initialisé par CWRITE à son offset. L'adresse est retournée en sommet de pile.
Compiler new Point(3, 7) pour la classe Point { int x; int y; Point(int x, int y){ this.x=x; this.y=y; } }.
Allouer le bloc de 3 mots (2 champs + 1 réservé) et sauvegarder l'adresse :
PUSH(3) -- pile : [3] (2 champs + 1 mot réservé)
ALLOC -- pile : [addr] (adresse du nouvel objet)
PXR -- R <- addr ; pile : [] (R joue le rôle de this)
Initialiser chaque champ (x ← 3, y ← 7) puis retourner l'adresse :
PUSH(3) -- pile : [3] (valeur de x)
PRX -- pile : [3, addr]
PUSH(1) -- pile : [1, addr, 3] (num(x) = 1)
CWRITE -- mem(addr+1) <- 3 ; pile : []
PUSH(7) -- pile : [7] (valeur de y)
PRX -- pile : [7, addr]
PUSH(2) -- pile : [2, addr, 7] (num(y) = 2)
CWRITE -- mem(addr+2) <- 7 ; pile : []
PRX -- pile : [addr] (retourner l'adresse du Point)
L'adresse du nouveau Point(3,7) est en haut de pile. Le tas contient [réservé, 3, 7] au bloc addr.
Compiler new Personne(25, 180) pour la classe Personne { int age; int taille; Personne(int a, int t){ this.age=a; this.taille=t; } }.
Compiler new Rectangle(10, 5, 0) pour la classe Rectangle { int largeur; int hauteur; int couleur; Rectangle(int l, int h, int c){ this.largeur=l; this.hauteur=h; this.couleur=c; } }.
Crée ton compte pour accéder à la fiche et aux exercices