2016-05-18 4 views
2

Ich versuche, einen Weg zu finden, alle Funktionen in einem Lua-Skript zu erhalten. Dieses Skript wurde über loadfile zu einer Funktion kompiliert. Zum Beispiel möchte ich jede Funktion im unten stehenden Skript definieren.Alle Funktionen in einem Lua-Skript

function example1() 

end 

local function example2() 

end 

local library = {} 

function library:example3() 

end 

(function() 
    -- Functions like this too. 
end) 

Die Namen sind nicht wichtig, ich bin nur nach einer Möglichkeit, die tatsächlichen Funktionen zu bekommen, damit ich sie in debug.getinfo verwenden können und erhalten Informationen, wie die Linien, die sie in definiert wurden. Ich habe luajit , wenn das das leichter macht. Ist so etwas überhaupt möglich? Danke im Voraus.

Antwort

1

Dies ist wahrscheinlich nicht möglich ohne Syntax oder Bytecode-Analyse, da jede Funktionsdefinition eine Zuweisung ist (hat nur unterschiedliche Formen in Ihren Beispielen). Siehe die bytecode inspector und eine verwandte Diskussion here. Für die Syntaxanalyse können Sie metalua oder etwas wie lua-loose-parser verwenden. Beachten Sie, dass selbst diese Tools nicht die gesamte Liste der Funktionen enthalten, da einige Funktionen dynamisch mit loadstring (oder ähnlichen Methoden) definiert werden können.

Wenn Sie nur Zugriff auf das Ergebnis von loadfile haben, verwenden Sie am besten den Bytecode-Analyzer.

2

Ich denke, die Datei erklärt ihre Funktionen als global, oder es wäre wirklich einfach zu verfolgen, was zurückgegeben wird.

Wenn das der Fall ist, können Sie durch alle die globale Elemente mit einer for-Schleife generic, und nehmen nur die Funktionen von ihnen:

allFuncs = {} 

for key, item in pairs(_G) do 
    if type(item) == "function" then 
     allFuncs[#allFuncs + 1] = item 
    end 
end 

(_G ist die Tabelle, die alle globalen Variablen halten)

Dann haben Sie eine Liste (allFuncs) mit allen deklarierten Funktionen, aber beachten Sie, dass es auch Standardfunktionen wie setmetatable oder xpcall enthalten wird.

Es ist einfach, den Code zu ändern, um das nicht passieren, aber dies nur verwenden für die Prüfung/Lernen:

function allFuncs() 
    local funcsTab = {} 
    for key, item in pairs(_G) do 
     if type(item) == "function" then 
      funcsTab[#funcsTab + 1] = item 
     end 
    end 
    return funcsTab 
end 

defaultFuncs = allFuncs() 

--then you load your file: other functions get declared 
--we create another table containg the default + the new functions 

myFuncs = allFuncs() 

--then you subtract the first table from the second 

for i = 1, #myFuncs do 
    for o = 1, #defaultFuncs do 
     if myFuncs[i] == defaultFuncs[o] then 
      table.remove(myFuncs, i) 
     end 
    end 
end 

Dies ist, wenn Sie Ihre Datei seine Funktionen als Globals gibt nichts zurück und erklärt.

Wenn die Datei sie als lokal deklariert und dann eine Tabelle zurückgibt, die sie enthält, verwenden Sie einfach den ersten Code, der _G mit dieser zurückgegebenen Tabelle ersetzt.

+0

Das Skript wird dynamisch (es kommt von woanders, Benutzer erstellt), und ich muss jede Funktion in diesem Skript definiert, nicht jede globale Funktion. Trotzdem danke! –

+0

Ok, aber wie erklärt das Skript die Funktionen? Deklariert es sie als "lokal" und gibt sie dann in einer Tabelle zurück? Oder deklariert es sie einfach als globale Funktionen, ohne etwas zurückzugeben? Wenn es eine Tabelle zurückgibt, können Sie den obigen Code verwenden, indem Sie "_G" durch diese zurückgegebene Tabelle ersetzen. – user6245072