Contexte: CamelBones registres Perl classes avec l'Objective-C runtime.
Pour ce faire, chaque Perl méthode est enregistré avec le même IMP
fonction; cette fonction examine ses self
& _cmd
arguments pour trouver
qui Perl méthode à appeler.
Cela a fonctionné assez bien pour les plusieurs années, pour les messages qui ont été
distribué avec objc_msgSend
. Mais maintenant, je veux ajouter le support pour
de retour à virgule flottante et les grandes struct types de Perl méthodes.
Virgule flottante n'est pas difficile; je vais simplement écrire un autre IMP qui renvoie
double, pour gérer les messages envoyés avec objc_msgSend_fpret
.
La question est de savoir quoi faire à propos de l' objc_msgSend_stret
. La rédaction d'un
séparer IMP
pour chaque struct type de retour est impossible, pour
deux raisons: la Première, parce que même si je l'ai fait uniquement pour les types struct
qui sont connus au moment de la compilation, de l'absurdité d'un certain nombre de fonctions.
Et deuxièmement, parce que nous parlons d'un cadre qui peut être lié à l'encontre de tout arbitraire Objective-C Et du code Perl, nous ne savons tout le potentiel struct types lorsque le cadre est en cours d'élaboration.
Ce que je souhaite faire est d'écrire un seul IMP
qui peut gérer tout retour
type de expédiées via objc_msgSend_stret
. Pourrais-je écrire comme
de retour void
, et en prenant un argument pointeur vers un tampon de retour, comme
le vieux - objc_msgSend_stret
a été déclarée? Même si ce qui s'est passé à
le travail pour le moment, pourrais-je compter sur elle en continuant à travailler dans le futur?
Merci pour tous les conseils que j'ai cassé mon cerveau sur celui-ci. :-)
Mise à jour:
Voici les conseils que j'ai reçu de l'un de Apple exécution des ingénieurs, sur leur objc langue de la liste de diffusion:
Vous devez écrire le code d'assemblée pour la poignée ce cas.
Votre suggestion ne fonctionne pas sur certaines architectures, où ABI pour "fonction de retour void avec un pointeur vers un struct comme premier argument" diffère à partir de la fonction "renvoi d'une struct". (Sur i386, la structure de l'adresse est sauté à partir de la pile par l'appelant dans un cas, et par le destinataire de l'appel dans les autres cas.) C'est pourquoi le prototype pour
objc_msgSend_stret
a été changé.L'assemblée du code de capturer les struct adresse de retour, à passer en contrebande dans non-struct-retour C appel de fonction sans déranger le reste de la paramètres, puis de faire la bonne ABI spécifiques de nettoyage à la sortie (
ret $4
sur i386). Alternativement, l'assemblée code pouvez capturer toutes les les paramètres. Le transfert des machines fait quelque chose comme ça. Ce code peut-être en open-source CoreFoundation si vous voulez voir ce que les techniques ressembler.
Je vais laisser cette question ouverte, au cas où quelqu'un remue-méninges une meilleure idée, mais avec cette venue directement auprès d'Apple "runtime wrangler," je me dis que c'est probablement comme faisant autorité, une réponse que je suis susceptible d'obtenir. Temps de dépoussiérer le x86 manuels de référence et de frapper la rouille de mon assembleur-fu, je suppose...