18

Lua を組み込み、遅延関数ルックアップの形式を実装するプログラムがあります。

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

LUA_GLOBALSINDEX へのこの変更への参照がありますが、残念ながら役に立ちませんでした。

この 1 行のコードを書き直して、未解決のシンボルが見つかるたびにインタープリターが function_hook を呼び出せるようにする最善の方法は何でしょうか?

4

2 に答える 2

17

グローバル環境は、レジストリの特別なインデックスに保存されるようになりました。試す:

//-- 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);
于 2012-04-10T11:38:04.510 に答える