如何判断Lua行号是否是一个有效的执行点(来自C / C ++)?

时间:2013-12-12 16:17:44

标签: lua hook lua-5.2 c++builder-xe3

如何判断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行不会调用线钩。在我加载并执行了脚本之后,我可以从C / C ++中获取一个可执行行号表吗?

2 个答案:

答案 0 :(得分:2)

如果您在L中加入what

lua_getinfo可以返回有效行表。

答案 1 :(得分:1)

一些代码示例:

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注释的行:

  • --lines

  • --[[ blocks ]]

编辑:啊,拍摄,编辑你用C / C ++做这件事的问题。挂钩函数也可以使用普通的C API完成。如果你没有从我已经做出的答案中得到一个基本想法,可能会举个例子:)