如何在 Lua 中获取当前函数调用栈的深度?

我想高效地获取当前函数调用栈,请问有什么 API 或者什么方法可以做到这一点吗?

我尝试过下面的方法,但是它太慢了。

local function GetStackDepth()
    local depth = 0
    while true do
        if not debug.getinfo(3 + depth) then
            break
        end
        depth = depth + 1
    end
    return depth
end

编辑: 我的真正问题是我在编写一个分析器工具,并且使用 debug.sethook 在调用和返回事件中做一些事情。但是在 Lua5.1 或者 Lua-jit 的情况下,当出现 tail return 时,我会得到两个调用事件和一个返回事件,如下所示:

call     ------ 第一个调用事件
call
return

所以我的解决方法是获取当前事件的调用栈深度,当返回事件的深度小于第一个调用事件的深度时,我知道这是一个 tail return,然后我就可以正确地处理它。

但是我发现 GetStackDepth() 本身花费了很多时间(太慢了),这会影响我的分析器结果。

我不能改变 Lua 版本。

点赞