Есть ли способ получить исходный код из импортированного модуля Lua? - PullRequest
0 голосов
/ 11 мая 2019

возможно ли полностью отменить код из импортированного модуля LUA?

Например, у нас есть

mymath.lua

как модуль

local mymath =  {}

local a = 1

function mymath.add(a,b)
   print(a+b)
end

function mymath.sub(a,b)
   print(a-b)
end

function mymath.mul(a,b)
   print(a*b)
end

function mymath.div(a,b)
   print(a/b)
end

return mymath   

а у нас

testmodule.lua

импортирующий модуль mymath

mymathmodule = require("mymath")

for key,value in pairs(mymathmodule) do
    print(key, value)
end

Мне удалось распечатать объявление функции, но я не могу получить параметр или что находится внутри этих функций. В Python мы могли бы перевернуть импортированный модуль, есть ли способ сделать это в LUA?

Ответы [ 2 ]

2 голосов
/ 11 мая 2019

Вы можете делать это только с обычным Lua, если ваша программа имеет доступ к некомпилированному источнику. debug.getinfo (f) извлекает таблицу, включающую имя исходного файла и номера строк, в которых была определена функция. Следующие элементы вдохновлены inspect.getsource (object) в Python:

local function inspectSource(f)
  local info = debug.getinfo(f, "S")
  if info.source and string.sub(info.source, 1, 1) == "@" then 
    local source = string.sub(info.source, 2) 
    local i = 0
    for line in io.lines(source) do
      i = i + 1
      if i > info.lastlinedefined then
        break
      end
      if i >= info.linedefined then
        print(line)
      end
    end
  end
end

Использование:

mymathmodule = require("mymath")
inspectSource(mymathmodule.mul)

-- Output:
--          function mymath.mul(a,b)
--             print(a*b)
--          end     

Есть много улучшений, но это начало! Как указано выше, предполагается, что источник модуля находится в рабочем каталоге.

0 голосов
/ 11 мая 2019

Lua не имеет встроенного механизма для взятия скомпилированного кода Lua и регенерации исходного текста Lua из него.Во многих случаях информация просто теряется;имена параметров и другие локальные переменные просто не существуют в текстовом виде после компиляции.

Существуют различные декомпиляторы Lua, но даже они не могут гарантировать возможность вернуть строку.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...