Как избежать повторного выполнения 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 )" ) )

0 ответов

Другие вопросы по тегам