Lua:获取功能源

时间:2013-12-04 21:35:38

标签: debugging serialization lua introspection

我正在开发一个用于序列化/反序列化的系统,而我正在尝试使用函数来获得一些非常奇特的东西。我的目标是以人类可读和可逆的方式序列化包含函数的对象(序列化文件需要在loadfile()步骤之后进行处理)。我需要一种方法来获取函数的实际来源,看起来我不能总是用debug.getinfo()来做。

我知道debug.getinfo()将给出定义它的文件和行(或函数的来源,具体取决于它的来源)。有没有办法可以从该文件中读取函数文本?我愿意使用某种解析器实用程序来实现这一点。也许有用于解析Lua代码的Lua包?

也许有一种方法可以让loadfile()或require()在某处自动保留函数源?

是的,我知道你可以从debug.getinfo中获取各种信息,但它无法处理通过stdin加载的函数......

uberblah@glade-m:~$ lua
Lua 5.1.5  Copyright (C) 1994-2012 Lua.org, PUC-Rio
> a = function() print("hello, world!") end
> require("serpent")
> s = require("serpent")
> =s.block(debug.getinfo(a))
{
  currentline = -1,
  func = loadstring("LuaQ\000\000\000\000\000\000\000\000\000=stdin\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000A@\000\000@\000\000�\000\000\000\000\000\000\000\000\000\000\000print\000\000\000\000\000\000\000\000hello, world!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000",'@serialized') --[[function: 0x2068a30]],
  lastlinedefined = 1,
  linedefined = 1,
  namewhat = "",
  nups = 0,
  short_src = "stdin",
  source = "=stdin",
  what = "Lua"
} --[[table: 0x206cf80]]
> f = io.open("stdin", "r")
> =f
nil

解决来自STDIN的来源...... 1)捕获所有STDIN,将其写入文件 2)从该文件加载信息,而不是从stdin加载 3)debug将跟踪该文件中的功能行号

2 个答案:

答案 0 :(得分:5)

使用debug.getinfo,您可以获得sourcelinedefinedlastlinedefined。除非您格式化您的代码,否则您应该能够从此信息中提取函数的完整代码。没有必要解析代码,只是为了获得正确的行集。

答案 1 :(得分:1)

您希望将字节码反汇编为Lua语句和表达式。试试http://chunkspy.luaforge.net/。或者也许http://luadec.luaforge.net/但我还没有使用过它们,所以无法提供更多信息。 Luac(Lua编译器)也有-l开关,它生成可能被解析的汇编列表。然后是lbci(bhttp://www.tecgraf.puc-rio.br/~lhf/ftp/lua/#lbci)。您可能会发现Getting the AST of a function很有用。最后,我建议你搜索“lua反编译器”。