Der Zugriff auf den Körper einer Funktion mit Lua
Werde ich Sie zurück zu den Grundlagen hier, aber in Lua, können Sie eine Tabelle definieren, zum Beispiel so:
myTable = {}
myTable [1] = 12
Drucken Sie die Tabelle auf sich selbst zurück bringt einen Zeiger darauf. Für den Zugriff auf die Elemente, die Sie brauchen, um einen index angeben (also genau wie ein array)
print(myTable ) --prints pointer
print(myTable[1]) --prints 12
Nun Funktionen sind eine andere Geschichte. Sie können definieren und drucken Sie eine Funktion etwa so:
myFunc = function() local x = 14 end --Defined function
print(myFunc) --Printed pointer to function
Gibt es eine Möglichkeit, den Körper von einer definierten Funktion. Ich bin versucht, zusammen eine kleine code visualizer und würde gerne zum 'Samen' eine gegebene Funktion mit speziellen Funktionen/Variablen zu erlauben, einen visualizer zu 'Haken' sich selbst in den code, die ich brauchen würde, um in der Lage sein, um die Funktion neu definieren, entweder aus einer variable oder eine Zeichenfolge.
- halten Sie im Verstand eine Funktion in lua nicht wirklich definiert werden müssen, mit einem Namen, weil Sie die erste Klasse und kann übergeben werden, um. Sie können auch anonyme Funktionen, die zurückgegeben werden, indem eine andere Funktion (siehe Verschlüsse - lua.org/pil/6.1.html )
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es keinen Weg, um Zugang zu Körper-Quellcode der Funktion in plain Lua. Source code weggeworfen wird nach der Kompilierung zu Bytecode.
Hinweis BTW, die Funktion kann definiert werden, in run-time mit loadstring-wie facility.
Teil-Lösungen möglich sind — je nachdem, was Sie wirklich erreichen wollen.
Können Sie get source code-position von der debug-Bibliothek — wenn die debug-Bibliothek aktiviert ist und die debug-Symbole nicht entfernt bytecode. Danach können Sie laden aktuellen source-Datei und extrahieren code von dort.
Können Sie schmücken die Funktionen, die Sie interessiert sind, manuell mit den benötigten Metadaten. Beachten Sie, dass Funktionen, die in Lua sind gültige Tabelle Schlüssel, so können Sie eine Funktion erstellen-zu-Metadaten-Tabelle. Würden Sie wollen, um diese Tabelle schwachen-kodiert, also es würde nicht verhindern, dass Funktionen erfasst werden, die von GC.
Wenn Sie brauchen eine Lösung für die Analyse von Lua-code, werfen Sie einen Blick auf Metalua.
Verwendung des debug-Bibliothek wird Ihre Wette nur. Mit diesem kann man entweder den string (wenn die Funktion definiert ist, in einem Stück geladen wurde, mit "loadstring") oder der name der Datei, in der die Funktion definiert wurde; zusammen mit den line-Nummern, bei denen die definition der Funktion beginnt und endet. Finden Sie die Dokumentation.
Hier an meinem aktuellen job, den wir haben gepatcht Lua, so dass es gibt Ihnen auch die Spaltennummer für Beginn und Ende der Funktion, so können Sie die Funktion Quelle benutzen. Der patch ist nicht sehr schwer zu reproduzieren, aber ich glaube nicht, ich werde erlaubt sein, es hier zu posten 🙁
Check-out Lua Introspektive Einrichtungen in die debugging-library.
Bereich würden Sie wollen, ist func, denke ich.
Sie können dies erreichen, indem eine Umgebung für jede Funktion (siehe setfenv) und der Verwendung von globalen (und lokalen) Variablen. Variablen in der Funktion würde dann erscheinen in der Umgebung-Tabelle, nach der die Funktion ausgeführt wird.
Alternativ nutzen Sie die Debug-Bibliothek:
Wäre es wahrscheinlich mehr nützlich für Sie zum abrufen der lokalen Variablen mit einem hook-Funktion anstatt explizit debug-Modus eingeben, (d.h. das hinzufügen der debug.debug () - Aufruf)
Gibt es auch eine Debug-Schnittstelle in die Lua-API in C.