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 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.
Cherche chaque exercice au brouillon, puis coche “valider” si tu as trouvé la bonne démarche. Utilise le bouton aide si tu as besoin d'un coup de pouce.
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; } }.