Как определить, является ли номер строки Lua допустимой точкой выполнения (из C/C++)?
Как я могу сказать, будет ли строка номер x в скрипте Lua отвечать на 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 ответа
lua_getinfo
может вернуть таблицу допустимых строк, если вы включите L
в what
,
Пример кода:
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. Можно привести пример, если Вы не поняли основную идею из уже сделанного моего ответа:)