59 votes

Comment implémenter une fonction IMP renvoyant un type de structure volumineux déterminé au moment de l'exécution?

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...

5voto

Laurent Etiemble Points 17360

Il semble que la Pomme ingénieur est à droite: le seul chemin pour y aller est le code d'assemblée. Voici quelques pointeurs utiles pour la prise en main:

  • À partir de l'Objective-C runtime code: i386 et x86_64 fabriqués à la main messenger assmbly talons pour les différentes méthodes de la messagerie.
  • Une SORTE de réponse qui donne un aperçu de la répartition.
  • Un examen approfondi de la répartition mécanisme avec une, ligne par ligne, analyse de l'assemblée de code

Espérons que cela aide.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X