c lua embedding lua-5.2

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"