2012-04-10 20 views
15

私はLuaを組み込み、遅延型関数ルックアップの形式を実装しています。ルア5.2 LUA_GLOBALSINDEXオルタナティブ

Lua 5.1では、シンボルが定義されていないときはいつでも、インタープリタはグローバル関数フックを呼び出してシンボルを解決します。私は今のLua 5.2にこのコードを移動しようとしていると問題に遭遇してきた

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

これは、この怠惰な機能の検索を実装したCコードの小さな部分があります。

Lua 5.2では、LUA_GLOBALSINDEX値は定義されなくなり、このコード行はコンパイルされなくなりました。

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

はLUA_GLOBALSINDEXにこの変更にreferenceありますが、残念ながらそれは助けていません。

未解決のシンボルが見つかるたびにインタープリタがfunction_hookを呼び出すようにするには、この1行のコードを書き直すにはどうすればよいでしょうか?

答えて

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_rawgeti(pLuaState、LUA_RIDX_GLOBALS、LUA_REGISTRYINDEX) '将来の変更からあなたのコードを保護するためのlua_pushglobaltable(pLuaStateを)'を使用することができます。また、lua 5.1の 'lua_pushglobaltable'を' lua_pushvalue(L、LUA_GLOBALSINDEX) 'として定義することもできます。 – lhf

+3

+1このソリューションは完全に機能します。どうもありがとう。 – jussij