lua - 我可以从 Lua 中的父函数中提取堆栈值吗?

标签 lua stack

我的游戏引擎将一个值推送到 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?

最佳答案

是的,通过结合使用 getinfo、getlocal 和 getupvalue,您可以获得所有这些信息(您甚至可以使用 set* 函数更改这些值)。

这是来自 MobDebug 的片段返回堆栈信息以及每个级别的局部变量和上值表。每个级别的变量将按照它们在代码中出现的顺序进行索引(从参数开始)。对于每个 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

关于lua - 我可以从 Lua 中的父函数中提取堆栈值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12224548/

相关文章:

java - Redisson - RMapCache 将 2 个附加字节添加到值前面

java - 应用程序关闭后恢复 Android 返回堆栈

编译和链接多个 C 库(卡在未找到架构 x86_64 的符号处)

Lua 'require' 但文件只在内存中

javascript - C++ 脚本语言

performance - Go 语言指针性能

c++ - 关于堆栈增长和寻址的困惑

c - 堆栈元素编号

css - 灵活的 div 水平和垂直定位,没有间隙

lua - 零检查,最好的方法?