使用Lua访问函数体

Dal*_*ght 9 debugging lua function-pointers function visualizer

我要回到这里的基础知识,但在Lua中,你可以像这样定义一个表:

myTable = {}
myTable [1] = 12
Run Code Online (Sandbox Code Playgroud)

打印表引用本身会返回指向它的指针.要访问其元素,您需要指定一个索引(即与数组完全一样)

print(myTable )    --prints pointer
print(myTable[1])  --prints 12
Run Code Online (Sandbox Code Playgroud)

现在功能是一个不同的故事.您可以定义和打印如下函数:

myFunc = function() local x = 14 end     --Defined function
print(myFunc)                            --Printed pointer to function
Run Code Online (Sandbox Code Playgroud)

有没有办法访问已定义函数的主体.我试图整理一个小代码可视化器,并希望用特殊的函数/变量"播种"给定的函数,以允许可视化器将自己"挂钩"到代码中,我需要能够重新定义函数.变量或字符串.

Ale*_*ysh 10

无法在普通Lua中访问给定函数的正文源代码.编译成字节码后,源代码被丢弃.

注意BTW可以在运行时使用类似于负载串的工具定义该函数.

部分解决方案是可能的 - 取决于您实际想要实现的目标.

您可以从调试库获取源代码位置 - 如果启用了调试库并且未从字节码中删除调试符号.之后,您可以加载实际的源文件并从那里提取代码.

您可以使用所需的元数据手动装饰您感兴趣的功能.请注意,Lua中的函数是有效的表键,因此您可以创建函数到元数据表.您可能希望将此表设置为弱键,因此不会阻止GC收集函数.

如果您需要一个分析Lua代码的解决方案,请查看Metalua.


Nic*_*unt 5

查看调试库中的 Lua Introspective Facilities 。

调试库中主要的内省函数是debug.getinfo函数。它的第一个参数可以是函数或堆栈级别。当您为某个函数 foo 调用 debug.getinfo(foo) 时,您会得到一个包含有关该函数的一些数据的表。该表可能有以下字段:

我认为您想要的字段是 func 。


Jan*_*Vos 5

使用调试库是您唯一的选择。使用它,您可以获取字符串(如果该函数是在使用“loadstring”加载的块中定义的)或定义该函数的文件的名称;以及函数定义开始和结束的行号。请参阅文档

在我目前的工作中,我们已经修补了 Lua,以便它甚至可以为您提供函数开始和结束的列号,这样您就可以使用它来获取函数源。该补丁并不很难复制,但我认为我不会被允许将其发布在这里:-(