如何判断Lua行号是否为有效的执行点(从C/C++中)?

如何确定 Lua 脚本中的第 x 行是否会响应 Lua 的 line hook

例如:

 1 first = 1
 2
 3 function test ( data )
 4  if first == 0 then
 5    print ("\r\n")
 6  end
 7  print(data)
 8  --[[
 9  first = 0
10  ]]
11 end
12
13 test()
14

第 2、6、8、9、10、12 和 14 行不调用 line hook。在加载和执行脚本后,我能否从 C/C++ 中获得一个可执行行号的表?

点赞
用户1150918
用户1150918

以下是一些代码示例:

local exec_lines = {}

local function exec_line_counter(event, line)
    table.insert(exec_lines, line)
end

local function count_exec_lines(lua_file)
    local external_chunk = loadfile(lua_file)

    debug.sethook(exec_line_counter, "l")
    external_chunk()
    debug.sethook()

    -- 删除 `debug.sethook()` 这些行:
    table.remove(exec_lines, 1)
    table.remove(exec_lines, #exec_lines)
end

count_exec_lines("test.lua")

输出为:

table.sort(exec_lines)
for i, num in ipairs(exec_lines) do
    print(num)
end

输出结果为:

1

3

4

7

11

11 <--- 不确定为什么会重复。缺少 return 吗?还是因为后面有 tailcall

13

注意:这仅记录正在解析的行。在您的测试用例中,它未覆盖第 5 和第 6 行,因为 first 不为 0。

另一种方法是这样做并解决上述情况 - 简单地解析 Lua 源代码:计算并跳过仅由 Lua 注释组成的行:

  • --lines

  • --[[ blocks ]]

编辑:啊,糟糕,编辑了您的 C/C++ 实现的问题。挂钩函数也可以使用纯 C API 完成。如果您还没有从我的现成答案中的基本思路中获得基本思路,则可以制作一个示例:)

2013-12-12 18:26:52
用户107090
用户107090

如果在 what 中包括 L,则 lua_getinfo 可以返回一个有效行的表。

2013-12-12 18:49:41