5.2中的嵌入式Lua沙盒/来自lua.file的功能设置环境 [英] Sandboxing Embedded Lua in 5.2 / Set Envirenment for Functions from lua.file

查看:126
本文介绍了5.2中的嵌入式Lua沙盒/来自lua.file的功能设置环境的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

让我们说我至少有两个lua脚本文件.

Lets say i have at least two lua script files.

test1.lua test2.lua

test1.lua test2.lua

都定义了一个初始化函数和其他名称相似的函数.

both define an init function and other functions with similar names.

如何使用Lua 5.2将使用c ++/c的每个脚本文件加载到单独的环境中,以使相同的函数名称不会发生冲突-我发现5.1的示例代码对我不起作用(因为setenv消失了,并且lua_setuservalue似乎不起作用)

How can i load each script file using c++/c into a separate environment using Lua 5.2 so that the same function names will not clash - i found a sample code for 5.1 which does not work for me (because setenv is gone and lua_setuservalue does not seem to work)

在此处采样从中调用lua函数. lua正在使用手柄?

基本上,如果我将setenv替换为setuservalue-我会遇到访问冲突.

Basically if i replace setenv with setuservalue - i get an access violation.

推荐答案

非正式Lua常见问题解答在Lua中有一个有关沙盒的条目. 我的猜测是,您可以轻松地将该逻辑转换为C/C ++代码.

The unofficial Lua FAQ has an entry about sandboxing in Lua. My guess is that you can transpose that logic easily enough to your C/C++ code.

另请参见lua用户Wiki上的 LuaFiveTo .

See also LuaFiveTo on the lua-users wiki.

更正

确实不像看起来那么琐碎.但是最后一点很简单:加载块,推送_ENV表,使用lua_setupvalue(L,-2,1).重要的是该表应位于堆栈的顶部.

It's indeed not as trivial as it seemed. But in the end the point is simple: load your chunk, push the _ENV table, use lua_setupvalue(L,-2,1). The important is that the table should be at the top of the stack.

作为一个小例子,使用默认为_G的2种环境通过元表读取内容:

As a small example, using 2 environments defaulting to _G for reading stuff via metatables:

#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); // S: 1
        luaL_loadfile(L,file1); // S: 2
        lua_newtable(L); // ENV for file 1: S: 321
        lua_newtable(L); // ENV for file 2: S: 4321

        //lets have each function have its metatable, where missed lookups are
        //instead looked up in the global table _G

        lua_newtable(L); // metatable S: 54321
        lua_getglobal(L,"_G"); // pushes _G, which will be the __index metatable entry S: 654321

        lua_setfield(L,-2,"__index"); // metatable on top S: 54321
        lua_pushvalue(L,-1); // copy the metatable S: 554321
        lua_setmetatable(L,-3); // set the last copy for env2 S: 54321
        lua_setmetatable(L,-3); // set the original for env1  S: 4321
        // here we end up having 2 tables on the stack for 2 environments
        lua_setupvalue(L,1,1); // first upvalue == _ENV so set it. S: 321
        lua_setupvalue(L,2,1); // set _ENV for file S: 21
        // Remaining on the stack: 2 chunks with env set.
        lua_pcall(L,0,LUA_MULTRET,0);
        lua_pcall(L,0,LUA_MULTRET,0);
        lua_close(L);
        return 0;
}

对于2个Lua文件:

-- file1.lua
function init()
        A="foo"
        print("Hello from file1")
        print(A)
end
init()

-- file2.lua
-- this shows that stuff defined in file1 will not polute the environment for file2
print("init function is",tostring(init))
function init()
        A="bar"
        print("Hello from file2")
        print(A)
end
init()

这篇关于5.2中的嵌入式Lua沙盒/来自lua.file的功能设置环境的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆