非官方Lua FAQ中有一篇关于Lua沙盒的文章。我猜你可以很容易地将这个逻辑转换到C/C++代码中。
还可以参考lua-users wiki上的LuaFiveTo。
更正
事实上,这并不像看起来那么简单。但最终的重点很简单:加载你的代码块,推入_ENV表,使用lua_setupvalue(L,-2,1)
。重要的是,这个表应该在栈的顶部。
作为一个小例子,使用两个默认为_G的环境通过元表读取内容:
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
int main(void){
lua_State *L = luaL_newstate();
char *file1 = "file1.lua";
char *file2 = "file2.lua";
luaL_openlibs(L);
luaL_loadfile(L,file2);
luaL_loadfile(L,file1);
lua_newtable(L);
lua_newtable(L);
lua_newtable(L);
lua_getglobal(L,"_G");
lua_setfield(L,-2,"__index");
lua_pushvalue(L,-1);
lua_setmetatable(L,-3);
lua_setmetatable(L,-3);
lua_setupvalue(L,1,1);
lua_setupvalue(L,2,1);
lua_pcall(L,0,LUA_MULTRET,0);
lua_pcall(L,0,LUA_MULTRET,0);
lua_close(L);
return 0;
}
对于这2个Lua文件:
function init()
A="foo"
print("Hello from file1")
print(A)
end
init()
print("init function is",tostring(init))
function init()
A="bar"
print("Hello from file2")
print(A)
end
init()
lua_load
表示,与已加载块关联的单个upvalue被设置为其环境,但没有说明如何从C将upvalue与块相关联。如果你是从Lua内部加载块,则load
函数的Lua版本看起来应该正确设置环境。 - Rooklua_setupvalue
的人持怀疑态度。它在文档中作为调试API的一部分,因此在正常使用lua时不需要触及它。 - Rook