RobertoIerusalimschyの「ProgramminginLua」から学んでいます。この本では、サンドボックスの例で関数を使用しsetfenv()
て特定の関数の環境を変更していることがわかりましたが、lua5.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
'sandbox'関数での置換_ENV
はうまく機能します(通常のフィールドにアクセスできません)が、'コード'を実行すると、置換したことを無視しているように見え_ENV
ますが、通常のフィールド(print、loadfile、dofile、等)。
もう少し読んでみると、lua 5.2がこの目的のための関数を提供していることがわかりました。この関数はloadin(env, chunk)
、指定された環境で指定されたチャンクを実行しますが、この関数をコードに追加しようとすると、関数が存在しません。 (グローバル_G
フィールドには存在しません)。
いくつかの助けをいただければ幸いです。