我的游戏引擎将值作为参数传递给lua堆栈,然后使用lua_pcall调用它。 lua代码将运行并调用其他lua函数。最终这个lua代码将调用一个C函数。此函数是否可以检索最初推送到堆栈的值?
就像这样:
<engine function A>
pushes parameter value X on to stack for lua
<lua func>
<lua func>
<lua func>
<engine function B>
can I extract the values X that was pushed by function A here?
答案 0 :(得分:2)
是的,结合使用getinfo,getlocal和getupvalue,您可以获得所有信息(甚至可以使用set *函数更改这些值)。
这是来自MobDebug的片段,它返回堆栈信息以及每个级别的本地和upvalues表。每个级别的变量将按它们在代码中出现的顺序(从参数开始)编制索引。对于每个get *函数,您可以使用它们的C等价物(lua_getinfo,lua_getlocal和lua_getupvalue),但逻辑应该完全相同。
local function stack(start)
local function vars(f)
local func = debug.getinfo(f, "f").func
local i = 1
local locals = {}
while true do
local name, value = debug.getlocal(f, i)
if not name then break end
if string.sub(name, 1, 1) ~= '(' then locals[name] = {value, tostring(value)} end
i = i + 1
end
i = 1
local ups = {}
while func and true do -- check for func as it may be nil for tail calls
local name, value = debug.getupvalue(func, i)
if not name then break end
ups[name] = {value, tostring(value)}
i = i + 1
end
return locals, ups
end
local stack = {}
for i = (start or 0), 100 do
local source = debug.getinfo(i, "Snl")
if not source then break end
table.insert(stack, {
{source.name, source.source, source.linedefined,
source.currentline, source.what, source.namewhat, source.short_src},
vars(i+1)})
if source.what == 'main' then break end
end
return stack
end