2010-05-02 11 views
1

J'ai utilisé SWIG pour lier un ensemble de classes à lua. Je sais que le C++ lui-même ne supporte pas les correctifs de singe, et je ne cherche pas à modifier mes objets C++, mais simplement leurs représentations lua. Le problème vient si je veux commencer à patcher les tableaux et objets LUA exportés par SWIG, afin que je puisse modifier l'API présentée du côté LUA.Lua + SWIG Monkey Patching

par exemple. le code lua suivant:

game.GetEnemies1 = game.GetEnemies2 

ne fonctionne pas comme prévu. Le comportement après cette ligne est toujours cohérent avec l'original GetEnemies1 et non GetEnemies2.

Comment puis-je lutter contre ce problème?

Répondre

1

J'ai réussi à monkeypatched lua userdata en ajoutant et en remplaçant des méthodes existantes. Cela impliquait de modifier leurs métabalises.

Here's a sample de ce que je devais faire afin d'ajouter quelques méthodes à un objet userdata existant.

Comme vous pouvez le voir, au lieu de modifier l'objet lui-même, j'ai dû modifier sa métatable.

Cette solution ne fonctionnera que si vos objets userdata sont configurés de manière à ce que leurs métadonnées se "pointent sur elles-mêmes": mt.__index = mt.

Cordialement!

0

Swig génère des wrappers lua à partir de fonctions C++, il n'injecte pas de fonctions lua en C++. Si GetEnemies1 est une fonction C++, appelée à partir d'autres fonctions C++, le patch singe ne fonctionnera pas.

Vous devrez réécrire votre code C++ pour que le code qui exécute GetEnemies1 recherche un type de rappel que vous pouvez enrouler avec swig.

+0

Je réalise que le remplacement de la méthode dans lua en utilisant le patch singe n'affectera que le code lua, et que le monkeypatching du C++ lui-même n'est pas possible, mais c'est mon intention. Il y a certaines méthodes C++ qui ressemblent au patch de singe à la fin de lua pour les rendre plus agréables, ou même simplement les renommer –