Песочница в Lua 5.2

Я учусь на «Программировании на Lua» Роберто Иерусалимского и обнаружил, что в книге пример «Песочницы» использует функцию setfenv()для изменения среды данной функции, но в lua 5.2 эта функция больше недоступна..

Я попытался загрузить некоторые значения из файла (файла конфигурации )в поле таблицы, но в lua 5.2 я не могу использовать setfenv (, поэтому я могу загрузить значения в данной среде ). Прочитав некоторые статьи о lua 5.2, я обнаружил, что каждая функция может иметь (или не )повышающее значение, называемое _ENV, которое служит средой, поэтому я попробовал следующий код:

function sandbox(sb_func, sb_env)
    if not sb_func then return nil, "sandbox function not valid" end
    sb_orig_env = _ENV
    _ENV = sb_env -- yes, replaces the global _ENV
    pcall_res, message = pcall( sb_func )
    local modified_env = _ENV -- gets the environment that was used in the pcall( sb_func )
    _ENV = sb_orig_env
    return true, modified_env
end

function readFile(filename)
    code = loadfile(filename)
    res, table = sandbox(code, {})
    if res then
        --[[ Use table (modified_env) ]]--
    else
        print("Code not valid")
end

Замена _ENVв функции «песочницы» работает хорошо (не может получить доступ к обычным полям ), но при выполнении «кода» кажется, что он игнорирует то, что я заменил _ENV, он все еще может доступ к обычным полям (print, loadfile, dofile и т. д. ).

Прочитав немного больше, я обнаружил, что lua 5.2 предоставляет функцию для этой цели, эта функция loadin(env, chunk), которая запускает данный фрагмент в данной среде, но, когда я пытаюсь добавить эту функцию в свой код,функция не существует (Отсутствует в глобальном _Gполе ).

Некоторая помощь будет оценена по достоинству.

5
задан Daniel Rivas 1 July 2012 в 07:46
поделиться