2016-12-31 11 views
3

Я пытающаяся песочницу некоторых функций, используя setfenv, и я получаю следующий результат:LuaJIT не setfenv появляться установить дополнительно вызовы функций в данной среду

123 
nil 

Почему testValue при вызове sandboxTest()nil, но это 123, когда он доступен в callSandboxedTest()?

Использование LuaJIT 2.1.0-beta2 (Lua 5,1)

function sandboxTest() 
    print(testValue) 
end 

local aNumber = 123 

function callSandboxedTest() 
    setfenv(1, { 
     print = print, 
     testValue = aNumber, 
     sandboxTest = sandboxTest 
    }) 
    print(testValue) 
    sandboxTest() 
end 

callSandboxedTest() 

ответ

2

Среды не являются частью стека вызовов. Каждая функция имеет свою собственную среду. Итак, sandboxTest имеет среду, как и callSandboxTest. Изменение среды одной функции не влияет на среду другого.

sandboxTest будет продолжать использовать среду по умолчанию, поэтому он будет обращаться к обычной глобальной таблице, чтобы найти testValue. А так как testValue никогда не устанавливается в глобальной таблице, sandboxTest получит nil.

Именно поэтому при сохранении песочницы очень важно тщательно выбрать, какую функциональность выставить в песочнице. Если функция должна быть частью песочницы, тогда эта функция должна иметь свою среду.

Именно поэтому лучше всего использовать песочницу на основе скомпилированных фрагментов Lua, а не отдельных функций. При создании функций созданные функции наследуют текущую среду.

1

Вы не изменили окружающую среду, которую использует sandboxTest; вы только изменили среду текущей функции. Вы можете использовать setfenv установить среду той или иной функции, передав имя функции (передавая номер изменяет окружение функции в стеке вызовов):

setfenv(sandboxTest, { 
     print = print, 
     testValue = aNumber, 
     sandboxTest = sandboxTest 
    }) 

Это будет печатать 123 123.

 Смежные вопросы

  • Нет связанных вопросов^_^