elua lib: manage bound modules within Elua_State
This commit is contained in:
parent
ad999df598
commit
329fae97b0
|
@ -34,7 +34,6 @@ enum
|
|||
ARG_LIBDIR
|
||||
};
|
||||
|
||||
static Eina_List *elua_modlist = NULL;
|
||||
static int elua_require_ref = LUA_REFNIL;
|
||||
static int elua_appload_ref = LUA_REFNIL;
|
||||
static const char *elua_progname = NULL;
|
||||
|
@ -105,23 +104,6 @@ elua_getargs(Elua_State *es, int argc, char **argv, int n)
|
|||
return narg;
|
||||
}
|
||||
|
||||
static int
|
||||
elua_init_module(lua_State *L)
|
||||
{
|
||||
if (!lua_isnoneornil(L, 1))
|
||||
{
|
||||
lua_pushvalue(L, 1);
|
||||
lua_call(L, 0, 0);
|
||||
}
|
||||
if (!lua_isnoneornil(L, 2))
|
||||
{
|
||||
lua_pushvalue(L, 2);
|
||||
elua_modlist = eina_list_append(elua_modlist,
|
||||
(void*)(size_t)luaL_ref(L, LUA_REGISTRYINDEX));
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
elua_register_require(lua_State *L)
|
||||
{
|
||||
|
@ -279,17 +261,8 @@ elua_doscript(Elua_State *es, int argc, char **argv, int n, int *quit)
|
|||
void
|
||||
elua_bin_shutdown(Elua_State *es, int c)
|
||||
{
|
||||
void *data;
|
||||
INF("elua shutdown");
|
||||
|
||||
if (es) EINA_LIST_FREE(elua_modlist, data)
|
||||
{
|
||||
lua_rawgeti(elua_state_lua_state_get(es), LUA_REGISTRYINDEX, (size_t)data);
|
||||
lua_call(elua_state_lua_state_get(es), 0, 0);
|
||||
}
|
||||
|
||||
if (elua_prefix) eina_prefix_free(elua_prefix);
|
||||
|
||||
if (es) elua_state_free(es);
|
||||
if (_el_log_domain != EINA_LOG_DOMAIN_GLOBAL)
|
||||
eina_log_domain_unregister(_el_log_domain);
|
||||
|
@ -307,7 +280,7 @@ struct Main_Data
|
|||
|
||||
const luaL_reg cutillib[] =
|
||||
{
|
||||
{ "init_module", elua_init_module },
|
||||
{ "init_module", elua_module_init },
|
||||
{ "popenv" , elua_io_popen },
|
||||
{ NULL , NULL }
|
||||
};
|
||||
|
|
|
@ -87,6 +87,7 @@ EAPI int elua_io_loadfile(const Elua_State *es, const char *fname);
|
|||
EAPI void elua_io_register(const Elua_State *es);
|
||||
|
||||
EAPI int elua_io_popen(lua_State *L);
|
||||
EAPI int elua_module_init(lua_State *L);
|
||||
|
||||
#endif
|
||||
|
||||
|
|
|
@ -81,7 +81,18 @@ EAPI void
|
|||
elua_state_free(Elua_State *es)
|
||||
{
|
||||
if (!es) return;
|
||||
if (es->luastate) lua_close(es->luastate);
|
||||
if (es->luastate)
|
||||
{
|
||||
void *data;
|
||||
EINA_LIST_FREE(es->cmods, data)
|
||||
{
|
||||
lua_rawgeti(es->luastate, LUA_REGISTRYINDEX, (size_t)data);
|
||||
lua_call(es->luastate, 0, 0);
|
||||
}
|
||||
lua_close(es->luastate);
|
||||
}
|
||||
else if (es->cmods)
|
||||
eina_list_free(es->cmods);
|
||||
eina_stringshare_del(es->coredir);
|
||||
eina_stringshare_del(es->moddir);
|
||||
eina_stringshare_del(es->appsdir);
|
||||
|
@ -211,3 +222,21 @@ elua_state_setup_i18n(const Elua_State *es)
|
|||
lua_setfield(es->luastate, -2, "dngettext");
|
||||
#endif
|
||||
}
|
||||
|
||||
EAPI int
|
||||
elua_module_init(lua_State *L)
|
||||
{
|
||||
Elua_State *es = elua_state_from_lua_get(L);
|
||||
if (!lua_isnoneornil(L, 1))
|
||||
{
|
||||
lua_pushvalue(L, 1);
|
||||
lua_call(L, 0, 0);
|
||||
}
|
||||
if (!lua_isnoneornil(L, 2))
|
||||
{
|
||||
lua_pushvalue(L, 2);
|
||||
es->cmods = eina_list_append(es->cmods,
|
||||
(void*)(size_t)luaL_ref(L, LUA_REGISTRYINDEX));
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -33,6 +33,7 @@ struct _Elua_State
|
|||
Eina_Stringshare *coredir;
|
||||
Eina_Stringshare *moddir;
|
||||
Eina_Stringshare *appsdir;
|
||||
Eina_List *cmods;
|
||||
};
|
||||
|
||||
extern int _elua_log_dom;
|
||||
|
|
Loading…
Reference in New Issue