Доступ к телу функции с Lua

Я выяснил, в чем проблема, после некоторого копания в моем коде, я заметил, что цикл for файла, который я не опубликовал, вызывал проблему.

Код проблемы:

void Renderer::OnUpdate()
{
    ....
    for(int i = 0; i < (int)sizeof(m_Images); i++)
    {
        if(m_Images[i]->IsEnabled() == true)
        {
            m_Images[i]->OnUpdate();
        }
    }
    ....
}

Фиксированный код:

void Renderer::OnUpdate()
{
    ....
    for(int i = 0; i < m_Images.size(); i++)
    {
        if(m_Images[i]->IsEnabled() == true)
        {
            m_Images[i]->OnUpdate();
        }
    }
    ....
}
9
задан Dalin Seivewright 2 February 2009 в 18:36
поделиться

4 ответа

Нет никакого способа получить доступ к исходному коду тела заданной функции в плоскости Lua. Исходный код выброшен после компиляции к байт-коду.

Отметьте BTW, что функция может быть определена во времени выполнения с подобным loadstring средством.

Частичные решения возможны — в зависимости от того, чего Вы на самом деле хотите достигнуть.

Можно получить положение исходного кода от библиотеки отладки — если библиотеке отладки включают, и отладочные символы не разделяются из байт-кода. После этого можно загрузить фактический исходный файл и извлечь код оттуда.

Можно украсить функции, которыми Вы интересуетесь вручную с необходимыми метаданными. Обратите внимание, что функции в Lua являются допустимыми ключами таблицы, таким образом, можно составить таблицу функции к метаданным. Вы хотели бы сделать эту таблицу слабо включенной, таким образом, она не будет препятствовать тому, чтобы функции были собраны GC.

Если Вам было бы нужно решение для анализа кода Lua, смотреть на Metalua.

10
ответ дан 4 December 2019 в 13:05
поделиться

Пользование библиотекой отладки является Вашей единственной ставкой. Используя это, можно получить любого строка (если функция определяется в блоке, который был загружен 'loadstring'), или название файла, в котором была определена функция; вместе с номерами строки, в которых функциональное определение запускается и заканчивается. См. документацию.

Здесь в моем текущем задании мы исправили Lua так, чтобы это даже дало Вам номера столбцов для запуска и конца функции, таким образом, можно получить функциональный источник с помощью этого. Патч не очень трудно воспроизвести, но я не думаю, что мне разрешат отправить его здесь :-(

4
ответ дан 4 December 2019 в 13:05
поделиться

Проверьте Самосозерцательные Средства Lua в библиотеке отладки.

Основная самосозерцательная функция в библиотеке отладки является функцией debug.getinfo. Его первый параметр может быть функцией или уровнем стека. При вызове debug.getinfo (нечто) для некоторого функционального нечто Вы получаете таблицу с некоторыми данными о той функции. Таблица может иметь следующие поля:

Поле, которое Вы хотели бы, является func, я думаю.

2
ответ дан 4 December 2019 в 13:05
поделиться

Вы могли выполнить это путем создания среды для каждой функции (см. setfenv), и использование глобального (по сравнению с локальным) переменные. Переменные, созданные в функции, затем появились бы в таблице среды после того, как функция выполняется.

env = {}
myFunc = function() x = 14 end
setfenv(myFunc, env)
myFunc()
print(myFunc)    -- prints pointer
print(env.x)     -- prints 14

С другой стороны, Вы могли использовать Библиотеку Отладки:

> myFunc = function() local x = 14 ; debug.debug() end
> myFunc()
> lua_debug> _, x = debug.getlocal(3, 1)
> lua_debug> print(x) -- prints 14

Для Вас, вероятно, было бы более полезно получить локальные переменные с функцией рычага вместо того, чтобы явно ввести режим отладки (т.е. добавить debug.debug () вызов)

Существует также Интерфейс Отладки в Lua C API.

0
ответ дан 4 December 2019 в 13:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: