Aller au contenu
EN FR

Invocation et exécution ABI

Statut documentaire : reference — voir Maturité et preuves.

Identité d'invocation

Chaque membre appelable possède une identité stable :

(moduleId, typeId, methodId, callKind)

callKind distingue constructeur, statique et instance. Le descripteur indique aussi séparément si un receiver est requis.

Pipeline d'exécution

flowchart LR
    DESC[Descripteur de méthode] --> VALIDATE[Valider receiver et arité]
    ARGS[Valeurs ABI typées] --> PACK[Construire le record d'arguments]
    PACK --> CALL[Invoquer le module natif]
    DESC --> CALL
    CALL --> CODE[Vérifier le code résultat]
    CODE --> DECODE[Décoder le résultat]
    DECODE --> OWN[Conserver l'ownership]

Le caller ne construit pas manuellement une structure C. Le packing est piloté par le descripteur chargé depuis le manifeste.

Règles de receiver

Un membre qui exige un receiver échoue si le handle manque ; un membre qui n'en accepte pas échoue si un handle est fourni. Cela évite de faire traverser à la frontière native une confusion constructeur/statique/instance.

Arité et layout

Le builder vérifie le nombre d'arguments, la cohérence du nombre de paramètres, la taille du record, les offsets et tailles, la direction supportée, le type de valeur et la taille des pointeurs. Le buffer est initialisé à zéro avant écriture.

Résultats natifs

Le chemin générique actuellement certifié gère void, i32, pointeur et handle. Un code module non réussi devient une erreur d'exécution enrichie du texte d'erreur du module lorsqu'il est disponible.

Libération après exécution

Le décodage conserve les informations d'ownership. Un handle retourné transporte les métadonnées nécessaires pour savoir s'il doit ensuite être libéré via le module.

Chemin testé de bout en bout

Les tests actuels compilent des expressions FPL en invocations ABI puis exécutent :

expression source
 -> résolution ABI
 -> descripteur manifeste
 -> buffer d'arguments
 -> module natif
 -> valeur FPL décodée

Les scénarios couvrent constructeur, appel d'instance, retour de pointeur et release explicite d'un handle possédé.