Comment compiler un appel de méthode avec adressage indirect en XVM ?
Savoir compiler un appel de méthode dynamique en code XVM en utilisant la séquence d'adressage indirect via la vtable.
Savoir compiler un appel de méthode dynamique en code XVM en utilisant la séquence d'adressage indirect via la vtable.
La compilation de x.m() nécessite deux indirections : lire le premier mot de x pour obtenir l'adresse de la vtable, puis lire la vtable à l'offset num(Classe, m) pour obtenir l'adresse du code.
FETCH(0) — une copie servira d'argument this, l'autre à lire la vtable.READ, pousher l'offset de la méthode avec PUSH(num(Classe, m)), puis lire l'adresse du code de la méthode avec CREAD.GSB, effacer l'argument this de la pile avec POP, puis récupérer le résultat avec PRX (si la méthode renvoie une valeur).Compiler l'appel p.s() où p est un Point et s est la méthode numéro 0 de Point.
FETCH(0) — une copie servira d'argument this, l'autre à lire la vtable.Empiler l'adresse de p et la dupliquer (une copie = this, l'autre = pour la vtable).
// Java source :
int resultat = p.s();
// XVM compilé :
// p : évalue p et place son adresse en haut de pile
// FETCH(0) : copie le mot 0 (= ptr vtable) en haut, laisse l'adresse de p en dessous
READ, pousher l'offset de la méthode avec PUSH(num(Classe, m)), puis lire l'adresse du code de la méthode avec CREAD.Lire la vtable, pousher l'offset 0 (méthode s), lire l'adresse du code.
// READ : remplace l'adresse de la vtable par le contenu → adresse de la vtable
// PUSH(0) : offset de s (num(Point,s) = 0)
// CREAD : lit vtable[0] → adr(Point,s)
GSB, effacer l'argument this de la pile avec POP, puis récupérer le résultat avec PRX (si la méthode renvoie une valeur).Appeler, nettoyer la pile, récupérer le résultat.
// Séquence complète XVM pour p.s() :
// p FETCH(0) READ PUSH(0) CREAD GSB POP PRX
//
// Pile avant GSB : [adr(Point,s)] [adr(p)] ...
// GSB : saute au code de s(), this=adr(p)
// POP : enlève adr(p) (argument this)
// PRX : copie le résultat (x+y) sur la pile
p.s() → p FETCH(0) READ PUSH(0) CREAD GSB POP PRX
Compiler l'appel p.d() où d est la méthode numéro 1 de Point. Comparer avec p.s().
Compiler l'appel p.f(e) où f est la méthode numéro 0 de ExMeth, qui prend un argument int en plus de this.
Crée ton compte gratuit pour accéder à la fiche et aux exercices