From: Daniel Kolesa Date: Thu, 9 Apr 2015 15:12:15 +0000 (+0100) Subject: elua lib: manage bound modules within Elua_State X-Git-Tag: v1.15.0-alpha1~752^2~69 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=329fae97b0a1190b4a5c9349fb9a9aebbeb4f6c7;p=platform%2Fupstream%2Fefl.git elua lib: manage bound modules within Elua_State --- diff --git a/src/bin/elua/main.c b/src/bin/elua/main.c index d3655df..44113c3 100644 --- a/src/bin/elua/main.c +++ b/src/bin/elua/main.c @@ -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; @@ -106,23 +105,6 @@ elua_getargs(Elua_State *es, int argc, char **argv, int n) } 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) { const char *corepath = elua_state_core_dir_get(elua_state); @@ -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 } }; diff --git a/src/lib/elua/Elua.h b/src/lib/elua/Elua.h index 0b452cf..b72ada5 100644 --- a/src/lib/elua/Elua.h +++ b/src/lib/elua/Elua.h @@ -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 diff --git a/src/lib/elua/elua.c b/src/lib/elua/elua.c index f14dc29..3ab2448 100644 --- a/src/lib/elua/elua.c +++ b/src/lib/elua/elua.c @@ -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; +} diff --git a/src/lib/elua/elua_private.h b/src/lib/elua/elua_private.h index 5c63488..722d3f2 100644 --- a/src/lib/elua/elua_private.h +++ b/src/lib/elua/elua_private.h @@ -33,6 +33,7 @@ struct _Elua_State Eina_Stringshare *coredir; Eina_Stringshare *moddir; Eina_Stringshare *appsdir; + Eina_List *cmods; }; extern int _elua_log_dom;