获取Lua脚本中的所有函数

时间:2016-05-18 20:51:43

标签: function lua

我试图找到一种方法来获取Lua脚本中的所有函数。此脚本已通过loadfile编译为函数。例如,我想要获得下面脚本中定义的每个函数。

function example1()

end

local function example2()

end

local library = {}

function library:example3()

end

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

这些名字并不重要,我只是想找到一种获取实际功能的方法,这样我就可以在debug.getinfo中使用它们并获取类似于它们所定义的行的信息。我有LuaJIT ,如果这使得这更容易。这样的事情甚至可能吗?提前谢谢。

3 个答案:

答案 0 :(得分:2)

我想该文件将其函数声明为全局函数,或者跟踪返回的内容非常容易。

如果是这种情况,您可以使用通用的for循环遍历所有全局项,并且只从它们中获取函数:

allFuncs = {}

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

_G是包含所有全局变量的表)

然后你将有一个列表(allFuncs)包含声明的所有函数,但要注意它也将包含默认函数,如setmetatablexpcall

修改代码很容易实现,但只能用于测试/学习:

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

如果你的文件没有返回任何内容并将其函数声明为全局变量。

如果文件将它们声明为local,然后返回包含它们的表,则只需使用替换_G的第一段代码替换返回的表。

答案 1 :(得分:1)

如果没有语法或字节码分析,这是不可能的,因为每个函数定义都是一个赋值(在您的示例中只有不同的形式)。请参阅bytecode inspector和相关讨论here。对于语法分析,您可以使用metalualua-loose-parser之类的内容。请记住,即使这些工具也不会提供完整的函数列表,因为某些函数可能使用loadstring(或类似方法)动态定义。

如果您只能访问loadfile的结果,那么最好的办法是使用字节码分析器。

答案 2 :(得分:1)

在 LuaJIT 中使用 jit.attach 可以做到这一点。

<块引用>

您可以使用以下命令将回调附加到许多编译器事件 jit.attach。可以调用回调:

  • 当一个函数被编译成字节码(“bc”)时;
  • 跟踪记录开始或停止时(“跟踪”);
  • 因为正在记录跟踪(“记录”);
  • 或者当跟踪通过侧出口(“texit”)退出时。

http://wiki.luajit.org/JIT-Compiler-API#jit-attach

jit.attach(function(f)
    local funcInfo = jit.util.funcinfo(f)
end, "bc")