2012-04-10 9 views
15

Tengo un programa que incorpora Lua e implementa una forma de búsqueda de funciones diferidas.Lua 5.2 LUA_GLOBALSINDEX Alternativa

La forma en que funcionaba en Lua 5.1, siempre que un símbolo no estaba definido, el intérprete llamaba a un gancho de función global que luego resolvería el símbolo.

Esta es una pequeña porción de código C que implementa esta función de búsqueda perezoso:

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

ahora estoy tratando de mover el código de Lua 5.2 y se han topado con un problema.

En Lua 5.2, el valor LUA_GLOBALSINDEX ya no se define, por lo que esta línea de código ya no se compila.

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

Hay una reference a este cambio a LUA_GLOBALSINDEX pero lamentablemente no ha ayudado.

¿Cuál sería la mejor manera de volver a escribir esta línea de código para que el intérprete llame al function_hook siempre que encuentre un símbolo no resuelto?

Respuesta

14

El global environment ahora se almacena en un índice especial en el registry. Proveedores:

//-- 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

También puede usar 'lua_pushglobaltable (pLuaState)' en lugar de 'lua_rawgeti (pLuaState, LUA_RIDX_GLOBALS, LUA_REGISTRYINDEX)' para proteger su código de cambios en el futuro. También puede definir 'lua_pushglobaltable' para Lua 5.1 como' lua_pushvalue (L, LUA_GLOBALSINDEX) '. – lhf

+3

+1 Esta solución funciona perfectamente. Muchas gracias. – jussij