unofficial Lua FAQ में लुआ में सैंडबॉक्सिंग के बारे में एक प्रविष्टि है। मेरा अनुमान है कि आप उस तर्क को आसानी से अपने सी/सी ++ कोड में स्थानांतरित कर सकते हैं।
LuaFiveTo on the lua-users wiki भी देखें।
सुधार
यह वास्तव में के रूप में तुच्छ के रूप में यह लग रहा था नहीं है। लेकिन अंत में बिंदु सरल है: अपना हिस्सा लोड करें, _ENV तालिका दबाएं, lua_setupvalue(L,-2,1)
का उपयोग करें। महत्वपूर्ण यह है कि तालिका ढेर के शीर्ष पर होना चाहिए।
एक छोटा सा उदाहरण के रूप में, 2 वातावरण metatables के माध्यम से सामान को पढ़ने के लिए _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); // 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 लुआ फ़ाइलों के लिए:
-- 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()
इस कारण अभी तो मैं अपना खुद का परियोजनाओं में lua 5.1 के साथ फंस गया है में से एक है। मेरा मानना है कि v5.2 'load' और 'loadfile' फ़ंक्शन आपको पर्यावरण निर्दिष्ट करने देते हैं; वे समाधान खोजने के लिए शायद सबसे अच्छी जगह हैं। – Rook
धन्यवाद लेकिन मैंने लोड और लोडफाइल के बारे में पढ़ा है, हालांकि मुझे समाधान नहीं मिला – Steve
'setuservalue' निश्चित रूप से पर्यावरण में हेरफेर करने का प्रयास करते समय उपयोग करने के लिए सही कार्य नहीं है। लुआ डॉक्स कुछ हद तक अस्पष्ट प्रतीत होता है कि आपको क्या करना चाहिए, हालांकि। 'lua_load' का कहना है कि लोड किए गए हिस्से के साथ जुड़े एक एकल अपग्रेड को इसके पर्यावरण के रूप में सेट किया गया है, लेकिन यह उल्लेख नहीं करता है कि आप सी से खंड के साथ एक अपवर्तक को जोड़ने के बारे में कैसे जाते हैं। यदि आप लुआ के भीतर से हिस्सा को लोड कर रहे थे, तो लुआ संस्करण 'लोड' फ़ंक्शन ऐसा लगता है कि इसे पर्यावरण को सही ढंग से सेट करना चाहिए। – Rook