2012-06-13 15 views
7

से कार्यों के लिए सेट एनवायरनमेंट कहें कि मेरे पास कम से कम दो लुआ स्क्रिप्ट फ़ाइलें हैं।5.2 में सैंडबॉक्सिंग एंबेडेड लुआ/lua.file

test1.lua test2.lua

दोनों एक init समारोह और इसी तरह के नामों के साथ अन्य कार्यों को परिभाषित।

मैं lua 5.2 का उपयोग कर एक अलग वातावरण में C++/c का उपयोग करके प्रत्येक स्क्रिप्ट फ़ाइल को कैसे लोड कर सकता हूं ताकि एक ही फ़ंक्शन नाम संघर्ष न करें - मुझे 5.1 के लिए नमूना कोड मिला जो मेरे लिए काम नहीं करता है (क्योंकि setenv चला गया है और lua_setuservalue काम करने के लिए प्रतीत नहीं होता)

यहाँ नमूना Calling lua functions from .lua's using handles?

मूल रूप से अगर मैं setuservalue साथ setenv की जगह - मैं एक पहुँच उल्लंघन मिलता है।

+0

इस कारण अभी तो मैं अपना खुद का परियोजनाओं में lua 5.1 के साथ फंस गया है में से एक है। मेरा मानना ​​है कि v5.2 'load' और 'loadfile' फ़ंक्शन आपको पर्यावरण निर्दिष्ट करने देते हैं; वे समाधान खोजने के लिए शायद सबसे अच्छी जगह हैं। – Rook

+0

धन्यवाद लेकिन मैंने लोड और लोडफाइल के बारे में पढ़ा है, हालांकि मुझे समाधान नहीं मिला – Steve

+0

'setuservalue' निश्चित रूप से पर्यावरण में हेरफेर करने का प्रयास करते समय उपयोग करने के लिए सही कार्य नहीं है। लुआ डॉक्स कुछ हद तक अस्पष्ट प्रतीत होता है कि आपको क्या करना चाहिए, हालांकि। 'lua_load' का कहना है कि लोड किए गए हिस्से के साथ जुड़े एक एकल अपग्रेड को इसके पर्यावरण के रूप में सेट किया गया है, लेकिन यह उल्लेख नहीं करता है कि आप सी से खंड के साथ एक अपवर्तक को जोड़ने के बारे में कैसे जाते हैं। यदि आप लुआ के भीतर से हिस्सा को लोड कर रहे थे, तो लुआ संस्करण 'लोड' फ़ंक्शन ऐसा लगता है कि इसे पर्यावरण को सही ढंग से सेट करना चाहिए। – Rook

उत्तर

8

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() 
+0

धन्यवाद लेकिन मुझे इन संसाधनों को पता है - हालांकि मैं इसे सी/सी ++ – Steve

+0

दरअसल, समस्या यह है कि 'लोड' और' लोडफाइल 'के सी समकक्षों में ऐसा कोई प्रत्यक्ष इंटरफ़ेस या दस्तावेज़ नहीं है। लुआ-उपयोगकर्ता विकी पेज भी डेटा से थोड़ा सा प्रतीत होता है, और इसमें ऐसी विशेषताएं शामिल हैं जो इसे 5.2 spec में कभी नहीं बनातीं। – Rook

+0

jpjacobs, हम आज lua-irc में मिले और जैसा कि मैंने कहा कि मुझे समाधान मिला है लेकिन एक वैकल्पिक उदाहरण देने के लिए धन्यवाद! – Steve

0

दोनों एक init समारोह को परिभाषित करने और समान नाम वाले अन्य कार्यों।

सबसे पहले, उन कार्यों को वैश्विक क्यों हैं? वे स्क्रिप्ट के लिए स्थानीय होना चाहिए। यदि आप अन्य फ़ाइलों में require पर जा रहे हैं, तो उन्हें उन तालिकाओं को बनाना और वापस करना चाहिए जिनमें वे प्रकट करना चाहते हैं।

local Library = require 'library' 

Library.Func1(...) 

इस प्रकार, आप वैश्विक लुआ नामस्थान को दूषित नहीं है:

आधुनिक मुहावरा जब इन फ़ाइलों की आवश्यकता होती है कुछ इस तरह करना है। आप स्थानीय चर का उपयोग करते हैं।

हालांकि, यदि आप इस तरह के ग्लोबल्स का उपयोग करने पर जोर देते हैं, तो आप दस्तावेज के अनुसार क्या कर सकते हैं: संकलित खंड के पहले अपग्रेड को बदलें।

मूल रूप से अगर मैं setusv को setuservalue से प्रतिस्थापित करता हूं - मुझे एक एक्सेस उल्लंघन मिलता है।

बेशक आप करते हैं। यह नहीं है कि lua_setuservalue है।यह उपयोगकर्ता डेटा से जुड़े मानों को सेट करने के लिए है। आप जो चाहते हैं उसे उचित रूप से lua_setupvalue कहा जाता है।

नमूना कोड आप का हवाला देते हैं का उपयोग करना, सही जवाब होगा:

lua_setupvalue(L, -2, 1); 
+0

मैंने गलती से इसे स्वयं निकाला - lua_setupvalue (एल, -2, 0); दुर्घटनाओं! - मैं lua_setupvalue (एल, -2, 1) का उपयोग करने से दूर हो गया; - मेरा ज्ञान सीमित है और मुझे पता है कि इस संदर्भ में 1 क्या है। लेकिन ऐसा लगता है - अब यह केवल "नामस्थान" में मेरी वस्तु का खुलासा करना संभव है और वैश्विक तालिका में नहीं?मैं अपनी कक्षाओं का पर्दाफाश करने के लिए लुबाइंड का उपयोग कर रहा हूं और वर्तमान में लुबाइंड :: ग्लोबल्स (myLuaState) ["myObj"] = myObj – Steve

+0

का उपयोग कर रहा हूं क्योंकि "वैश्विक" कार्य वैश्विक हैं - मैं कई इकाइयों के लिए स्क्रिप्ट के साथ एक ईवेंट सिस्टम बनाना चाहता हूं वही कार्य हस्ताक्षर उदाहरण init, चूंकि स्क्रिप्ट आमतौर पर डेवलपर्स द्वारा नहीं बनाई जाती हैं, इसलिए मैं इसे जितना संभव हो सके दर्द रहित बनाना चाहता हूं और किसी को भी libaries या मॉड्यूल से परेशान नहीं करना चाहता हूं - इसलिए मैं यह सुनिश्चित करना चाहता हूं कि प्रत्येक स्क्रिप्ट को अपने पर्यावरण में निष्पादित किया जाए - यह वैसे भी नहीं सोचा जाता है! – Steve

+0

@Steve: दस्तावेज स्पष्ट नहीं है कि 'lua_setupvalue' फ़ंक्शन शून्य-आधारित या एक-आधारित सूचकांक लेता है। ऐसा लगता है कि वे एक-आधारित हैं। –

संबंधित मुद्दे