Lua:获取函数源代码

我正在开发一个序列化/反序列化系统,并尝试利用函数创建一些高级的功能。我的目标是以可读和可逆的方式序列化包含函数的对象(加载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将跟踪该文件中的函数行数。

点赞
用户869951
用户869951

你想将 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 decompiler”。

2013-12-04 23:24:03
用户107090
用户107090

使用 debug.getinfo 函数,可以获取到 sourcelinedefinedlastlinedefined 这些信息。除非你的代码被格式化得很奇怪,否则你可以通过这些信息完整地提取函数的代码。没有必要解析代码,只需要获取正确的行集合即可。

2013-12-05 01:47:47