是否可以通过内存地址加载 Lua 函数变量?

能否通过所请求函数的内存地址加载函数变量?

aFunctionVar = loadFunc(memAddress)
if type(aFunctionVar) == 'function' then "this var is a function!" end

Lua 中是否可以有类似 loadFunc() 的函数?

点赞
用户646619
用户646619

Lua 函数(与大多数脚本语言中的函数一样)没有固定的内部地址[1]。每次 Lua 执行一个 function 表达式时,都会在某个任意地址为其分配一个新的闭包。从以前的运行中获得函数闭包的地址完全没有用;在当前运行期间,在该地址处存在函数的可能性几乎为零。

即使您拥有来自同一进程中的函数的内存地址,普通的 Lua 也不提供任何“加载”它的方式,无论是从脚本内部还是从 C API。

如果您需要序列化函数,可以使用 string.dump,它将返回传递的函数的字节码字符串,可以使用 loadstringload(取决于 Lua 版本)加载它。请注意,此字节码独立于源函数的代码;不管您对源代码做了什么更改,函数都会执行它在被转储时所做的操作。此外,string.dump 无法序列化函数的上值。


[1] 其实,甚至 C 函数在每次运行时都可能没有固定的地址;共享库中的函数需要能够放置在内存的任何位置,以避免冲突。

2014-10-15 14:18:08