Suivez la dixième loi de Greenspun et vous êtes prêt à partir: il suffit d'implémenter une implémentation ad hoc, spécifiée de manière informelle, avec des bugs et lente, de la moitié de Common Lisp. Choisissez une moitié qui prend en charge la mise en œuvre de la réflexion. :)
Ou, voici une idée:
Allumez les fichiers de carte (et éventuellement génération d'assemblage) dans votre construction. Implémentez une application qui génère du code pour créer une bibliothèque dynamique. Vous devriez être en mesure d'obtenir toutes les informations statiques (noms de méthodes, paramètres, types, etc.) sur les classes de la source ou de l'un des artefacts de construction. En utilisant la carte ou l'assemblage, vous devriez pouvoir trouver des adresses de fonction, des décalages de pointeur de fonction virtuelle, des adresses de variables globales, des décalages de variables, des informations sur des variables allouées de pile et de registre, etc. A partir de cette information, construisez une bibliothèque contenant les appels pour obtenir toutes ces informations en passant des noms de type, des pointeurs, des noms de fonctions, etc ...
Maintenant, en C++, écrivez une bibliothèque contenant des fonctions et des macros qui vous permettent de mettre des ID uniques qui vont Compilez le code pour identifier les démarrages de fonctions, tous les appels de réflexion, les décalages EIP sur les appels de réflexion, etc. Utilisez des macros d'assemblage en ligne à des emplacements appropriés qui vous laissent des instructions si nécessaire. ID. En outre, fournissez des fonctions de bibliothèque de pont qui permettront à la fonctionnalité de réflexion de gérer ce qu'elle peut contenir (par exemple, obtenir l'adresse d'une fonction) plutôt que d'appeler la bibliothèque dynamique construite dans l'étape de post-construction.
Enfin, écrivez un éditeur de liens de post-publication. Je suggère "kniltsoPostlink" mais c'est à vous de décider. Dans cette étape, recherchez vos ID uniques (ai-je mentionné pour faciliter la tâche, vous devriez probablement créer les identifiants GUID pour pouvoir les rechercher dans le binaire?) Et, partout où l'ID marque un appel de réflexion vers une fonction, ou un la définition d'une classe, etc., placez suffisamment de données là (dans un format que vous pouvez facilement déterminer juste à temps lorsque vous écrivez la bibliothèque de réflecteurs) puis dans l'ID avant un appel à la bibliothèque de réflecteurs, réécrivez l'appel de sorte que il tire les paramètres dont il a besoin de ces bits de données, ou il suffit de mettre les bits de données là, si applicable, je ne peux pas savoir à l'avance, mais comme vous l'écrivez, ces petits détails apparaîtront à vous.De toute façon, je sais que je n'ai pas donné beaucoup de code, et j'ai l'intention de commencer un projet là-dessus à un moment donné, quand j'aurai assez de temps libre. Je veux dire, chaque petite partie devrait être très simple, alors que vous le faites progressivement, chaque petit morceau devrait devenir clair aussi longtemps que vous suivez les directives énoncées ici. Il est possible qu'une partie soit encore plus simple que ce que j'ai décrit ici, parce que c'était le pire des cas. Vous pouvez même partir sans avoir à réécrire du code pour les appels du réflecteur. le simple fait de placer les données dans les emplacements appropriés peut permettre à la bibliothèque de tirer ces bits comme elle en a besoin sans plus d'informations.
Je suis très content que vous ayez demandé; Je suis très occupé en ce moment, mais si vous obtenez une nuit gratuite, j'imagine que ce sera un bon début pour une première version, et je serai heureux de vous présenter dès que possible.
;)
Cela ne coûtera-t-il pas plus cher que RTTI, alors qu'est-ce que cela va faire? – Mark
Dur. Vous ne pouvez pas rassembler le compilateur pour générer les métadonnées dont vous avez besoin à partir du code source. RTTI est nettement insuffisant. Vous devrez écrire votre propre analyseur de langage C++. Cela a été fait ... –
@nobugz: Bien sûr, les gens ont écrit leurs propres analyseurs C++. C'est très loin d'être trivial. C++ est, très simplement, une vraie peine à analyser. –