一些代码示例:
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()
-- Removing `debug.sethook()` lines:
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 注释的行:
编辑:啊,拍摄,编辑您使用 C/C++ 执行此操作的问题。挂钩函数也可以使用纯 C API 完成。如果您没有从我的回答中得到基本想法,可能会举个例子:)