2012-04-10 16 views
15

मेरे पास एक प्रोग्राम है जो लुआ को एम्बेड करता है और आलसी फ़ंक्शन लुकअप का एक रूप लागू करता है।लुआ 5.2 LUA_GLOBALSINDEX वैकल्पिक

जिस तरह से यह लुआ 5.1 में काम करता था, जब भी एक प्रतीक को अपरिभाषित किया गया था तो दुभाषिया एक वैश्विक फ़ंक्शन हुक को कॉल करेगा जो तब प्रतीक को हल करेगा।

int function_hook(lua_State *pLuaState) 
{ 
    // do the function lookup here 
    .... 
    return 1; 
} 

...... 

//-- create table containing the hook details 
lua_newtable(pLuaState); 
lua_pushstring(pLuaState, "__index"); 
lua_pushcfunction(pLuaState, function_hook); 
lua_settable(pLuaState, -3); 

//-- set global index callback hook 
lua_setmetatable(pLuaState, LUA_GLOBALSINDEX); 

मैं अब लुआ 5.2 के लिए इस कोड को स्थानांतरित करने के कोशिश कर रहा हूँ और किसी समस्या का सामना किया है:

यह है कि इस आलसी समारोह देखने कार्यान्वित सी कोड का एक छोटा सा हिस्सा है।

लुआ 5.2 में LUA_GLOBALSINDEX मान अब परिभाषित नहीं किया गया है, इसलिए कोड की यह पंक्ति अब संकलित नहीं होती है।

//-- set global call back hook 
lua_setmetatable(pLuaState, LUA_GLOBALSINDEX); 

LUA_GLOBALSINDEX के लिए यह परिवर्तन करने के लिए एक reference नहीं है लेकिन दुर्भाग्य से यह नहीं मदद की है।

जब भी यह एक अनसुलझे प्रतीक पाता है तो दुभाषिया को function_hook को कॉल करने के लिए कोड की एक पंक्ति को दोबारा लिखने का सबसे अच्छा तरीका क्या होगा?

उत्तर

14

global environment अब registry में एक विशेष अनुक्रमणिका में संग्रहीत है। प्रयास करें:

//-- get global environment table from registry 
lua_rawgeti(pLuaState, LUA_REGISTRYINDEX, LUA_RIDX_GLOBALS); 

//-- create table containing the hook details 
lua_newtable(pLuaState); 
lua_pushstring(pLuaState, "__index"); 
lua_pushcfunction(pLuaState, function_hook); 
lua_settable(pLuaState, -3); 

//-- set global index callback hook 
lua_setmetatable(pLuaState, -2); 

//-- remove the global environment table from the stack 
lua_pop(pLuaState, 1); 
+22

तुम भी उपयोग कर सकते हैं 'lua_pushglobaltable (pLuaState)' 'बजाय lua_rawgeti की (pLuaState, LUA_RIDX_GLOBALS, LUA_REGISTRYINDEX)' अपने कोड भविष्य में परिवर्तन से बचाने के लिए। आप lua 5.1 के लिए 'lua_pushglobaltable' को' lua_pushvalue (एल, LUA_GLOBALSINDEX) 'के रूप में भी परिभाषित कर सकते हैं। – lhf

+3

+1 यह समाधान पूरी तरह से काम करता है। बहुत बहुत धन्यवाद। – jussij