Как определить, является ли номер строки 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. Можно привести пример, если Вы не поняли основную идею из уже сделанного моего ответа:)

Другие вопросы по тегам