Как избежать повторного выполнения setenv в сценарии lua
У меня есть два запущенных окружения в сценарии lua. Один из них является самым мощным, а другой ограничен.
Как изолировать работающую среду. Я использую lua5.1, и я также знаю, используя функцию setenv.
Но я хочу избежать повторного выполнения setenv при каждом выполнении функции.
Вот пример.
function SpawnSandBox( )
local SandBoxGlobals = {}
SandBoxGlobals.print = print
SandBoxGlobals.table = table
SandBoxGlobals.string = string
SandBoxGlobals.math = math
SandBoxGlobals.assert = assert
SandBoxGlobals.getmetatable = getmetatable
SandBoxGlobals.ipairs = ipairs
SandBoxGlobals.pairs = pairs
SandBoxGlobals.pcall = pcall
SandBoxGlobals.setmetatable = setmetatable
SandBoxGlobals.tostring = tostring
SandBoxGlobals.tonumber = tonumber
SandBoxGlobals.type = type
SandBoxGlobals.unpack = unpack
SandBoxGlobals.collectgarbage = collectgarbage
SandBoxGlobals._G = SandBoxGlobals
return SandBoxGlobals
end
function ExecuteInSandBox( SandBox, Script )
local ScriptFunc, CompileError = loadstring( Script )
if CompileError then
return CompileError
end
setfenv( ScriptFunc, SandBox )
local Result, RuntimeError = pcall( ScriptFunc )
if RuntimeError then
return RuntimeError
end
return nil
end
local SandBox = SpawnSandBox( )
print ( "Response=", ExecuteInSandBox( SandBox, "table.foreach( _G, print )" ) )