Lua 5.2 LUA_GLOBALSINDEX Alternative
The global environment is now stored at a special index in the registry. Try:
//-- 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);
Related videos on Youtube
jussij
Updated on July 19, 2022Comments
-
jussij almost 2 years
I have a program that embeds Lua and implements a form of lazy function lookup.
The way it worked in Lua 5.1, whenever a symbol was undefined the interpreter would call a global function hook that would then resolve the symbol.
This is a small portion of C code that implemented this lazy function lookup:
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);
I'm now trying to move this code to Lua 5.2 and have run into a problem.
In Lua 5.2 the LUA_GLOBALSINDEX value is no longer defined so this line of code no longer compiles.
//-- set global call back hook lua_setmetatable(pLuaState, LUA_GLOBALSINDEX);
There is a reference to this change to LUA_GLOBALSINDEX but unfortunately it has not helped.
What would be the best way to re-write this one line of code to have the interpreter call the function_hook whenever it finds an unresolved symbol?
-
lhf about 12 yearsYou can also use
lua_pushglobaltable(pLuaState)
instead oflua_rawgeti(pLuaState, LUA_RIDX_GLOBALS, LUA_REGISTRYINDEX)
to shield your code from future changes. You can also definelua_pushglobaltable
for Lua 5.1 aslua_pushvalue(L, LUA_GLOBALSINDEX)
.