Создайте свою песочницу (или несколько песочниц, если у каждой из них свои требования) и перемещайте ненадежный код в песочницу по одной части за раз.В моих быстрых тестах Cli, 5.1 и 5.2 будут запускать функции, которые были определены вне песочницы, без изменений.Чтобы использовать пример Дуга, предположим, что display
является частью вашего ранее существующего кода, который использует print
:
-- 5.1
local function display(...)
print(...)
end
local script = loadstring "display(math.log(2, 3))"
local env = {display = display, math = math, string = string}
setfenv(script, env)
print(pcall(script))
-- 5.2
local function display(...)
print(...)
end
local script = loadstring "display(math.log(2, 3))"
local e=_ENV
_ENV={display = display, math = math, string = string}
e.print(e.pcall(script))
_ENV=e
Обратите внимание, что в обоих приведенных выше примерах функция display
использует print
без изменения этого кода, поскольку вы не были в песочнице, когда создавалась эта функция.
В прошлом я сохранял локальный указатель на среду без песочницы, но не могу воспроизвестиситуация, когда это необходимо в моих быстрых тестах.Если вы можете привести пример, я, возможно, смогу найти обходной путь, для которого не требуется переменная e
.Вот пример этого кода с использованием 5.2:
local e=_ENV
for k,v in e.pairs(value) do
-- iterate
end
другой пример, для моего кода таблицы только для чтения, я снова использую e
:
function ro_table (t)
local t = t
if t then
return e.setmetatable({},
{ __index=t,
__newindex= function(_,_,_) e.error ("Attempt to modify read-only table") end,
})
else
return nil
end
end