2012-04-10 125 views
15

我有一個嵌入Lua並實現懶惰函數查找的程序。Lua 5.2 LUA_GLOBALSINDEX備選

它在Lua 5.1中的工作方式,只要符號未定義,解釋器就會調用一個全局函數鉤子來解析符號。

這是實現此懶功能查找C代碼的一小部分:

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); 

我現在試圖將此代碼移動到Lua 5.2和所遇到的問題。

在Lua 5.2中,LUA_GLOBALSINDEX值不再被定義,所以這行代碼不再編譯。

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

有一個reference這種變化LUA_GLOBALSINDEX但遺憾的是它並沒有幫助。

重寫這一行代碼讓解釋器在發現一個未解析符號時調用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(L,LUA_GLOBALSINDEX)'。 – lhf 2012-04-10 11:40:02

+3

+1此解決方案完美運作。非常感謝。 – jussij 2012-04-10 13:36:05