web-dev-qa-db-fra.com

Compiler le code lua, stocker le bytecode puis le charger et l'exécuter

J'essaie de compiler un script lua qui appelle certaines fonctions exportées, d'enregistrer le bytecode résultant dans un fichier, puis de charger ce bytecode et de l'exécuter, mais je n'ai trouvé aucun exemple sur la façon de le faire. Existe-t-il un exemple sur la façon de procéder? Comment puis-je faire ceci?

Edit: j'utilise Lua + Luabind (C++)

36
WoLfulus

Tout cela est très simple.

Tout d'abord, vous chargez le script Lua sans l'exécuter. Peu importe que vous ayez connecté l'état Lua à vos fonctions exportées; vous ne faites que compiler le fichier script.

Vous pouvez utiliser luaL_loadfile, qui utilise les fonctions de bibliothèque standard C pour lire un fichier à partir du disque et le charger dans le lua_State. Vous pouvez également charger le fichier vous-même dans une chaîne et utiliser luaL_loadstring pour le charger dans le lua_State.

Ces deux fonctions émettront des valeurs de retour et des erreurs de compilation selon la documentation de lua_load .

Si la compilation a réussi, le lua_State a maintenant le morceau Lua compilé en tant que fonction Lua en haut de la pile. Pour obtenir le binaire compilé, vous devez utiliser le lua_dump fonction. C'est plutôt compliqué car il utilise une interface de rappel pour vous transmettre des données. Voir la documentation pour plus de détails .

Après ce processus, vous avez le code d'octet Lua compilé. Mettez-le dans un fichier de votre choix. N'oubliez pas: écrivez-le en binaire , pas avec traduction de texte.

Quand vient le temps de charger le code d'octet, il vous suffit de ... exactement ce que tu faisais avant. Enfin presque. Lua a une heuristique pour détecter qu'une "chaîne" qui lui est donnée est une chaîne source ou un code d'octet Lua. Alors oui, vous pouvez charger du code octet avec luaL_loadfile juste comme avant.

La différence est que vous ne pouvez pas utiliser luaL_loadstring avec code octet. Cette fonction attend une chaîne terminée par NULL, ce qui est mauvais. Le code d'octet peut contenir des caractères NULL, ce qui gâcherait tout. Donc, si vous voulez faire le fichier IO vous-même (parce que vous utilisez un système de fichiers spécial ou quelque chose), vous devez utiliser lua_load directement. Qui utilise également une interface de rappel comme lua_dump. Alors lisez comment l'utiliser .

58
Nicol Bolas