Comment vider fonction lua morceau de ficelle?
Comment vider fonction lua morceau de ficelle ?
function test(a, b)
local c = a + b
return c
end
print( type(test) ) --> function
print( test ) --> function: 0053B108
print( dumpToString(test) )
Je souhaite dumpToString résultat est le suivant:
function test(a, b)
local c = a + b
return c
end
Comment faire ?
=== update1 ===
Je veux connecter automatiquement et injecter du code.
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas de réponse simple (après toutes ces années, toujours). Je vais élaborer sur les alternatives.
1 Prof. de l'archéologie de la réponse (et un peu de démontage):
La réponse à cette question très ancienne, se trouve à l'intérieur primodial un. À savoir, luadec. Il est probable qu'à l'époque c'était dans les temps d'arrêt, mais au moins maintenant, il y a un version mise à jour, qui gère lua 5.1-.3.
En outre, la
string.dump
fournit pas un charabia complet, il donne un code de programme en raw octets d'instructions machine, vous pouvez voir une meilleure représentation des personnes avecluac -l -p <filename>
.Vm codes ne sont pas bien documentés, mais les gens ne mettre quelque chose ensemble ici. Luajit a un peu plus de documentation sur son propre jeu d'instructions.
La reconstruction de code à partir de vm instructions est ce que luadec n'. En théorie, on pourrait aussi épissure vos propres instructions à droite dans la chaîne de sous-évaluées.
Cependant, quelle que soit la tour vous faire pour bytecode, il fera l'expérience d'incompatibilités entre les différents interprètes, y compris les différentes versions de lua lui-même.
2. En train de faire X
Fonction de conversion d'une chaîne de caractères est un peu particulière désir (sauf si vous faites de la génération de code, auquel cas vous avez déjà la chaîne en premier lieu).
Le "journal et injecter du code" est en effet tout à fait général X, ce qui peut justifier l'Y résoudre. Mais d'autres cas peuvent être couverts par un seul des mesures.
Lua est très flexible de la langue, et par exemple, vous pouvez tracer le flux de la valeur
x
dans l'exemple en en faisant un objet:Comme dans l'exemple ci-dessus, vous pouvez injecter le comportement en modifiant l'environnement de la fonction. À savoir, là, j'ai redéfini la fonction globale
tonumber
. Vous pourriez complètement pack de la fonction dans l'environnement différent:Pour les versions plus anciennes que vous avez à gérer des valeurs amont qui peuvent avoir des références à des fonctions globales vous essayez de redéfinir. Pour les versions plus récentes, vous aurez à gérer les valeurs amont qui serait perdue pendant le vidage du processus de chargement.
3. La lecture de fichiers
Enfin, comme d'autres ont dit, si vous avez accès au code source, vous pouvez essayer de trouver la définition de la fonction de cela. Sauf si c'est une seule définition de la fonction ou retour simple fichier de la tâche pourrait être équivalent à la re-mise en œuvre de la lua analyseur. Il n'y a plus qu'un seul de ceux-ci, mais ils n'ont pas été fait avec une telle fonctionnalité à l'esprit de sorte qu'il pourrait prendre un certain travail de recycler leur code.
Si toutes les fonctions sont définies par vous-même et vous êtes prêt à retenir-vous un peu, vous pouvez utiliser lua metatables de nouveau, de résoudre le problème au cours de l'étape de codage:
La définition des valeurs amont va être difficile, cependant.
Vous ne dites pas pourquoi vous voulez le faire, ce qui peut être important. Vous pouvez vider d'une fonction à une chaîne, il a juste ne sera pas très lisible chaîne; vous pouvez stocker et de transmettre votre fonction de cette manière (entre compatible Lua moteurs):
Vous n'avez pas. Lua ne stocke pas compilé de script Lua en tant que texte brut n'importe où. Et, puisqu'il est destiné à être un petit langage de script, il ne fournit pas un mécanisme de décompiler son propre bytecode.
require
,load
etloadfile
fonctions (pour les fonctions créées dynamiquement pendant l'exécution du programme). Cependant, la mise en œuvre de cette idée est peut-être pas si simple.dofile
dans votre liste de fonctions. Aussi, il ne fonctionne pas si le code source est pré-compilé. Donc, non, cette méthode ne fonctionne pas en général. En bref, vous ne pouvez pas.dofile
. Mais je suis en désaccord avec vous à la question principale. Veuillez noter que l'OP n'a pas demandé "ne Lua se charge lui-même de ces choses?". La question était "Comment faire?", qui implique des efforts de programmation. Votre réponse semble être trop pessimiste pour un outil aussi puissant que Lua.bien, vous pouvez stocker vos plusieurs lignes de code dans une seule variable de chaîne. Simplement utiliser des doubles crochets à la place des guillemets.
Vous pouvez obtenir le code source de votre programme en
et de l'analyser pour trouver votre définition de la fonction.
Il ne fonctionne que lors de l'exécution de lua en ligne de commande et en le passant à la source de fichier en paramètre, pas un fichier bytecode.