c - LuaL_openlib reemplazo para Lua 5.2
embedding lua-5.2 (1)
Estoy adaptando una biblioteca escrita para Lua <5.2 y recibí una llamada que no sé el equivalente de:
luaL_openlib(L, "Polycore", polycoreLib, 0);
Donde polycoreLib
es un
static const struct luaL_Reg polycoreLib []
¿Cómo puedo reemplazar la llamada a luaL_openlib
?
La wiki de lua solo states :
Llamadas como
luaL_openlib(L, name, lreg, x);
debe reescribirse cuidadosamente porque se buscará y posiblemente se creará una tabla global con el nombre dado.
Hay dos respuestas a esto: una para replicar el comportamiento de versiones anteriores aquí (donde se crea una tabla global), y otra para implementar el comportamiento que ahora es convencional (que es crear y devolver una tabla anónima).
Para el primero:
lua_newtable(L);
luaL_setfuncs(L, polycoreLib, 0);
lua_setglobal(L, "Polycore");
Esto no es exactamente lo mismo que luaL_openlib
, porque si hay una tabla global existente, Polycore
, la sobrescribirá en lugar de fusionarse con ella. Si la combinación es una preocupación, use lua_getglobal
primero, luego si empujó una tabla reutiliza eso en lugar de crear una nueva:
lua_getglobal(L, "Polycore");
if (lua_isnil(L, -1)) {
lua_pop(L, 1);
lua_newtable(L);
}
luaL_setfuncs(L, polycoreLib, 0);
lua_setglobal(L, "Polycore");
Este último es más fácil porque no necesita preocuparse por la fusión:
lua_newtable(L);
luaL_setfuncs(L, polycoreLib, 0);
return 1;
Con este enfoque, es responsabilidad de la persona que llama vincular la tabla, como en:
local Polycore = require "Polycore"